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