Преглед изворни кода

Don't use locale dependent toupper and tolower.

Tatsuhiro Tsujikawa пре 13 година
родитељ
комит
e6f04416d9
2 измењених фајлова са 24 додато и 4 уклоњено
  1. 20 4
      src/util.cc
  2. 4 0
      src/util.h

+ 20 - 4
src/util.cc

@@ -943,24 +943,40 @@ std::string randomAlpha(size_t length, const RandomizerHandle& randomizer) {
 
 std::string toUpper(const std::string& src) {
   std::string temp = src;
-  std::transform(temp.begin(), temp.end(), temp.begin(), ::toupper);
+  std::transform(temp.begin(), temp.end(), temp.begin(), toUpperChar);
   return temp;
 }
 
 std::string toLower(const std::string& src) {
   std::string temp = src;
-  std::transform(temp.begin(), temp.end(), temp.begin(), ::tolower);
+  std::transform(temp.begin(), temp.end(), temp.begin(), toLowerChar);
   return temp;
 }
 
 void uppercase(std::string& s)
 {
-  std::transform(s.begin(), s.end(), s.begin(), ::toupper);
+  std::transform(s.begin(), s.end(), s.begin(), toUpperChar);
 }
 
 void lowercase(std::string& s)
 {
-  std::transform(s.begin(), s.end(), s.begin(), ::tolower);
+  std::transform(s.begin(), s.end(), s.begin(), toLowerChar);
+}
+
+char toUpperChar(char c)
+{
+  if('a' <= c && c <= 'z') {
+    c += 'A'-'a';
+  }
+  return c;
+}
+
+char toLowerChar(char c)
+{
+  if('A' <= c && c <= 'Z') {
+    c += 'a'-'A';
+  }
+  return c;
 }
 
 bool isNumericHost(const std::string& name)

+ 4 - 0
src/util.h

@@ -311,6 +311,10 @@ void uppercase(std::string& s);
 
 void lowercase(std::string& s);
 
+char toUpperChar(char c);
+
+char toLowerChar(char c);
+
 bool isNumericHost(const std::string& name);
 
 void setGlobalSignalHandler(int signal, void (*handler)(int), int flags);