]> git.lyx.org Git - features.git/blobdiff - src/support/lstrings.cpp
Fix for bug 5053. There are still some serious problems here, though, as (a) "unknown...
[features.git] / src / support / lstrings.cpp
index 672608f9faaf62b785de76b5928b1703ca9978b6..2bd5f4ea95c606954ca82639b5a3be6726947906 100644 (file)
@@ -5,6 +5,7 @@
  *
  * \author Lars Gullik Bjønnes
  * \author Jean-Marc Lasgouttes
+ * \author Dekel Tsur
  *
  * Full author contact details are available in file CREDITS.
  */
 #include "support/textutils.h"
 
 #include <boost/tokenizer.hpp>
-#include <boost/assert.hpp>
+#include "support/lassert.h"
+
+#include <QString>
+#include <QVector>
 
 #include <algorithm>
 
@@ -51,7 +55,7 @@ string const & empty_string()
  */
 static inline char_type qchar_to_ucs4(QChar const & qchar)
 {
-       BOOST_ASSERT(is_utf16(static_cast<char_type>(qchar.unicode())));
+       LASSERT(is_utf16(static_cast<char_type>(qchar.unicode())), /**/);
        return static_cast<char_type>(qchar.unicode());
 }
 
@@ -65,7 +69,7 @@ static inline char_type qchar_to_ucs4(QChar const & qchar)
  */
 static inline QChar const ucs4_to_qchar(char_type const ucs4)
 {
-       BOOST_ASSERT(is_utf16(ucs4));
+       LASSERT(is_utf16(ucs4), /**/);
        return QChar(static_cast<unsigned short>(ucs4));
 }
 
@@ -372,14 +376,14 @@ bool isAscii(string const & str)
 
 char lowercase(char c)
 {
-       BOOST_ASSERT(static_cast<unsigned char>(c) < 0x80);
+       LASSERT(static_cast<unsigned char>(c) < 0x80, /**/);
        return char(tolower(c));
 }
 
 
 char uppercase(char c)
 {
-       BOOST_ASSERT(static_cast<unsigned char>(c) < 0x80);
+       LASSERT(static_cast<unsigned char>(c) < 0x80, /**/);
        return char(toupper(c));
 }
 
@@ -477,11 +481,7 @@ bool prefixIs(string const & a, string const & pre)
 {
        size_t const prelen = pre.length();
        size_t const alen = a.length();
-
-       if (prelen > alen || a.empty())
-               return false;
-       else
-               return a.compare(0, prelen, pre) == 0;
+       return prelen <= alen && !a.empty() && a.compare(0, prelen, pre) == 0;
 }
 
 
@@ -489,17 +489,14 @@ bool prefixIs(docstring const & a, docstring const & pre)
 {
        size_t const prelen = pre.length();
        size_t const alen = a.length();
-
-       if (prelen > alen || a.empty())
-               return false;
-       else
-               return a.compare(0, prelen, pre) == 0;
+       return prelen <= alen && !a.empty() && a.compare(0, prelen, pre) == 0;
 }
 
 
 bool suffixIs(string const & a, char c)
 {
-       if (a.empty()) return false;
+       if (a.empty()) 
+               return false;
        return a[a.length() - 1] == c;
 }
 
@@ -516,10 +513,15 @@ bool suffixIs(string const & a, string const & suf)
 {
        size_t const suflen = suf.length();
        size_t const alen = a.length();
-       if (suflen > alen)
-               return false;
-       else
-               return a.compare(alen - suflen, suflen, suf) == 0;
+       return suflen <= alen && a.compare(alen - suflen, suflen, suf) == 0;
+}
+
+
+bool suffixIs(docstring const & a, docstring const & suf)
+{
+       size_t const suflen = suf.length();
+       size_t const alen = a.length();
+       return suflen <= alen && a.compare(alen - suflen, suflen, suf) == 0;
 }
 
 
@@ -603,6 +605,24 @@ int tokenPos(string const & a, char delim, string const & tok)
 }
 
 
