Path.h revision affc150dc44fab1911775a49636d0ce85333b634
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Path.h -------------------------------------------------------------===// 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// This file declares the mcld::sys::fs:: namespace. It follows TR2/boost 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// filesystem (v3), but modified to remove exception handling and the 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// path class. 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_PATH_H 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_PATH_H 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/raw_ostream.h> 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Config/Config.h> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <iosfwd> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <functional> 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace sys { 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace fs { 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(MCLD_ON_WIN32) 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst wchar_t separator = L'\\'; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst wchar_t preferred_separator = L'\\'; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst char separator = '/'; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst char preferred_separator = '/'; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class Path 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Path provides an abstraction for the path to a file or directory in 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * the operating system's filesystem. 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * FIXME: current Path library only support UTF-8 chararcter set. 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Path 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(MCLD_ON_WIN32) 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef wchar_t ValueType; 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef char ValueType; 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::basic_string<ValueType> StringType; 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(); 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const ValueType* s); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const StringType &s); 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const Path& pCopy); 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~Path(); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- assignments ----- // 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template <class InputIterator> 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(InputIterator begin, InputIterator end); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(const StringType &s); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(const ValueType* s, unsigned int length); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- appends ----- // 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template <class InputIterator> 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& append(InputIterator begin, InputIterator end); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& append(const Path& pPath); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFromRoot() const; 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFromPWD() const; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const StringType &native() const 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_PathName; } 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType &native() 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_PathName; } 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ValueType* c_str() const 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_PathName.c_str(); } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string string() const; 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- decomposition ----- // 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path stem() const; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path extension() const; 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- generic form observers ----- // 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType generic_string() const; 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool canonicalize(); 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType::size_type m_append_separator_if_needed(); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void m_erase_redundant_separator(StringType::size_type sep_pos); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType m_PathName; 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator==(const Path& pLHS,const Path& pRHS); 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator!=(const Path& pLHS,const Path& pRHS); 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------// 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// non-member functions // 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------// 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// is_separator - is the given character a separator of a path. 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// @param value a character 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// @result true if \a value is a path separator character on the host OS 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//bool status_known(FileStatus f) { return f.type() != StatusError; } 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_separator(char value); 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool exists(const Path &pPath); 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_directory(const Path &pPath); 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::ostream &operator<<(std::ostream& pOS, const Path& pPath); 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::istream &operator>>(std::istream& pOS, Path& pPath); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaollvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Path &pPath); 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------------------// 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// class path member template implementation // 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------------------// 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate <class InputIterator> 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::assign(InputIterator begin, InputIterator end) 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.clear(); 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (begin != end) 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.append<InputIterator>(begin, end); 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate <class InputIterator> 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::append(InputIterator begin, InputIterator end) 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (begin == end) 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType::size_type sep_pos(m_append_separator_if_needed()); 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.append<InputIterator>(begin, end); 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (sep_pos) 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_erase_redundant_separator(sep_pos); 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of fs 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of sys 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//-------------------------------------------------------------------------// 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// STL compatible functions // 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//-------------------------------------------------------------------------// 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace std { 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<> 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct less<mcld::sys::fs::Path> : public binary_function<mcld::sys::fs::Path, 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao mcld::sys::fs::Path, 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool> 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool operator() (const mcld::sys::fs::Path& pX,const mcld::sys::fs::Path& pY) const { 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pX.generic_string().size() < pY.generic_string().size()) 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pX.generic_string() < pY.generic_string()); 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of std 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 181