]> git.lyx.org Git - lyx.git/blobdiff - src/support/lstrings.C
lyxserver cleanup patch + andre's small patches
[lyx.git] / src / support / lstrings.C
index 20c92ff16e35b29c285dd7df03ea918b05128df1..f0e6fe2b952cec85e39e06e1a00524394831223c 100644 (file)
@@ -4,7 +4,7 @@
  *           LyX, The Document Processor
  *        
  *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2000 The LyX Team.
+ *           Copyright 1995-2001 The LyX Team.
  *
  * ====================================================== */
 
 
 using std::count;
 using std::transform;
+
 #ifndef CXX_GLOBAL_CSTD
 using std::tolower;
 using std::toupper;
+using std::strlen;
 #endif
 
 
@@ -54,6 +56,37 @@ int compare_no_case(string const & s, string const & s2)
 }
 
 
+namespace {
+       int ascii_tolower(int c) {
+               if (c >= 'A' && c <= 'Z')
+                       return c - 'A' + 'a';
+               return c;
+       }
+}
+
+
+int compare_ascii_no_case(string const & s, string const & s2)
+{
+       string::const_iterator p = s.begin();
+       string::const_iterator p2 = s2.begin();
+
+       while (p != s.end() && p2 != s2.end()) {
+               int const lc1 = ascii_tolower(*p);
+               int const lc2 = ascii_tolower(*p2);
+               if (lc1 != lc2)
+                       return (lc1 < lc2) ? -1 : 1;
+               ++p;
+               ++p2;
+       }
+
+       if (s.size() == s2.size())
+               return 0;
+       if (s.size() < s2.size())
+               return -1;
+       return 1;
+}
+
+
 int compare_no_case(string const & s, string const & s2, unsigned int len)
 {
        string::const_iterator p = s.begin();
@@ -193,38 +226,36 @@ char uppercase(char c)
 }
 
 
+namespace {
+
+// since we cannot use std::tolower and std::toupper directly in the
+// calls to std::transform yet, we use these helper clases. (Lgb)
+
+struct local_lowercase {
+       char operator()(char c) const {
+               return tolower(c);
+       }
+};
+       
+struct local_uppercase {
+       char operator()(char c) const {
+               return toupper(c);
+       }
+};
+
+} // end of anon namespace
+
 string const lowercase(string const & a)
 {
        string tmp(a);
-#if 1
-       string::iterator result = tmp.begin();
-       string::iterator end = tmp.end();
-       for (string::iterator first = tmp.begin();
-            first != end; ++first, ++result) {
-               *result = lowercase(*first);
-       }
-#else
-       // We want to use this one. (Lgb)
-       transform(tmp.begin(), tmp.end(), tmp.begin(), lowercase);
-#endif
+       transform(tmp.begin(), tmp.end(), tmp.begin(), local_lowercase());
        return tmp;
 }
 
-
 string const uppercase(string const & a)
 {
        string tmp(a);
-#if 1
-       string::iterator result = tmp.begin();
-       string::iterator end = tmp.end();
-       for (string::iterator first = tmp.begin();
-            first != end; ++first, ++result) {
-               *result = uppercase(*first);
-       }
-#else
-       // We want to use this one. (Lgb)
-       transform(tmp.begin(), tmp.end(), tmp.begin(), uppercase);
-#endif
+       transform(tmp.begin(), tmp.end(), tmp.begin(), local_uppercase());
        return tmp;
 }
 
@@ -473,7 +504,7 @@ string const subst(string const & a, char oldchar, char newchar)
 
 
 string const subst(string const & a,
-            char const * oldstr, string const & newstr)
+                  char const * oldstr, string const & newstr)
 {
        lyx::Assert(oldstr);
        
@@ -591,3 +622,24 @@ string const rsplit(string const & a, string & piece, char delim)
        }
        return tmp;
 }
+
+
+// This function escapes 8-bit characters and other problematic
+// characters that cause problems in latex labels.
+string const escape(string const & lab)
+{
+       char hexdigit[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
+                             '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+       string enc;
+       for (string::size_type i = 0; i < lab.length(); ++i) {
+               unsigned char c= lab[i];
+               if (c >= 128 || c == '=' || c == '%') {
+                       enc += '=';
+                       enc += hexdigit[c>>4];
+                       enc += hexdigit[c & 15];
+               } else {
+                       enc += c;
+               }
+       }
+       return enc;
+}