+// this could probably be faster and/or cleaner, but it seems to work (JMarc)
+// rewritten to use new string (Lgb)
+int tokenPos(docstring const & a, char_type delim, docstring const & tok)
+{
+       int i = 0;
+       docstring str = a;
+       docstring tmptok;
+
+       while (!str.empty()) {
+               str = split(str, tmptok, delim);
+               if (tok == tmptok)
+                       return i;
+               ++i;
+       }
+       return -1;
+}
+
+
 namespace {
 
 /// Substitute all \a oldchar with \a newchar
@@ -639,7 +659,7 @@ template<typename String> inline
 String const subst_string(String const & a,
                String const & oldstr, String const & newstr)
 {
-       BOOST_ASSERT(!oldstr.empty());
+       LASSERT(!oldstr.empty(), /**/);
        String lstr = a;
        size_t i = 0;
        size_t const olen = oldstr.length();
@@ -654,7 +674,7 @@ String const subst_string(String const & a,
 docstring const subst_string(docstring const & a,
                docstring const & oldstr, docstring const & newstr)
 {
-       BOOST_ASSERT(!oldstr.empty());
+       LASSERT(!oldstr.empty(), /**/);
        docstring lstr = a;
        size_t i = 0;
        size_t const olen = oldstr.length();
@@ -698,7 +718,7 @@ docstring const subst(docstring const & a,
 
 docstring const trim(docstring const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
 
        if (a.empty() || !*p)
                return a;
@@ -717,7 +737,7 @@ docstring const trim(docstring const & a, char const * p)
 
 string const trim(string const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
 
        if (a.empty() || !*p)
                return a;
@@ -735,7 +755,7 @@ string const trim(string const & a, char const * p)
 
 string const rtrim(string const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
 
        if (a.empty() || !*p)
                return a;
@@ -752,7 +772,7 @@ string const rtrim(string const & a, char const * p)
 
 docstring const rtrim(docstring const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
 
        if (a.empty() || !*p)
                return a;
@@ -769,7 +789,7 @@ docstring const rtrim(docstring const & a, char const * p)
 
 string const ltrim(string const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
        if (a.empty() || !*p)
                return a;
        size_t l = a.find_first_not_of(p);
@@ -781,7 +801,7 @@ string const ltrim(string const & a, char const * p)
 
 docstring const ltrim(docstring const & a, char const * p)
 {
-       BOOST_ASSERT(p);
+       LASSERT(p, /**/);
        if (a.empty() || !*p)
                return a;
        size_t l = a.find_first_not_of(from_ascii(p));
@@ -883,7 +903,7 @@ docstring const escape(docstring const & lab)
                        // encode bigger values. Test for 2^24 because we
                        // can encode that with the 6 hex digits that are
                        // needed for 21 bits anyway.
-                       BOOST_ASSERT(c < (1 << 24));
+                       LASSERT(c < (1 << 24), /**/);
                        enc += '=';
                        enc += hexdigit[(c>>20) & 15];
                        enc += hexdigit[(c>>16) & 15];
@@ -902,7 +922,7 @@ docstring const escape(docstring const & lab)
 namespace {
 
 template<typename String> vector<String> const
-getVectorFromStringT(String const & str, String const & delim)
+getVectorFromStringT(String const & str, String const & delim, bool keepempty)
 {
 // Lars would like this code to go, but for now his replacement (below)
 // doesn't fullfil the same function. I have, therefore, reactivated the
@@ -919,7 +939,7 @@ getVectorFromStringT(String const & str, String const & delim)
                        break;
                }
                String const key = trim(keys.substr(0, idx));
-               if (!key.empty())
+               if (!key.empty() || keepempty)
                        vec.push_back(key);
                size_t const start = idx + delim.size();
                keys = keys.substr(start);
@@ -938,16 +958,18 @@ getVectorFromStringT(String const & str, String const & delim)
 
 
 vector<string> const getVectorFromString(string const & str,
-                                        string const & delim)
+                                        string const & delim,
+                                        bool keepempty)
 {
-       return getVectorFromStringT<string>(str, delim);
+       return getVectorFromStringT<string>(str, delim, keepempty);
 }
 
 
 vector<docstring> const getVectorFromString(docstring const & str,
-                                           docstring const & delim)
+                                           docstring const & delim,
+                                           bool keepempty)
 {
-       return getVectorFromStringT<docstring>(str, delim);
+       return getVectorFromStringT<docstring>(str, delim, keepempty);
 }
 
 
@@ -1006,7 +1028,7 @@ docstring const internalLineEnding(docstring const & str)
 template<>
 docstring bformat(docstring const & fmt, int arg1)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$d")));
+       LASSERT(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("%"));
 }
@@ -1015,7 +1037,7 @@ docstring bformat(docstring const & fmt, int arg1)
 template<>
 docstring bformat(docstring const & fmt, long arg1)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$d")));
+       LASSERT(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("%"));
 }
@@ -1024,7 +1046,7 @@ docstring bformat(docstring const & fmt, long arg1)
 template<>
 docstring bformat(docstring const & fmt, unsigned int arg1)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$d")));
+       LASSERT(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("%"));
 }
@@ -1033,7 +1055,7 @@ docstring bformat(docstring const & fmt, unsigned int arg1)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
+       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
        docstring const str = subst(fmt, from_ascii("%1$s"), arg1);
        return subst(str, from_ascii("%%"), from_ascii("%"));
 }
@@ -1042,7 +1064,7 @@ docstring bformat(docstring const & fmt, docstring arg1)
 template<>
 docstring bformat(docstring const & fmt, char * arg1)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
+       LASSERT(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("%"));
 }
@@ -1051,8 +1073,8 @@ docstring bformat(docstring const & fmt, char * arg1)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1, docstring arg2)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%2$s")));
+       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
+       LASSERT(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("%"));
@@ -1062,8 +1084,8 @@ docstring bformat(docstring const & fmt, docstring arg1, docstring arg2)
 template<>
 docstring bformat(docstring const & fmt, char const * arg1, docstring arg2)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%2$s")));
+       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
+       LASSERT(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("%"));
@@ -1073,8 +1095,8 @@ docstring bformat(docstring const & fmt, char const * arg1, docstring arg2)
 template<>
 docstring bformat(docstring const & fmt, int arg1, int arg2)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$d")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%2$d")));
+       LASSERT(contains(fmt, from_ascii("%1$d")), /**/);
+       LASSERT(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("%"));
@@ -1084,9 +1106,9 @@ docstring bformat(docstring const & fmt, int arg1, int arg2)
 template<>
 docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%2$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%3$s")));
+       LASSERT(contains(fmt, from_ascii("%1$s")), /**/);
+       LASSERT(contains(fmt, from_ascii("%2$s")), /**/);
+       LASSERT(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);
@@ -1098,10 +1120,10 @@ template<>
 docstring bformat(docstring const & fmt,
               docstring arg1, docstring arg2, docstring arg3, docstring arg4)
 {
-       BOOST_ASSERT(contains(fmt, from_ascii("%1$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%2$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%3$s")));
-       BOOST_ASSERT(contains(fmt, from_ascii("%4$s")));
+       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")), /**/);
        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);