X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.cpp;h=2bd5f4ea95c606954ca82639b5a3be6726947906;hb=741bd1221aa56a6e278d6f8280a0dd7e2e901cac;hp=1952300ecd305f17713893761bb51ce291e591f8;hpb=5c4a20fe0406ca60a084f733b5fc4324ab1a0933;p=features.git diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index 1952300ecd..2bd5f4ea95 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -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. */ @@ -14,31 +15,18 @@ #include "support/lstrings.h" #include "support/convert.h" -#include "support/debug.h" -#include "support/lyxlib.h" #include "support/qstring_helpers.h" #include "support/textutils.h" #include -#include +#include "support/lassert.h" -#include -#include +#include +#include #include -#include - - -using std::transform; -using std::string; -using std::vector; - -#ifndef CXX_GLOBAL_CSTD -using std::isdigit; -using std::tolower; -using std::toupper; -#endif +using namespace std; namespace lyx { @@ -50,11 +38,11 @@ docstring const & empty_docstring() return s; } -// Using this allows us to have std::string default arguments in headers +// Using this allows us to have string default arguments in headers // without #include -std::string const & empty_string() +string const & empty_string() { - static std::string s; + static string s; return s; } @@ -67,7 +55,7 @@ std::string const & empty_string() */ static inline char_type qchar_to_ucs4(QChar const & qchar) { - BOOST_ASSERT(is_utf16(static_cast(qchar.unicode()))); + LASSERT(is_utf16(static_cast(qchar.unicode())), /**/); return static_cast(qchar.unicode()); } @@ -81,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(ucs4)); } @@ -388,14 +376,14 @@ bool isAscii(string const & str) char lowercase(char c) { - BOOST_ASSERT(static_cast(c) < 0x80); + LASSERT(static_cast(c) < 0x80, /**/); return char(tolower(c)); } char uppercase(char c) { - BOOST_ASSERT(static_cast(c) < 0x80); + LASSERT(static_cast(c) < 0x80, /**/); return char(toupper(c)); } @@ -420,8 +408,8 @@ char_type uppercase(char_type 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) +// since we cannot use tolower and toupper directly in the +// calls to transform yet, we use these helper clases. (Lgb) struct local_lowercase { char_type operator()(char_type c) const { @@ -493,14 +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; -#if defined(STD_STRING_IS_GOOD) - return a.compare(0, prelen, pre) == 0; -#else - return ::strncmp(a.c_str(), pre.c_str(), prelen) == 0; -#endif + return prelen <= alen && !a.empty() && a.compare(0, prelen, pre) == 0; } @@ -508,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; } @@ -535,16 +513,15 @@ bool suffixIs(string const & a, string const & suf) { size_t const suflen = suf.length(); size_t const alen = a.length(); + return suflen <= alen && a.compare(alen - suflen, suflen, suf) == 0; +} - if (suflen > alen) - return false; -#if !defined(USE_INCLUDED_STRING) && !defined(STD_STRING_IS_GOOD) - string tmp(a, alen - suflen); - return ::strncmp(tmp.c_str(), suf.c_str(), suflen) == 0; -#else - return a.compare(alen - suflen, suflen, suf) == 0; -#endif +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; } @@ -628,14 +605,32 @@ 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 template inline -std::basic_string const subst_char(std::basic_string const & a, +basic_string const subst_char(basic_string const & a, Ch oldchar, Ch newchar) { - typedef std::basic_string String; + typedef basic_string String; String tmp(a); typename String::iterator lit = tmp.begin(); typename String::iterator end = tmp.end(); @@ -664,7 +659,7 @@ template 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(); @@ -679,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(); @@ -723,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; @@ -742,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; @@ -760,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; @@ -777,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; @@ -794,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); @@ -806,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)); @@ -908,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]; @@ -927,7 +922,7 @@ docstring const escape(docstring const & lab) namespace { template vector 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 @@ -944,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); @@ -963,16 +958,18 @@ getVectorFromStringT(String const & str, String const & delim) vector const getVectorFromString(string const & str, - string const & delim) + string const & delim, + bool keepempty) { - return getVectorFromStringT(str, delim); + return getVectorFromStringT(str, delim, keepempty); } vector const getVectorFromString(docstring const & str, - docstring const & delim) + docstring const & delim, + bool keepempty) { - return getVectorFromStringT(str, delim); + return getVectorFromStringT(str, delim, keepempty); } @@ -1031,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(arg1)); return subst(str, from_ascii("%%"), from_ascii("%")); } @@ -1040,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(arg1)); return subst(str, from_ascii("%%"), from_ascii("%")); } @@ -1049,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(arg1)); return subst(str, from_ascii("%%"), from_ascii("%")); } @@ -1058,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("%")); } @@ -1067,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("%")); } @@ -1076,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("%")); @@ -1087,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("%")); @@ -1098,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(arg1)); str = subst(str, from_ascii("%2$d"), convert(arg2)); return subst(str, from_ascii("%%"), from_ascii("%")); @@ -1109,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); @@ -1123,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);