* dst0..dst is prefix portion, and dst[-1] is '/';
* go up one level.
*/
- dst -= 2; /* go past trailing '/' if any */
- if (dst < dst0)
+ dst--; /* go to trailing '/' */
+ if (dst <= dst0)
return -1;
- while (1) {
- if (dst <= dst0)
- break;
- c = *dst--;
- if (c == '/') { /* MinGW: cannot be '\\' anymore */
- dst += 2;
- break;
- }
- }
+ /* Windows: dst[-1] cannot be backslash anymore */
+ while (dst0 < dst && dst[-1] != '/')
+ dst--;
}
*dst = '\0';
return 0;
. ./test-lib.sh
norm_abs() {
- test_expect_success "normalize absolute" \
- "test \$(test-path-utils normalize_absolute_path '$1') = '$2'"
+ test_expect_success "normalize absolute: $1 => $2" \
+ "test \"\$(test-path-utils normalize_path_copy '$1')\" = '$2'"
}
ancestor() {
- test_expect_success "longest ancestor" \
- "test \$(test-path-utils longest_ancestor_length '$1' '$2') = '$3'"
+ test_expect_success "longest ancestor: $1 $2 => $3" \
+ "test \"\$(test-path-utils longest_ancestor_length '$1' '$2')\" = '$3'"
}
-norm_abs "" /
+norm_abs "" ""
norm_abs / /
norm_abs // /
norm_abs /// /
norm_abs /. /
norm_abs /./ /
-norm_abs /./.. /
-norm_abs /../. /
-norm_abs /./../.// /
+norm_abs /./.. ++failed++
+norm_abs /../. ++failed++
+norm_abs /./../.// ++failed++
norm_abs /dir/.. /
norm_abs /dir/sub/../.. /
+norm_abs /dir/sub/../../.. ++failed++
norm_abs /dir /dir
-norm_abs /dir// /dir
+norm_abs /dir// /dir/
norm_abs /./dir /dir
-norm_abs /dir/. /dir
-norm_abs /dir///./ /dir
-norm_abs /dir//sub/.. /dir
-norm_abs /dir/sub/../ /dir
-norm_abs //dir/sub/../. /dir
-norm_abs /dir/s1/../s2/ /dir/s2
-norm_abs /d1/s1///s2/..//../s3/ /d1/s3
+norm_abs /dir/. /dir/
+norm_abs /dir///./ /dir/
+norm_abs /dir//sub/.. /dir/
+norm_abs /dir/sub/../ /dir/
+norm_abs //dir/sub/../. /dir/
+norm_abs /dir/s1/../s2/ /dir/s2/
+norm_abs /d1/s1///s2/..//../s3/ /d1/s3/
norm_abs /d1/s1//../s2/../../d2 /d2
norm_abs /d1/.../d2 /d1/.../d2
norm_abs /d1/..././../d2 /d1/d2
int main(int argc, char **argv)
{
- if (argc == 3 && !strcmp(argv[1], "normalize_absolute_path")) {
+ if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
char *buf = xmalloc(PATH_MAX + 1);
- int rv = normalize_absolute_path(buf, argv[2]);
- assert(strlen(buf) == rv);
+ int rv = normalize_path_copy(buf, argv[2]);
+ if (rv)
+ buf = "++failed++";
puts(buf);
return 0;
}