diff --git a/src/path.c b/src/path.c index ff2031a..622ac43 100644 --- a/src/path.c +++ b/src/path.c @@ -68,6 +68,20 @@ int is_dir(const char *path) { return 0; } +int path_isparent(const char *path, const char *parent) { + + if (*path++ != '/' || *parent++ != '/') + return 0; + + while(*path) { + if (*parent == '\0') + return *path == '/' || *(path-1) == '/'; + if (*path++ != *parent++) + break; + } + return 0; +} + const char* dirname_s(const char *path, int slash) { static strbuf_t sb = STRBUF_INIT; diff --git a/src/path.h b/src/path.h index 89fe809..6dbbccf 100644 --- a/src/path.h +++ b/src/path.h @@ -20,6 +20,8 @@ int is_file(const char *path); int is_dir(const char *path); +int path_isparent(const char *path, const char *parent); + const char* dirname_s(const char *path, int slash); const char* mkpath(const char *fmt, ...); diff --git a/test/t_path.c b/test/t_path.c index 3601b18..e488f8b 100644 --- a/test/t_path.c +++ b/test/t_path.c @@ -117,6 +117,15 @@ void test_dirname() { assert_string(dirname_s(data[i][0], 0), data[i][1]); } +void test_path_isparent() { + + assert(path_isparent("/dir1/dir2/", "/dir1/") != 0); + assert(path_isparent("/dir1/dir2/", "/dir1") != 0); + assert(path_isparent("/dir1/dir2/", "/dir") == 0); + assert(path_isparent("/dir1/dir2/", "/dir1/dir2/sub/") == 0); + assert(path_isparent("/dir1/dir2/", "/var/") == 0); +} + int main(int argc, char *argv[]) { test_isabspath(); @@ -126,6 +135,7 @@ int main(int argc, char *argv[]) { test_mkpath(); test_basename(); test_dirname(); + test_path_isparent(); return 0; }