From 58822cc37b29c5274cff74f63f894217a03b6af3 Mon Sep 17 00:00:00 2001 From: schellap Date: Thu, 3 Mar 2016 01:46:06 -0800 Subject: [PATCH] Fix host case comparison --- src/corehost/cli/args.cpp | 4 ++-- src/corehost/cli/args.h | 2 +- src/corehost/common/pal.h | 5 +++++ src/corehost/common/utils.cpp | 17 ++++++++++------- src/corehost/common/utils.h | 4 ++-- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/corehost/cli/args.cpp b/src/corehost/cli/args.cpp index 4a12b6a33..086d05fab 100644 --- a/src/corehost/cli/args.cpp +++ b/src/corehost/cli/args.cpp @@ -82,9 +82,9 @@ bool parse_arguments(const int argc, const pal::char_t* argv[], arguments_t& arg { auto depsfile_candidate = pal::string_t(args.app_argv[0]); - if (starts_with(depsfile_candidate, s_depsArgPrefix)) + if (starts_with(depsfile_candidate, s_deps_arg_prefix, false)) { - args.deps_path = depsfile_candidate.substr(s_depsArgPrefix.length()); + args.deps_path = depsfile_candidate.substr(s_deps_arg_prefix.length()); if (!pal::realpath(&args.deps_path)) { trace::error(_X("Failed to locate deps file: %s"), args.deps_path.c_str()); diff --git a/src/corehost/cli/args.h b/src/corehost/cli/args.h index ae58058da..d510cd6e8 100644 --- a/src/corehost/cli/args.h +++ b/src/corehost/cli/args.h @@ -8,7 +8,7 @@ #include "pal.h" #include "trace.h" -static const pal::string_t s_depsArgPrefix = _X("--depsfile:"); +static const pal::string_t s_deps_arg_prefix = _X("--depsfile:"); struct arguments_t { diff --git a/src/corehost/common/pal.h b/src/corehost/common/pal.h index dd4deab7a..930104d34 100644 --- a/src/corehost/common/pal.h +++ b/src/corehost/common/pal.h @@ -95,6 +95,9 @@ namespace pal inline int strcmp(const char_t* str1, const char_t* str2) { return ::wcscmp(str1, str2); } inline int strcasecmp(const char_t* str1, const char_t* str2) { return ::_wcsicmp(str1, str2); } + inline int strncmp(const char_t* str1, const char_t* str2, int len) { return ::wcsncmp(str1, str2, len); } + inline int strncasecmp(const char_t* str1, const char_t* str2, int len) { return ::_wcsnicmp(str1, str2, len); } + inline size_t strlen(const char_t* str) { return ::wcslen(str); } inline void err_vprintf(const char_t* format, va_list vl) { ::vfwprintf(stderr, format, vl); ::fputws(_X("\r\n"), stderr); } @@ -125,6 +128,8 @@ namespace pal inline int strcmp(const char_t* str1, const char_t* str2) { return ::strcmp(str1, str2); } inline int strcasecmp(const char_t* str1, const char_t* str2) { return ::strcasecmp(str1, str2); } + inline int strncmp(const char_t* str1, const char_t* str2, int len) { return ::strncmp(str1, str2, len); } + inline int strncasecmp(const char_t* str1, const char_t* str2, int len) { return ::strncasecmp(str1, str2, len); } inline size_t strlen(const char_t* str) { return ::strlen(str); } inline void err_vprintf(const char_t* format, va_list vl) { ::vfprintf(stderr, format, vl); ::fputc('\n', stderr); } inline pal::string_t to_palstring(const std::string& str) { return str; } diff --git a/src/corehost/common/utils.cpp b/src/corehost/common/utils.cpp index 8d4016481..2515b2155 100644 --- a/src/corehost/common/utils.cpp +++ b/src/corehost/common/utils.cpp @@ -12,15 +12,18 @@ bool coreclr_exists_in_dir(const pal::string_t& candidate) return pal::file_exists(test); } -bool ends_with(const pal::string_t& value, const pal::string_t& suffix) +bool ends_with(const pal::string_t& value, const pal::string_t& suffix, bool match_case) { - return suffix.length() <= value.length() && - (0 == value.compare(value.length() - suffix.length(), suffix.length(), suffix)); + auto cmp = match_case ? pal::strcmp : pal::strcasecmp; + return (value.size() >= suffix.size()) && + cmp(value.c_str() + value.size() - suffix.size(), suffix.c_str()) == 0; } -bool starts_with(const pal::string_t& value, const pal::string_t& prefix) +bool starts_with(const pal::string_t& value, const pal::string_t& prefix, bool match_case) { - return value.find(prefix.c_str(), 0, prefix.length()) == 0; + auto cmp = match_case ? pal::strncmp : pal::strncasecmp; + return (value.size() >= prefix.size()) && + cmp(value.c_str(), prefix.c_str(), prefix.size()) == 0; } void append_path(pal::string_t* path1, const pal::char_t* path2) @@ -43,10 +46,10 @@ pal::string_t get_executable(const pal::string_t& filename) { pal::string_t result(filename); - if (ends_with(result, _X(".exe"))) + if (ends_with(result, _X(".exe"), false)) { // We need to strip off the old extension - result.erase(result.length() - 4); + result.erase(result.size() - 4); } return result; diff --git a/src/corehost/common/utils.h b/src/corehost/common/utils.h index 9275c25b4..9d2dc2098 100644 --- a/src/corehost/common/utils.h +++ b/src/corehost/common/utils.h @@ -6,8 +6,8 @@ #include "pal.h" -bool ends_with(const pal::string_t& value, const pal::string_t& suffix); -bool starts_with(const pal::string_t& value, const pal::string_t& prefix); +bool ends_with(const pal::string_t& value, const pal::string_t& suffix, bool match_case); +bool starts_with(const pal::string_t& value, const pal::string_t& prefix, bool match_case); pal::string_t get_executable(const pal::string_t& filename); pal::string_t get_directory(const pal::string_t& path); pal::string_t get_filename(const pal::string_t& path);