text: // Copyright 2016 The Fuchsia Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef LIB_FXL_FILES_PATH_H_
  #define LIB_FXL_FILES_PATH_H_
  
  #include <string>
  
  namespace files {
  
  // Resolves ".." and "." components of the path syntactically without consulting
  // the file system.
  std::string SimplifyPath(std::string path);
  
  // Returns the absolute path of a possibly relative path.
  // It doesn't consult the filesystem or simplify the path.
  std::string AbsolutePath(const std::string& path);
  
  // Returns the directory name component of the given path.
  std::string GetDirectoryName(const std::string& path);
  
  // Returns the basename component of the given path by stripping everything up
  // to and including the last slash.
  std::string GetBaseName(const std::string& path);
  
  // Delete the file or directory at the given path. If recursive is true, and
  // path is a directory, also delete the directory's content.
  bool DeletePath(const std::string& path, bool recursive);
  
  // Delete the file or directory at the given path. If recursive is true, and
  // path is a directory, also delete the directory's content. If |path| is
  // relative, resolve it with |root_fd| as reference. See |openat(2)|.
  bool DeletePathAt(int root_fd, const std::string& path, bool recursive);
  
  // Joins two paths together.
  // Regardless if |path1| has a trailing '/' or |path2| has a leading '/', there
  // will be only one '/' in-between in the joined path.
  // Note that if either path is "" then the other path is returned unchanged.
  //
  // JoinPath("/foo",   "bar") -> "/foo/bar"
  // JoinPath("/foo",  "/bar") -> "/foo/bar"
  // JoinPath("/foo/",  "bar") -> "/foo/bar"
  // JoinPath("/foo/", "/bar") -> "/foo/bar"
  //
  // JoinPath("",      "") -> ""
  // JoinPath("",  "/foo") -> "/foo"
  // JoinPath("",   "foo") -> "foo"
  // JoinPath("/foo",  "") -> "/foo"
  // JoinPath("foo",   "") -> "foo"
  // JoinPath("/foo/", "") -> "/foo/"
  // JoinPath("foo/",  "") -> "foo/"
  std::string JoinPath(const std::string& path1, const std::string& path2);
  
  }  // namespace files
  
  #endif  // LIB_FXL_FILES_PATH_H_
  