- access dir/.. either. Strip out dir/.. We know dir
- isn't `.' because we've rid ourselves of `.' path
- components above. */
- dest = p - 1;
- while (dest != result && IS_DIR_SEPARATOR (*dest))
- --dest;
- while (dest != result && IS_DIR_SEPARATOR (dest[-1]))
- --dest;
- /* Don't strip leading `/'. */
- while (IS_DIR_SEPARATOR (*dest))
- ++dest;
+ access dir/.. either. Strip out `dir/../'. If `dir'
+ turns out to be `.', strip one more path component. */
+ dest = p;
+ do
+ {
+ --dest;
+ while (dest != result && IS_DIR_SEPARATOR (*dest))
+ --dest;
+ while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
+ --dest;
+ }
+ while (dest != result && *dest == '.');
+ /* If we have something like `./..' or `/..', don't
+ strip anything more. */
+ if (*dest == '.' || IS_DIR_SEPARATOR (*dest))
+ {
+ *p = '.';
+ break;
+ }