1e6f26e874e0ff32fe429605fded5a2e35e4e7179Michael J. Spencer//===- llvm/Support/PathV2.h - Path Operating System Concept ----*- C++ -*-===// 2f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// 3f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// The LLVM Compiler Infrastructure 4f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// 5f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// This file is distributed under the University of Illinois Open Source 6f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// License. See LICENSE.TXT for details. 7f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// 8f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer//===----------------------------------------------------------------------===// 9f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// 105a7df60619d88a2c804b0dbdf68b0b502941bba3Michael J. Spencer// This file declares the llvm::sys::path namespace. It is designed after 11f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// TR2/boost filesystem (v3), but modified to remove exception handling and the 12f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// path class. 13f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer// 14f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer//===----------------------------------------------------------------------===// 15f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 165a7df60619d88a2c804b0dbdf68b0b502941bba3Michael J. Spencer#ifndef LLVM_SUPPORT_PATHV2_H 175a7df60619d88a2c804b0dbdf68b0b502941bba3Michael J. Spencer#define LLVM_SUPPORT_PATHV2_H 18dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 19f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer#include "llvm/ADT/SmallString.h" 20ace996943a7d586c1ed42e550cb431c72143d6b3Michael J. Spencer#include "llvm/ADT/Twine.h" 211f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 22f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer#include <iterator> 23f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 24f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencernamespace llvm { 25f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencernamespace sys { 26f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencernamespace path { 27f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 28f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @name Lexical Component Iterator 29f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @{ 30f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 31f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Path iterator. 32f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 33f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// This is a bidirectional iterator that iterates over the individual 34f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// components in \a path. The forward traversal order is as follows: 35f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// * The root-name element, if present. 36f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// * The root-directory element, if present. 37f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// * Each successive filename element, if present. 38f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// * Dot, if one or more trailing non-root slash characters are present. 39f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// The backwards traversal order is the reverse of forward traversal. 40f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 41f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// Iteration examples. Each component is separated by ',': 42f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// / => / 43f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo => /,foo 44f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// foo/ => foo,. 45f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar => /,foo,bar 46f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// ../ => ..,. 47f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// C:\foo\bar => C:,/,foo,bar 48f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 49f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencerclass const_iterator { 5077592fe39c404f3c48b06fae48b965058b3a5ee8Dmitri Gribenko StringRef Path; ///< The entire path. 5177592fe39c404f3c48b06fae48b965058b3a5ee8Dmitri Gribenko StringRef Component; ///< The current component. Not necessarily in Path. 5277592fe39c404f3c48b06fae48b965058b3a5ee8Dmitri Gribenko size_t Position; ///< The iterators current position within Path. 53dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 54dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer // An end iterator has Position = Path.size() + 1. 55d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramer friend const_iterator begin(StringRef path); 56d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramer friend const_iterator end(StringRef path); 57f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 58f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencerpublic: 59f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer typedef const StringRef value_type; 60dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer typedef ptrdiff_t difference_type; 61f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer typedef value_type &reference; 62f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer typedef value_type *pointer; 63f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer typedef std::bidirectional_iterator_tag iterator_category; 64dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 65a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer reference operator*() const { return Component; } 66a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer pointer operator->() const { return &Component; } 67f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer const_iterator &operator++(); // preincrement 68f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer const_iterator &operator++(int); // postincrement 69f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer const_iterator &operator--(); // predecrement 70f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer const_iterator &operator--(int); // postdecrement 71f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer bool operator==(const const_iterator &RHS) const; 72f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer bool operator!=(const const_iterator &RHS) const; 73a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer 74a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer /// @brief Difference in bytes between this and RHS. 75a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer ptrdiff_t operator-(const const_iterator &RHS) const; 76f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer}; 77f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 78a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencertypedef std::reverse_iterator<const_iterator> reverse_iterator; 79a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer 80dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @brief Get begin iterator over \a path. 81dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @param path Input path. 82dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @returns Iterator initialized with the first component of \a path. 83d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst_iterator begin(StringRef path); 84dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 85dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @brief Get end iterator over \a path. 86dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @param path Input path. 87dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer/// @returns Iterator initialized to the end of \a path. 88d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst_iterator end(StringRef path); 89dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 90a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @brief Get reverse begin iterator over \a path. 91a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @param path Input path. 92a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @returns Iterator initialized with the first reverse component of \a path. 93d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerinline reverse_iterator rbegin(StringRef path) { 94a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer return reverse_iterator(end(path)); 95a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer} 96a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer 97a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @brief Get reverse end iterator over \a path. 98a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @param path Input path. 99a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer/// @returns Iterator initialized to the reverse end of \a path. 100d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerinline reverse_iterator rend(StringRef path) { 101a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer return reverse_iterator(begin(path)); 102a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer} 103a42cf73c779fe4210cedce0a7a0b2ada2085b55bMichael J. Spencer 104f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @} 105f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @name Lexical Modifiers 106f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @{ 107f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 108ad8a14f24eb3daee61c8076ff6e5a8135f4dd124Michael J. Spencer/// @brief Remove the last component from \a path unless it is the root dir. 109f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 110f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// directory/filename.cpp => directory/ 111dbfb56bebdb279a2a94096a821d3b7d3345962c2Michael J. Spencer/// directory/ => directory 112ad8a14f24eb3daee61c8076ff6e5a8135f4dd124Michael J. Spencer/// / => / 113f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 114f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path A path that is modified to not have a file component. 115936671b2eaa0a6b27903f8d85a8f4b28fcf8ee84Michael J. Spencervoid remove_filename(SmallVectorImpl<char> &path); 116f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 117f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Replace the file extension of \a path with \a extension. 118f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 119f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// ./filename.cpp => ./filename.extension 120f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// ./filename => ./filename.extension 121ad8a14f24eb3daee61c8076ff6e5a8135f4dd124Michael J. Spencer/// ./ => ./.extension 122f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 123f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path A path that has its extension replaced with \a extension. 124f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param extension The extension to be added. It may be empty. It may also 125f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// optionally start with a '.', if it does not, one will be 126f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// prepended. 1275029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencervoid replace_extension(SmallVectorImpl<char> &path, const Twine &extension); 128f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 129f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Append to path. 130f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 131f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo + bar/f => /foo/bar/f 132f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/ + bar/f => /foo/bar/f 133f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// foo + bar/f => foo/bar/f 134f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 135f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Set to \a path + \a component. 136a00b80b04c5edb08639c1c6b32e9231fd8b066f7Dmitri Gribenko/// @param a The component to be appended to \a path. 137936671b2eaa0a6b27903f8d85a8f4b28fcf8ee84Michael J. Spencervoid append(SmallVectorImpl<char> &path, const Twine &a, 1385029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer const Twine &b = "", 1395029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer const Twine &c = "", 1405029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer const Twine &d = ""); 141f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 142f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Append to path. 143f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 144f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo + [bar,f] => /foo/bar/f 145f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/ + [bar,f] => /foo/bar/f 146f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// foo + [bar,f] => foo/bar/f 147f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 148f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Set to \a path + [\a begin, \a end). 149f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param begin Start of components to append. 150f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param end One past the end of components to append. 151936671b2eaa0a6b27903f8d85a8f4b28fcf8ee84Michael J. Spencervoid append(SmallVectorImpl<char> &path, 1525029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer const_iterator begin, const_iterator end); 153f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 154f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @} 155f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @name Transforms (or some other better name) 156f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @{ 157f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 158f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// Convert path to the native form. This is used to give paths to users and 159f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// operating system calls in the platform's normal way. For example, on Windows 160f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// all '/' are converted to '\'. 161f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 162f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path A path that is transformed to native format. 163f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param result Holds the result of the transformation. 164936671b2eaa0a6b27903f8d85a8f4b28fcf8ee84Michael J. Spencervoid native(const Twine &path, SmallVectorImpl<char> &result); 165f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 166f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @} 167f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @name Lexical Observers 168f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @{ 169f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 170f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get root name. 171f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 172f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// //net/hello => //net 173f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// c:/hello => c: (on Windows, on other platforms nothing) 174f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /hello => <empty> 175f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 176f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 1775029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The root name of \a path if it has one, otherwise "". 178d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef root_name(StringRef path); 179f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 180f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get root directory. 181f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 182f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /goo/hello => / 183f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// c:/hello => / 184f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// d/file.txt => <empty> 185f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 186f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 1875029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The root directory of \a path if it has one, otherwise 188f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// "". 189d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef root_directory(StringRef path); 19055cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor 191f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get root path. 192f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 193f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// Equivalent to root_name + root_directory. 194f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 195f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 1965029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The root path of \a path if it has one, otherwise "". 197d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef root_path(StringRef path); 198f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 199f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get relative path. 200f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 201f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// C:\hello\world => hello\world 202f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// foo/bar => foo/bar 203f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar => foo/bar 204f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 205f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2065029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The path starting after root_path if one exists, otherwise "". 207d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef relative_path(StringRef path); 208f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 209f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get parent path. 210f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 211f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// / => <empty> 212f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo => / 213f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// foo/../bar => foo/.. 214f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 215f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2165029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The parent path of \a path if one exists, otherwise "". 217d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef parent_path(StringRef path); 218f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 219f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get filename. 220f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 221f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo.txt => foo.txt 222f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// . => . 223f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// .. => .. 224f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// / => / 225f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 226f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2275029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The filename part of \a path. This is defined as the last component 2285029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// of \a path. 229d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef filename(StringRef path); 230f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 231f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get stem. 232f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 233f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// If filename contains a dot but not solely one or two dots, result is the 234f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// substring of filename ending at (but not including) the last dot. Otherwise 235f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// it is filename. 236f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 237f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar.txt => bar 238f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar => bar 239f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/.txt => <empty> 240f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/. => . 241f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/.. => .. 242f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 243f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2445029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The stem of \a path. 245d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef stem(StringRef path); 246f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 247f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Get extension. 248f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 249f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// If filename contains a dot but not solely one or two dots, result is the 250f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// substring of filename starting at (and including) the last dot, and ending 251f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// at the end of \a path. Otherwise "". 252f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 253f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar.txt => .txt 254f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/bar => <empty> 255f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// /foo/.txt => .txt 256f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 257f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2585029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result The extension of \a path. 259d53f3c864bf94d158a2ae677fe92fd41afaec2f3Benjamin Kramerconst StringRef extension(StringRef path); 260f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 26163cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wan/// @brief Check whether the given char is a path separator on the host OS. 26263cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wan/// 26363cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wan/// @param value a character 26463cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wan/// @result true if \a value is a path separator character on the host OS 26563cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wanbool is_separator(char value); 26663cc3a85cc10093f83f76ea9192f77929b58569eZhanyong Wan 26755cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor/// @brief Get the typical temporary directory for the system, e.g., 26855cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor/// "/var/tmp" or "C:/TEMP" 26955cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor/// 27055cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor/// @param erasedOnReboot Whether to favor a path that is erased on reboot 271d26d6b68dd5ad6cea00331182d70432e4bac3393Douglas Gregor/// rather than one that potentially persists longer. This parameter will be 272d26d6b68dd5ad6cea00331182d70432e4bac3393Douglas Gregor/// ignored if the user or system has set the typical environment variable 273d26d6b68dd5ad6cea00331182d70432e4bac3393Douglas Gregor/// (e.g., TEMP on Windows, TMPDIR on *nix) to specify a temporary directory. 274d26d6b68dd5ad6cea00331182d70432e4bac3393Douglas Gregor/// 275a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek/// @param result Holds the resulting path name. 27655cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregorvoid system_temp_directory(bool erasedOnReboot, SmallVectorImpl<char> &result); 27755cf815e19691d8a1cda40a331943ebfee9d7255Douglas Gregor 278f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has root name? 279f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 280f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// root_name != "" 281f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 282f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2835029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a root name, false otherwise. 28412ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_root_name(const Twine &path); 285f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 286f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has root directory? 287f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 288f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// root_directory != "" 289f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 290f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2915029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a root directory, false otherwise. 29212ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_root_directory(const Twine &path); 293f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 294f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has root path? 295f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 296f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// root_path != "" 297f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 298f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 2995029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a root path, false otherwise. 30012ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_root_path(const Twine &path); 301f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 302f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has relative path? 303f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 304f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// relative_path != "" 305f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 306f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3075029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a relative path, false otherwise. 30812ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_relative_path(const Twine &path); 309f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 310f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has parent path? 311f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 312f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// parent_path != "" 313f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 314f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3155029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a parent path, false otherwise. 31612ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_parent_path(const Twine &path); 317f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 318f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has filename? 319f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 320f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// filename != "" 321f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 322f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3235029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a filename, false otherwise. 32412ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_filename(const Twine &path); 325f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 326f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has stem? 327f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 328f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// stem != "" 329f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 330f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3315029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a stem, false otherwise. 33212ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_stem(const Twine &path); 333f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 334f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Has extension? 335f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 336f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// extension != "" 337f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 338f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3395029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path has a extension, false otherwise. 34012ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool has_extension(const Twine &path); 341f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 342f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Is path absolute? 343f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 344f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3455029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path is absolute, false if it is not. 34612ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool is_absolute(const Twine &path); 347f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 348f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @brief Is path relative? 349f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// 350f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer/// @param path Input path. 3515029159fbe7c267c9322fc6c38064e9ab2ce91bcMichael J. Spencer/// @result True if the path is relative, false if it is not. 35212ccf67457cddc7841bd23bae342994a21d25eb0Michael J. Spencerbool is_relative(const Twine &path); 353f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer 354f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer} // end namespace path 355f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer} // end namespace sys 356f9100d44aa32925e266bd1cd44e932c9649b794dMichael J. Spencer} // end namespace llvm 357dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer 358dffde9964480f946d4308ce936b667b6c37b1059Michael J. Spencer#endif 359