is_extension_executable: simplify

Simplify method of determining search position of the extension.
This commit is contained in:
erw7
2019-01-28 15:33:51 +09:00
committed by Justin M. Keyes
parent 70ac7c876b
commit 692b83fc92

View File

@@ -282,11 +282,11 @@ static const char *get_pathext(void)
return pathext; return pathext;
} }
/// Returns true if extension of `name` is executable file exteinsion. /// Returns true if extension of `name` is executable file extension.
static bool is_extension_executable(const char *name) static bool is_extension_executable(const char *name)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
// Don't check extensions, when a Unix-shell like 'shell'. // Don't check extension for Unix-style 'shell'.
const char_u *shell_end = p_sh + STRLEN(p_sh); const char_u *shell_end = p_sh + STRLEN(p_sh);
while (true) { while (true) {
if (*shell_end == '.') { if (*shell_end == '.') {
@@ -303,31 +303,21 @@ static bool is_extension_executable(const char *name)
} }
const char *pathext = get_pathext(); const char *pathext = get_pathext();
const char *ext_pos = name + STRLEN(name) - 1;
while (name != ext_pos) {
if (*ext_pos == '\\' || *ext_pos == '/') {
ext_pos = name;
break;
}
if (*ext_pos == '.') {
break;
}
ext_pos--;
}
const char *cur_pos = pathext; const char *cur_pos = pathext;
while (true) { while (true) {
// Don't check extension, if $PATHEXT contain dot itself. // Don't check extension if $PATHEXT itself contains dot.
if (*cur_pos == '.' if (*cur_pos == '.'
&& (*(cur_pos + 1) == ENV_SEPCHAR || *(cur_pos + 1) == NUL)) { && (*(cur_pos + 1) == ENV_SEPCHAR || *(cur_pos + 1) == NUL)) {
return true; return true;
} }
const char *ext_end = strchr(cur_pos, ENV_SEPCHAR); const char *ext_end = strchr(cur_pos, ENV_SEPCHAR);
size_t ext_len = ext_end ? size_t ext_len = ext_end
(size_t)(ext_end - cur_pos) : ? (size_t)(ext_end - cur_pos)
(STRLEN(pathext) - (size_t)(cur_pos - pathext)); : (strlen(pathext) - (size_t)(cur_pos - pathext));
if (ext_pos != name && mb_strnicmp((const char_u *)ext_pos, size_t name_len = STRLEN(name);
(const char_u *)cur_pos, ext_len) == 0) { if (name_len > ext_len && mb_strnicmp(
(char_u *)(name + name_len - ext_len),
(char_u *)cur_pos, ext_len) == 0) {
return true; return true;
} }
if (ext_end == NULL) { if (ext_end == NULL) {