aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.
*/