From 87a9061d57d2838b3793644a051542e329d305fa Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 10 Sep 2015 10:04:20 -0400 Subject: cmSystemTools: Factor out a cm_isspace helper Extract the logic added by commit v3.1.0-rc1~386^2 (Encoding: Fix debug asserts ... with non-ascii chars, 2014-06-16) into a helper function so we can re-use it. --- Source/cmSystemTools.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index b1b7f47..84a288c 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -68,6 +68,11 @@ # include "cmMachO.h" #endif +static bool cm_isspace(char c) +{ + return ((c & 0x80) == 0) && isspace(c); +} + class cmSystemToolsFileTime { public: @@ -496,7 +501,7 @@ void cmSystemTools::ParseWindowsCommandLine(const char* command, { arg.append(backslashes, '\\'); backslashes = 0; - if(((*c & 0x80) == 0 ) && isspace(*c)) + if (cm_isspace(*c)) { if(in_quotes) { -- cgit v0.12 From 9c4a500f75e821ec6afb303a6ef5d951dcdc5c63 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 10 Sep 2015 10:05:21 -0400 Subject: cmSystemTools: Fix TrimWhitespace for non-ascii strings (#15735) Since commit v2.8.11~59^2 (cmSystemTools: Generalize TrimWhitespace to all whitespace, 2013-03-27) we incorrectly use `c <= ' '` to determine if `c` is a whitespace character. With a signed `char` type UTF-8 encoded strings may be truncated because values above 0x7f appear negative and therefore less than 0x20. Use `isspace(c)` instead. --- Source/cmSystemTools.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 84a288c..005a803 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -233,13 +233,13 @@ std::string cmSystemTools::HelpFileName(std::string name) std::string cmSystemTools::TrimWhitespace(const std::string& s) { std::string::const_iterator start = s.begin(); - while(start != s.end() && *start <= ' ') + while (start != s.end() && cm_isspace(*start)) ++start; if (start == s.end()) return ""; std::string::const_iterator stop = s.end()-1; - while(*stop <= ' ') + while (cm_isspace(*stop)) --stop; return std::string(start, stop+1); } -- cgit v0.12