aboutsummaryrefslogtreecommitdiffstats
path: root/src/fs
diff options
context:
space:
mode:
authorDenis Krjuchkov <denis@crazydev.net>2013-12-03 13:46:05 +0600
committerDenis Krjuchkov <denis@crazydev.net>2013-12-03 13:46:05 +0600
commit96413b16046f2edbb53ab7abcca73809f6cb3a54 (patch)
tree46c57b005ab97c28f1bb3a54cad8c7df11421797 /src/fs
parent2278fe42e55bbc713ccd2a45736a9eb9369afd36 (diff)
downloadmpd-96413b16046f2edbb53ab7abcca73809f6cb3a54.tar.gz
mpd-96413b16046f2edbb53ab7abcca73809f6cb3a54.tar.xz
mpd-96413b16046f2edbb53ab7abcca73809f6cb3a54.zip
fs/Traits.hxx: implement BuildFS() method
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/Traits.cxx25
-rw-r--r--src/fs/Traits.hxx10
2 files changed, 35 insertions, 0 deletions
diff --git a/src/fs/Traits.cxx b/src/fs/Traits.cxx
index 2c3ce075b..aaf0a59e1 100644
--- a/src/fs/Traits.cxx
+++ b/src/fs/Traits.cxx
@@ -22,6 +22,31 @@
#include <string.h>
+PathTraits::string
+PathTraits::BuildFS(PathTraits::const_pointer a, size_t a_size,
+ PathTraits::const_pointer b, size_t b_size)
+{
+ assert(a != nullptr);
+ assert(b != nullptr);
+
+ if (a_size == 0)
+ return string(b, b_size);
+ if (b_size == 0)
+ return string(a, a_size);
+
+ string result(a, a_size);
+
+ if (!IsSeparatorFS(a[a_size - 1]))
+ result.push_back(SEPARATOR_FS);
+
+ if (IsSeparatorFS(b[0]))
+ result.append(b + 1, b_size - 1);
+ else
+ result.append(b, b_size);
+
+ return result;
+}
+
const char *
PathTraits::GetBaseUTF8(const char *p)
{
diff --git a/src/fs/Traits.hxx b/src/fs/Traits.hxx
index c72f9814a..4eb0f24b9 100644
--- a/src/fs/Traits.hxx
+++ b/src/fs/Traits.hxx
@@ -87,6 +87,16 @@ struct PathTraits {
}
/**
+ * Constructs the path from the given components.
+ * If either of the components is empty string,
+ * remaining component is returned unchanged.
+ * If both components are empty strings, empty string is returned.
+ */
+ gcc_pure gcc_nonnull_all
+ static string BuildFS(const_pointer a, size_t a_size,
+ const_pointer b, size_t b_size);
+
+ /**
* Determine the "base" file name of the given UTF-8 path.
* The return value points inside the given string.
*/