Am 11.09.2013 05:19, schrieb Jiang Xin: > I tested 'relative_path' function using 'test-path-utils', and got the > following result: > > $ ./test-path-utils relative_path 'C:/a/b' 'D:/x/y' > ../../../C:/a/b > > $ ./test-path-utils relative_path '/a/b' 'x/y' > ../..//a/b > > $ ./test-path-utils relative_path 'a/b' '/x/y' > ../../../a/b > > For the first case, in and prefix are on different ROOT, and for the other > two cases, one path is a relative path, and another is an absolute path. > > I write a patch to test whether two paths (in and prefix) have the same > root. The result after applied the patch: > > $ ./test-path-utils relative_path 'C:/a/b' 'C:/x/y' > ../../a/b > > $ ./test-path-utils relative_path 'C:/a/b' 'D:/x/y' > C:/a/b > > $ ./test-path-utils relative_path '/a/b' 'x/y' > /a/b > > $ ./test-path-utils relative_path 'a/b' '/x/y' > a/b > > > diff --git a/path.c b/path.c > index 7f3324a..51f5d28 100644 > --- a/path.c > +++ b/path.c > @@ -441,6 +441,25 @@ int adjust_shared_perm(const char *path) > return 0; > } > > +static int have_same_root(const char *path1, const char *path2) > +{ > + /* for POSIX: > + > + return ((path1 && is_dir_sep(*path1)) ^ > + (path2 && is_dir_sep(*path2))) == 0; > + */ > + return path1 && path2 && *path1 && *path2 && ( > + (is_dir_sep(*path1) && > + is_dir_sep(*path2)) || > + (*(path1+1) == ':' && > + *(path2+1) == ':' && > + !strncasecmp(path1, path2, 1)) || > + (!is_dir_sep(*path1) && > + !is_dir_sep(*path2) && > + *(path1+1) != ':' && > + *(path2+1) != ':')); I think this can be simplified to return path1 && path2 && is_absolute_path(path1) && is_absolute_path(path2) && !strncasecmp(path1, path2, 1); which would not mistake a path D:/foo on Unix as an absolute path. > +} -- Hannes -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html