]> git.lyx.org Git - lyx.git/blobdiff - src/support/lstrings.cpp
Cmake build: Omit also hidden header files from globbing
[lyx.git] / src / support / lstrings.cpp
index 2d483e674436819153e4c5f690e865bd88623986..ea1ba59984a62ba7e92910d94530a930e3baf0ef 100644 (file)
@@ -15,6 +15,7 @@
 #include "support/lstrings.h"
 
 #include "support/convert.h"
+#include "support/debug.h"
 #include "support/qstring_helpers.h"
 
 #include "support/lassert.h"
@@ -22,7 +23,9 @@
 #include <QString>
 
 #include <cstdio>
+#include <cstring>
 #include <algorithm>
+#include <typeinfo>
 
 using namespace std;
 
@@ -32,7 +35,7 @@ namespace lyx {
 // without #include "support/docstring" there.
 docstring const & empty_docstring()
 {
-       static docstring s;
+       static const docstring s;
        return s;
 }
 
@@ -40,7 +43,7 @@ docstring const & empty_docstring()
 // without #include <string>
 string const & empty_string()
 {
-       static string s;
+       static const string s;
        return s;
 }
 
@@ -200,6 +203,29 @@ int compare_no_case(docstring const & s, docstring const & s2)
 }
 
 
+int compare_locale(docstring const & s, docstring const & s2)
+{
+       // FIXME We have a report that this does not work on windows (bug 9030)
+       try
+       {
+               string const l = to_local8bit(s);
+               string const r = to_local8bit(s2);
+               return strcoll(l.c_str(), r.c_str());
+       }
+       catch (bad_cast & e)
+       {
+               // fall back to builtin sorting
+               LYXERR0("Could not compare using the current locale: "
+                       << e.what() << ", using fallback.");
+               if (s < s2)
+                       return -1;
+               if (s > s2)
+                       return 1;
+               return 0;
+       }
+}
+
+
 namespace {
 
 template<typename Char>
@@ -481,12 +507,14 @@ docstring const lowercase(docstring const & a)
 }
 
 
+/* Uncomment here and in lstrings.h if you should need this.
 string const lowercase(string const & a)
 {
        string tmp(a);
        transform(tmp.begin(), tmp.end(), tmp.begin(), local_lowercase());
        return tmp;
 }
+*/
 
 
 docstring const uppercase(docstring const & a)
@@ -915,6 +943,31 @@ int count_char(docstring const & str, docstring::value_type chr)
 }
 
 
+int count_bin_chars(string const & str)
+{
+       QString const qstr = toqstr(str).simplified();
+       int count = 0;
+       QString::const_iterator cit = qstr.begin();
+       QString::const_iterator end = qstr.end();
+       for (; cit != end; ++cit)  {
+               switch (cit->category()) {
+               case QChar::Separator_Line:
+               case QChar::Separator_Paragraph:
+               case QChar::Other_Control:
+               case QChar::Other_Format:
+               case QChar::Other_Surrogate:
+               case QChar::Other_PrivateUse:
+               case QChar::Other_NotAssigned:
+                       ++count;
+                       break;
+               default:
+                       break;
+               }
+       }
+       return count;
+}
+
+
 docstring const trim(docstring const & a, char const * p)
 {
        LASSERT(p, return a);
@@ -1405,7 +1458,7 @@ docstring bformat(docstring const & fmt, char const * arg1, docstring arg2)
        LATTEST(contains(fmt, from_ascii("%1$s")));
        LATTEST(contains(fmt, from_ascii("%2$s")));
        docstring str = subst(fmt, from_ascii("%1$s"), from_ascii(arg1));
-       str = subst(fmt, from_ascii("%2$s"), arg2);
+       str = subst(str, from_ascii("%2$s"), arg2);
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }