]> git.lyx.org Git - lyx.git/blobdiff - src/support/lstrings.C
small changes read changelog
[lyx.git] / src / support / lstrings.C
index 88327571fb1735ba4ca35b39bbe4a38e836f7563..f0e6fe2b952cec85e39e06e1a00524394831223c 100644 (file)
@@ -30,6 +30,7 @@ using std::transform;
 #ifndef CXX_GLOBAL_CSTD
 using std::tolower;
 using std::toupper;
+using std::strlen;
 #endif
 
 
@@ -55,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();
@@ -232,7 +264,7 @@ bool prefixIs(string const & a, char const * pre)
 {
        lyx::Assert(pre);
        
-       size_t const l = std::strlen(pre);
+       size_t const l = strlen(pre);
        string::size_type const alen = a.length();
        
        if (l > alen || a.empty())
@@ -280,7 +312,7 @@ bool suffixIs(string const & a, char const * suf)
 {
        lyx::Assert(suf);
        
-       size_t const suflen = std::strlen(suf);
+       size_t const suflen = strlen(suf);
        string::size_type const alen = a.length();
        
        if (suflen > alen)
@@ -478,7 +510,7 @@ string const subst(string const & a,
        
        string lstr(a);
        string::size_type i = 0;
-       string::size_type olen = std::strlen(oldstr);
+       string::size_type olen = strlen(oldstr);
        while((i = lstr.find(oldstr, i)) != string::npos) {
                lstr.replace(i, olen, newstr);
                i += newstr.length(); // We need to be sure that we dont
@@ -590,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;
+}