further OS/2 fixes for simplify_path()

This commit is contained in:
tg 2017-10-11 21:49:06 +00:00
parent af61fd186a
commit 2cdd9d77de
1 changed files with 20 additions and 8 deletions

28
misc.c
View File

@ -32,7 +32,7 @@
#include <grp.h>
#endif
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.282 2017/10/11 20:46:14 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.283 2017/10/11 21:49:06 tg Exp $");
#define KSH_CHVT_FLAG
#ifdef MKSH_SMALL
@ -1948,8 +1948,10 @@ make_path(const char *cwd, const char *file,
* .. ..
* ./foo foo
* foo/../../../bar ../../bar
* C:/../foo C:/foo
* C:../foo C:../foo
* C:/foo/../.. C:/
* C:. C:
* C:.. C:..
* C:foo/../../blah C:../blah
*/
void
simplify_path(char *p)
@ -1957,11 +1959,16 @@ simplify_path(char *p)
char *dp, *ip, *sp, *tp;
size_t len;
bool needslash;
#ifdef MKSH_DOSPATH
bool needdot = true;
/* keep drive letter */
if (mksh_drvltr(p))
if (mksh_drvltr(p)) {
p += 2;
needdot = false;
}
#else
#define needdot true
#endif
switch (*p) {
@ -2040,10 +2047,15 @@ simplify_path(char *p)
needslash = true;
/* try next component */
}
if (dp == p)
/* empty path -> dot */
*dp++ = needslash ? '/' : '.';
if (dp == p) {
/* empty path -> dot (or slash, when absolute) */
if (needslash)
*dp++ = '/';
else if (needdot)
*dp++ = '.';
}
*dp = '\0';
#undef needdot
}
void