Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@blender.org>2021-09-27 16:22:53 +0300
committerSybren A. Stüvel <sybren@blender.org>2021-09-27 19:10:47 +0300
commitaafbe111fc90876d801135f0dc5e01e9742f647a (patch)
treeecaa944881ec81c7dc0b4a134270b283238676a9 /source/blender/blenlib/intern/path_util.c
parent6578db57cd878a94bdbdabe953c8819625c5a811 (diff)
BLI Path: add function `BLI_path_contains()`
Add function `BLI_path_contains(container, containee)` that returns true if and only `container` contains `containee`. Paths are normalised and converted to native path separators before comparing. Relative paths are *not* made absolute, to simplify the function call; if this is necessary the caller has to do this conversion first.
Diffstat (limited to 'source/blender/blenlib/intern/path_util.c')
-rw-r--r--source/blender/blenlib/intern/path_util.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 4d0678035ba..4fc59e6cffd 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -1935,6 +1935,34 @@ bool BLI_path_name_at_index(const char *__restrict path,
return false;
}
+bool BLI_path_contains(const char *container_path, const char *containee_path)
+{
+ char container_native[PATH_MAX];
+ char containee_native[PATH_MAX];
+
+ /* Keep space for a trailing slash. If the path is truncated by this, the containee path is
+ * longer than PATH_MAX and the result is ill-defined. */
+ BLI_strncpy(container_native, container_path, PATH_MAX - 1);
+ BLI_strncpy(containee_native, containee_path, PATH_MAX);
+
+ BLI_path_slash_native(container_native);
+ BLI_path_slash_native(containee_native);
+
+ BLI_path_normalize(NULL, container_native);
+ BLI_path_normalize(NULL, containee_native);
+
+ if (STREQ(container_native, containee_native)) {
+ /* The paths are equal, they contain each other. */
+ return true;
+ }
+
+ /* Add a trailing slash to prevent same-prefix directories from matching.
+ * e.g. "/some/path" doesn't contain "/some/pathlib". */
+ BLI_path_slash_ensure(container_native);
+
+ return BLI_str_startswith(containee_native, container_native);
+}
+
/**
* Returns pointer to the leftmost path separator in string. Not actually used anywhere.
*/