fix mksh_sdirsep() and simplify mksh_vdirsep() on OS/2

mksh_sdirsep() returned a position of a more far directory separator
if '/' and '\' were mixed.

And mksh_sdirsep() returned a position of ':' even if a directory
separator follows. For example, in case of 'x:/', the position of
'/' should be returned not ':'.

mksh_vdirsep() were simplified with mksh_sdirsep().
This commit is contained in:
KO Myung-Hun 2016-11-12 15:06:57 +09:00
parent a2e965cad3
commit cc49df380e
1 changed files with 8 additions and 19 deletions

27
sh.h
View File

@ -2443,26 +2443,15 @@ extern int tty_init_fd(void); /* initialise tty_fd, tty_devtty */
char mksh_cdirsep_c = (c); \
(mksh_cdirsep_c == '/' || mksh_cdirsep_c == '\\'); \
})
#define mksh_sdirsep(s) __extension__({ \
const char *mksh_sdirsep_p = (s); \
const char *mksh_sdirsep_p1 = strchr(mksh_sdirsep_p, '/'); \
const char *mksh_sdirsep_p2 = strchr(mksh_sdirsep_p, '\\'); \
const char *mksh_sdirsep_p3 = \
((ksh_isalphx(mksh_sdirsep_p[0]) && \
mksh_sdirsep_p[1] == ':') \
? (mksh_sdirsep_p + 1) : NULL ); \
mksh_sdirsep_p1 = mksh_sdirsep_p1 > mksh_sdirsep_p2 ? \
mksh_sdirsep_p1 : mksh_sdirsep_p2; \
((char *)(mksh_sdirsep_p1 > mksh_sdirsep_p3 ? \
mksh_sdirsep_p1 : mksh_sdirsep_p3)); \
})
#define mksh_vdirsep(s) __extension__({ \
const char *mksh_vdirsep_p = (s); \
(vstrchr((mksh_vdirsep_p), '/') || \
vstrchr((mksh_vdirsep_p), '\\') || \
(ksh_isalphx(mksh_vdirsep_p[0]) && \
mksh_vdirsep_p[1] == ':')); \
#define mksh_sdirsep(s) __extension__({ \
const char *mksh_sdirsep_s = (s); \
((char *)((ksh_isalphx(mksh_sdirsep_s[0]) && \
mksh_sdirsep_s[1] == ':' && \
!mksh_cdirsep(mksh_sdirsep_s[2])) ? \
(mksh_sdirsep_s + 1) : \
strpbrk(mksh_sdirsep_s, "/\\"))); \
})
#define mksh_vdirsep(s) (mksh_sdirsep((s)) != NULL)
#else
#define binopen2(path,flags) open((path), (flags) | O_BINARY)
#define binopen3(path,flags,mode) open((path), (flags) | O_BINARY, (mode))