#ifndef MSP_FS_UTILS_H_
#define MSP_FS_UTILS_H_
+#include "path.h"
+
namespace Msp {
namespace FS {
-class Path;
+/// Extracts the last component of the path.
+std::string basename(const Path &);
+
+/// Removes the last component from the path.
+Path dirname(const Path &);
-struct Filename
-{
- std::string base;
- std::string ext;
-};
+/**
+Returns the base part of a filename. This includes everything up to the last
+dot, but not the dot itself.
+*/
+std::string basepart(const std::string &);
+
+/**
+Returns the extension part of a filename. This includes the last dot and
+everything after it.
+*/
+std::string extpart(const std::string &);
+/**
+Fixes the case of the given path to match files / directories on the
+filesystem.
+*/
Path fix_case(const Path &path);
+/// Reads the contents of a symbolic link
+Path readlink(const Path &path);
+
+/// Resolves all symlinks from a path. Will always return an absolute path.
+Path realpath(const Path &path);
+
/// Removes a file
void unlink(const Path &path);
-Filename splitext(const std::string &);
-int fnmatch(const std::string &, const Path &);
+/// Renames a file. Existing file, if any, is overwritten.
+void rename(const Path &from, const Path &to);
/// Makes a path relative to some base path. That is, base/result==path.
Path relative(const Path &path, const Path &base);
-std::string basename(const std::string &);
-
-inline bool is_windows_drive(const std::string &p)
-{ return (p.size()==2 && ((p[0]>='A' && p[0]<='Z') || (p[0]>='a' && p[0]<='z')) && p[1]==':'); }
-
} // namespace FS
} // namespace Msp