]> git.lyx.org Git - lyx.git/blobdiff - src/support/lstrings.cpp
improve language flag for Objective-C compiler call
[lyx.git] / src / support / lstrings.cpp
index 4ba72d8081582ec55bb760ad344078eb3ea0ebe6..656f82ee1119b7010d0f41f5b350304077efec60 100644 (file)
 #include "support/lstrings.h"
 
 #include "support/convert.h"
-#include "support/gettext.h"
 #include "support/qstring_helpers.h"
-#include "support/textutils.h"
 
-#include <boost/tokenizer.hpp>
 #include "support/lassert.h"
 
 #include <QString>
-#include <QVector>
 
 #include <cstdio>
 #include <algorithm>
@@ -36,7 +32,7 @@ namespace lyx {
 // without #include "support/docstring" there.
 docstring const & empty_docstring()
 {
-       static docstring s;
+       static const docstring s;
        return s;
 }
 
@@ -44,7 +40,7 @@ docstring const & empty_docstring()
 // without #include <string>
 string const & empty_string()
 {
-       static string s;
+       static const string s;
        return s;
 }
 
@@ -58,7 +54,7 @@ namespace {
  */
 inline char_type qchar_to_ucs4(QChar const & qchar)
 {
-       LASSERT(is_utf16(static_cast<char_type>(qchar.unicode())), /**/);
+       LASSERT(is_utf16(static_cast<char_type>(qchar.unicode())), return '?');
        return static_cast<char_type>(qchar.unicode());
 }
 
@@ -71,7 +67,7 @@ inline char_type qchar_to_ucs4(QChar const & qchar)
  */
 inline QChar const ucs4_to_qchar(char_type const ucs4)
 {
-       LASSERT(is_utf16(ucs4), /**/);
+       LASSERT(is_utf16(ucs4), return QChar('?'));
        return QChar(static_cast<unsigned short>(ucs4));
 }
 
@@ -116,6 +112,11 @@ bool isPrintable(char_type c)
                // assume that all non-utf16 characters are printable
                return true;
        }
+       // Not yet recognized by QChar::isPrint()
+       // See https://bugreports.qt-project.org/browse/QTBUG-12144
+       // LATIN CAPITAL LETTER SHARP S
+       else if (c == 0x1e9e)
+               return true;
        return ucs4_to_qchar(c).isPrint();
 }
 
@@ -169,6 +170,12 @@ bool isAlnumASCII(char_type c)
 }
 
 
+bool isASCII(char_type c)
+{
+       return c < 0x80;
+}
+
+
 namespace support {
 
 int compare_no_case(docstring const & s, docstring const & s2)
@@ -332,7 +339,7 @@ bool hasDigitASCII(docstring const & str)
 }
 
 
