diff options
-rw-r--r-- | src/fs/Traits.cxx | 25 | ||||
-rw-r--r-- | src/fs/Traits.hxx | 10 |
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. */ |