diff options
-rw-r--r-- | src/filesystem.c | 10 | ||||
-rw-r--r-- | src/filesystem.h | 9 | ||||
-rw-r--r-- | test/test_filesystem.c | 21 |
3 files changed, 40 insertions, 0 deletions
diff --git a/src/filesystem.c b/src/filesystem.c index 0ec9802..0482336 100644 --- a/src/filesystem.c +++ b/src/filesystem.c @@ -135,6 +135,16 @@ lilv_path_absolute(const char* path) } char* +lilv_path_absolute_child(const char* path, const char* parent) +{ + if (lilv_path_is_absolute(path)) { + return lilv_strdup(path); + } + + return lilv_path_join(parent, path); +} + +char* lilv_path_relative_to(const char* path, const char* base) { const size_t path_len = strlen(path); diff --git a/src/filesystem.h b/src/filesystem.h index 319dd49..f888f5f 100644 --- a/src/filesystem.h +++ b/src/filesystem.h @@ -43,6 +43,15 @@ char* lilv_path_absolute(const char* path); /** + Return `path` as an absolute path relative to `parent`. + + If `path` is absolute, an identical copy of it is returned. Otherwise, the + returned path is relative to `parent`. +*/ +char* +lilv_path_absolute_child(const char* path, const char* parent); + +/** Return `path` relative to `base` if possible. If `path` is not within `base`, a copy is returned. Otherwise, an diff --git a/test/test_filesystem.c b/test/test_filesystem.c index a3288ed..01ca5ae 100644 --- a/test/test_filesystem.c +++ b/test/test_filesystem.c @@ -105,6 +105,26 @@ test_path_absolute(void) } static void +test_path_absolute_child(void) +{ + const char* const parent = "/parent"; + const char* const short_path = "a"; + const char* const long_path = "a/b/c"; + + char* const expected_short = lilv_path_join(parent, short_path); + char* const expected_long = lilv_path_join(parent, long_path); + + assert(equals(lilv_path_absolute_child(short_path, parent), + expected_short)); + + assert(equals(lilv_path_absolute_child(long_path, parent), + expected_long)); + + free(expected_long); + free(expected_short); +} + +static void test_path_relative_to(void) { assert(equals(lilv_path_relative_to("/a/b", "/a/"), "b")); @@ -478,6 +498,7 @@ main(void) test_path_is_child(); test_path_current(); test_path_absolute(); + test_path_absolute_child(); test_path_relative_to(); test_path_parent(); test_path_filename(); |