-static bool isHexChar(char_type c)
+bool isHexChar(char_type c)
 {
        return c == '0' ||
                c == '1' ||
@@ -402,14 +409,14 @@ bool isAscii(string const & str)
 
 char lowercase(char c)
 {
-       LASSERT(static_cast<unsigned char>(c) < 0x80, /**/);
+       LASSERT(isASCII(c), return '?');
        return char(tolower(c));
 }
 
 
 char uppercase(char c)
 {
-       LASSERT(static_cast<unsigned char>(c) < 0x80, /**/);
+       LASSERT(isASCII(c), return '?');
        return char(toupper(c));
 }
 
@@ -474,6 +481,16 @@ 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)
 {
        docstring tmp(a);
@@ -817,7 +834,7 @@ template<typename String> inline
 String const subst_string(String const & a,
                String const & oldstr, String const & newstr)
 {
-       LASSERT(!oldstr.empty(), /**/);
+       LASSERT(!oldstr.empty(), return a);
        String lstr = a;
        size_t i = 0;
        size_t const olen = oldstr.length();
@@ -833,7 +850,7 @@ String const subst_string(String const & a,
 docstring const subst_string(docstring const & a,
                docstring const & oldstr, docstring const & newstr)
 {
-       LASSERT(!oldstr.empty(), /**/);
+       LASSERT(!oldstr.empty(), return a);
        docstring lstr = a;
        size_t i = 0;
        size_t const olen = oldstr.length();
@@ -875,6 +892,18 @@ docstring const subst(docstring const & a,
 }
 
 
+int count_char(string const & str, char chr)
+{
+       int count = 0;
+       string::const_iterator lit = str.begin();
+       string::const_iterator end = str.end();
+       for (; lit != end; ++lit)
+               if ((*lit) == chr)
+                       count++;
+       return count;
+}
+
+
 /// Count all occurences of char \a chr inside \a str
 int count_char(docstring const & str, docstring::value_type chr)
 {
@@ -890,7 +919,7 @@ int count_char(docstring const & str, docstring::value_type chr)
 
 docstring const trim(docstring const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
 
        if (a.empty() || !*p)
                return a;
@@ -909,7 +938,7 @@ docstring const trim(docstring const & a, char const * p)
 
 string const trim(string const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
 
        if (a.empty() || !*p)
                return a;
@@ -927,7 +956,7 @@ string const trim(string const & a, char const * p)
 
 string const rtrim(string const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
 
        if (a.empty() || !*p)
                return a;
@@ -944,7 +973,7 @@ string const rtrim(string const & a, char const * p)
 
 docstring const rtrim(docstring const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
 
        if (a.empty() || !*p)
                return a;
@@ -961,7 +990,7 @@ docstring const rtrim(docstring const & a, char const * p)
 
 string const ltrim(string const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
        if (a.empty() || !*p)
                return a;
        size_t l = a.find_first_not_of(p);
@@ -973,7 +1002,7 @@ string const ltrim(string const & a, char const * p)
 
 docstring const ltrim(docstring const & a, char const * p)
 {
-       LASSERT(p, /**/);
+       LASSERT(p, return a);
        if (a.empty() || !*p)
                return a;
        size_t l = a.find_first_not_of(from_ascii(p));
@@ -1062,6 +1091,20 @@ string const rsplit(string const & a, string & piece, char delim)
 }
 
 
+docstring const rsplit(docstring const & a, docstring & piece, char_type delim)
+{
+       docstring tmp;
+       size_t i = a.rfind(delim);
+       if (i != string::npos) { // delimiter was found
+               piece = a.substr(0, i);
+               tmp = a.substr(i + 1);
+       } else { // delimiter was not found
+               piece.erase();
+       }
+       return tmp;
+}
+
+
 docstring const rsplit(docstring const & a, char_type delim)
 {
        docstring tmp;
@@ -1079,13 +1122,14 @@ docstring const escape(docstring const & lab)
        docstring enc;
        for (size_t i = 0; i < lab.length(); ++i) {
                char_type c = lab[i];
-               if (c >= 128 || c == '=' || c == '%') {
+               if (c >= 128 || c == '=' || c == '%' || c == '#' || c == '$'
+                   || c == '}' || c == '{' || c == ']' || c == '[' || c == '&') {
                        // Although char_type is a 32 bit type we know that
                        // UCS4 occupies only 21 bits, so we don't need to
                        // encode bigger values. Test for 2^24 because we
                        // can encode that with the 6 hex digits that are
                        // needed for 21 bits anyway.
-                       LASSERT(c < (1 << 24), /**/);
+                       LASSERT(c < (1 << 24), continue);
                        enc += '=';
                        enc += hexdigit[(c>>20) & 15];
                        enc += hexdigit[(c>>16) & 15];
@@ -1153,6 +1197,7 @@ docstring wrap(docstring const & str, int const ind, size_t const width)
 docstring wrapParas(docstring const & str, int const indent,
                    size_t const width, size_t const maxlines)
 {
+       docstring const dots = from_ascii("...");
        if (str.empty())
                return docstring();
 
@@ -1167,9 +1212,21 @@ docstring wrapParas(docstring const & str, int const indent,
                if (nlines == 0)
                        continue;
                size_t const curlines = retval.size();
-               if (maxlines > 0 && curlines + nlines >= maxlines) {
-                       tmp.resize(maxlines - curlines - 1);
-                       tmp.push_back(from_ascii("..."));
+               if (maxlines > 0 && curlines + nlines > maxlines) {
+                       tmp.resize(maxlines - curlines);
+                       docstring last = tmp.back();
+                       size_t const lsize = last.size();
+                       if (lsize > width - 3) {
+                               size_t const i = last.find_last_of(' ', width - 3);
+                               if (i == docstring::npos || i <= size_t(indent))
+                                       // no space found
+                                       last = last.substr(0, lsize - 3) + dots;
+                               else
+                                       last = last.substr(0, i) + dots;
+                       } else
+                               last += dots;
+                       tmp.pop_back();
+                       tmp.push_back(last);
                }
                retval.insert(retval.end(), tmp.begin(), tmp.end());
                if (maxlines > 0 && retval.size() >= maxlines)
@@ -1277,16 +1334,10 @@ int findToken(char const * const str[], string const & search_token)
 }
 
 
-string const languageTestString()
-{
-       return N_("[[Replace with the code of your language]]");
-}
-
-
 template<>
 docstring bformat(docstring const & fmt, int arg1)
 {
-       LASSERT(contains(fmt, from_ascii("%1$d")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$d")));
        docstring const str = subst(fmt, from_ascii("%1$d"), convert<docstring>(arg1));
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1295,7 +1346,7 @@ docstring bformat(docstring const & fmt, int arg1)
 template<>
 docstring bformat(docstring const & fmt, long arg1)
 {
-       LASSERT(contains(fmt, from_ascii("%1$d")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$d")));
        docstring const str = subst(fmt, from_ascii("%1$d"), convert<docstring>(arg1));
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1304,7 +1355,7 @@ docstring bformat(docstring const & fmt, long arg1)
 template<>
 docstring bformat(docstring const & fmt, unsigned int arg1)
 {
-       LASSERT(contains(fmt, from_ascii("%1$d")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$d")));
        docstring const str = subst(fmt, from_ascii("%1$d"), convert<docstring>(arg1));
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1313,7 +1364,7 @@ docstring bformat(docstring const & fmt, unsigned int arg1)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
        docstring const str = subst(fmt, from_ascii("%1$s"), arg1);
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1322,7 +1373,7 @@ docstring bformat(docstring const & fmt, docstring arg1)
 template<>
 docstring bformat(docstring const & fmt, char * arg1)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
        docstring const str = subst(fmt, from_ascii("%1$s"), from_ascii(arg1));
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1331,8 +1382,8 @@ docstring bformat(docstring const & fmt, char * arg1)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1, docstring arg2)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$s")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
+       LATTEST(contains(fmt, from_ascii("%2$s")));
        docstring str = subst(fmt, from_ascii("%1$s"), arg1);
        str = subst(str, from_ascii("%2$s"), arg2);
        return subst(str, from_ascii("%%"), from_ascii("%"));
@@ -1342,8 +1393,8 @@ docstring bformat(docstring const & fmt, docstring arg1, docstring arg2)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1, int arg2)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$d")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
+       LATTEST(contains(fmt, from_ascii("%2$d")));
        docstring str = subst(fmt, from_ascii("%1$s"), arg1);
        str = subst(str, from_ascii("%2$d"), convert<docstring>(arg2));
        return subst(str, from_ascii("%%"), from_ascii("%"));
@@ -1353,8 +1404,8 @@ docstring bformat(docstring const & fmt, docstring arg1, int arg2)
 template<>
 docstring bformat(docstring const & fmt, char const * arg1, docstring arg2)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$s")), /**/);
+       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);
        return subst(str, from_ascii("%%"), from_ascii("%"));
@@ -1364,8 +1415,8 @@ docstring bformat(docstring const & fmt, char const * arg1, docstring arg2)
 template<>
 docstring bformat(docstring const & fmt, int arg1, int arg2)
 {
-       LASSERT(contains(fmt, from_ascii("%1$d")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$d")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$d")));
+       LATTEST(contains(fmt, from_ascii("%2$d")));
        docstring str = subst(fmt, from_ascii("%1$d"), convert<docstring>(arg1));
        str = subst(str, from_ascii("%2$d"), convert<docstring>(arg2));
        return subst(str, from_ascii("%%"), from_ascii("%"));
@@ -1375,9 +1426,9 @@ docstring bformat(docstring const & fmt, int arg1, int arg2)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%3$s")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
+       LATTEST(contains(fmt, from_ascii("%2$s")));
+       LATTEST(contains(fmt, from_ascii("%3$s")));
        docstring str = subst(fmt, from_ascii("%1$s"), arg1);
        str = subst(str, from_ascii("%2$s"), arg2);
        str = subst(str, from_ascii("%3$s"), arg3);
@@ -1389,10 +1440,10 @@ template<>
 docstring bformat(docstring const & fmt,
               docstring arg1, docstring arg2, docstring arg3, docstring arg4)
 {
-       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%2$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%3$s")), /**/);
-       LASSERT(contains(fmt, from_ascii("%4$s")), /**/);
+       LATTEST(contains(fmt, from_ascii("%1$s")));
+       LATTEST(contains(fmt, from_ascii("%2$s")));
+       LATTEST(contains(fmt, from_ascii("%3$s")));
+       LATTEST(contains(fmt, from_ascii("%4$s")));
        docstring str = subst(fmt, from_ascii("%1$s"), arg1);
        str = subst(str, from_ascii("%2$s"), arg2);
        str = subst(str, from_ascii("%3$s"), arg3);