X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=9130f687c8b1c564faaa38c5d6c7c5eef929fdb0;hb=741bd1221aa56a6e278d6f8280a0dd7e2e901cac;hp=e6087cf498457c6d2afb992bbc7ead3b5805a595;hpb=e7c4a0554c3bbe6c33660dc445df7dc8f78c2ce1;p=features.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index e6087cf498..9130f687c8 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -18,43 +18,22 @@ #include "support/docstring.h" +#include #include namespace lyx { namespace support { -/// -int compare_no_case(std::string const & s, std::string const & s2); -int compare_no_case(lyx::docstring const & s, lyx::docstring const & s2); +/// Compare \p s and \p s2, ignoring the case. +/// Does not depend on the locale. +int compare_no_case(docstring const & s, docstring const & s2); -/// +/// Compare \p s and \p s2, ignoring the case of ASCII characters only. int compare_ascii_no_case(std::string const & s, std::string const & s2); -/// -int compare_no_case(std::string const & s, std::string const & s2, unsigned int len); - -/// -inline -int compare(char const * a, char const * b) -{ -#ifndef CXX_GLOBAL_CSTD - return std::strcmp(a, b); -#else - return strcmp(a, b); -#endif -} - -/// -inline -int compare(char const * a, char const * b, unsigned int len) -{ -#ifndef CXX_GLOBAL_CSTD - return std::strncmp(a, b, len); -#else - return strncmp(a, b, len); -#endif -} +/// Compare \p s and \p s2, ignoring the case of ASCII characters only. +int compare_ascii_no_case(docstring const & s, docstring const & s2); /// bool isStrInt(std::string const & str); @@ -65,47 +44,88 @@ bool isStrUnsignedInt(std::string const & str); /// bool isStrDbl(std::string const & str); -/// +bool isHex(docstring const & str); + +int hexToInt(docstring const & str); + +/// is \p str pure ascii? +bool isAscii(docstring const & str); + +/// is \p str pure ascii? +bool isAscii(std::string const & str); + +/** + * Changes the case of \p c to lowercase. + * Don't use this for non-ASCII characters, since it depends on the locale. + * This overloaded function is only implemented because the char_type variant + * would be used otherwise, and we assert in this function that \p c is in + * the ASCII range. + */ char lowercase(char c); -/// +/** + * Changes the case of \p c to uppercase. + * Don't use this for non-ASCII characters, since it depends on the locale. + * This overloaded function is only implemented because the char_type variant + * would be used otherwise, and we assert in this function that \p c is in + * the ASCII range. + */ char uppercase(char c); -/// changes the case only if c is a one-byte char +/// Changes the case of \p c to lowercase. +/// Does not depend on the locale. char_type lowercase(char_type c); -/// changes the case only if c is a one-byte char +/// Changes the case of \p c to uppercase. +/// Does not depend on the locale. char_type uppercase(char_type c); /// same as lowercase(), but ignores locale std::string const ascii_lowercase(std::string const &); +docstring const ascii_lowercase(docstring const &); -/// -std::string const lowercase(std::string const &); +/// Changes the case of \p s to lowercase. +/// Does not depend on the locale. +docstring const lowercase(docstring const & s); -/// -std::string const uppercase(std::string const &); +/// Changes the case of \p s to uppercase. +/// Does not depend on the locale. +docstring const uppercase(docstring const & s); + +/// Does str start with c? +bool prefixIs(docstring const & str, char_type c); -/// Does the std::string start with this prefix? -bool prefixIs(std::string const &, std::string const &); +/// Does str start with pre? +bool prefixIs(std::string const & str, std::string const & pre); +bool prefixIs(docstring const & str, docstring const & pre); /// Does the string end with this char? bool suffixIs(std::string const &, char); +bool suffixIs(docstring const &, char_type); -/// Does the std::string end with this suffix? +/// Does the string end with this suffix? bool suffixIs(std::string const &, std::string const &); +bool suffixIs(docstring const &, docstring const &); /// -template -bool contains(std::string const & a, B b) +inline bool contains(std::string const & a, std::string const & b) +{ + return a.find(b) != std::string::npos; +} + +inline bool contains(docstring const & a, docstring const & b) +{ + return a.find(b) != docstring::npos; +} + +inline bool contains(std::string const & a, char b) { return a.find(b) != std::string::npos; } -template -bool contains(lyx::docstring const & a, B b) +inline bool contains(docstring const & a, char_type b) { - return a.find(b) != lyx::docstring::npos; + return a.find(b) != docstring::npos; } /// @@ -121,8 +141,7 @@ bool containsOnly(std::string const &, std::string const &); */ std::string const token(std::string const & a, char delim, int n); -lyx::docstring const token(lyx::docstring const & a, - lyx::char_type delim, int n); +docstring const token(docstring const & a, char_type delim, int n); /** Search a token in this string using the delim. Doesn't modify the original string. Returns -1 in case of @@ -134,29 +153,29 @@ lyx::docstring const token(lyx::docstring const & a, \endcode */ int tokenPos(std::string const & a, char delim, std::string const & tok); +int tokenPos(docstring const & a, char_type delim, docstring const & tok); /// Substitute all \a oldchar with \a newchar std::string const subst(std::string const & a, char oldchar, char newchar); /// Substitute all \a oldchar with \a newchar -lyx::docstring const subst(docstring const & a, - lyx::char_type oldchar, lyx::char_type newchar); +docstring const subst(docstring const & a, char_type oldchar, char_type newchar); /// substitutes all instances of \a oldstr with \a newstr std::string const subst(std::string const & a, std::string const & oldstr, std::string const & newstr); /// substitutes all instances of \a oldstr with \a newstr -lyx::docstring const subst(lyx::docstring const & a, - lyx::docstring const & oldstr, lyx::docstring const & newstr); +docstring const subst(docstring const & a, + docstring const & oldstr, docstring const & newstr); /** Trims characters off the end and beginning of a string. \code trim("ccabccc", "c") == "ab". \endcode */ -lyx::docstring const trim(lyx::docstring const & a, char const * p = " "); +docstring const trim(docstring const & a, char const * p = " "); /** Trims characters off the end and beginning of a string. \code @@ -165,30 +184,37 @@ lyx::docstring const trim(lyx::docstring const & a, char const * p = " "); */ std::string const trim(std::string const & a, char const * p = " "); -/** Trims characters off the end of a string. +/** Trims characters off the end of a string, removing any character + in p. \code - rtrim("abccc", "c") == "ab". + rtrim("abcde", "dec") == "ab". \endcode */ std::string const rtrim(std::string const & a, char const * p = " "); +docstring const rtrim(docstring const & a, char const * p = " "); /** Trims characters off the beginning of a string. \code - ltrim("ababcdef", "ab") = "cdef" + ("abbabcdef", "ab") = "cdef" \endcode */ std::string const ltrim(std::string const & a, char const * p = " "); - -/** Splits the string by the first delim. - Splits the string by the first appearance of delim. - The leading string up to delim is returned in piece (not including - delim), while the original string is cut from after the delimiter. - Example: +docstring const ltrim(docstring const & a, char const * p = " "); + +/** Splits the string given in the first argument at the first occurence + of the third argumnent, delim. + What precedes delim is returned in the second argument, piece; this + will be the whole of the string if no delimiter is found. + The return value is what follows delim, if anything. So the return + value is the null string if no delimiter is found. + Examples: \code - s1= ""; s2= "a;bc".split(s1, ';') -> s1 == "a"; s2 == "bc"; + s1= "a;bc"; s2= "" + ret = split(s1, s2, ';') -> ret = "bc", s2 == "a" \endcode -*/ + */ std::string const split(std::string const & a, std::string & piece, char delim); +docstring const split(docstring const & a, docstring & piece, char_type delim); /// Same as split but does not return a piece std::string const split(std::string const & a, char delim); @@ -196,12 +222,17 @@ std::string const split(std::string const & a, char delim); /// Same as split but uses the last delim. std::string const rsplit(std::string const & a, std::string & piece, char delim); -/// Escapes non ASCII chars -std::string const escape(std::string const & lab); +/// Escapes non ASCII chars and other problematic characters that cause +/// problems in latex labels. +docstring const escape(docstring const & lab); /// gives a vector of stringparts which have the delimiter delim +/// If \p keepempty is true, empty strings will be pushed to the vector as well std::vector const getVectorFromString(std::string const & str, - std::string const & delim = std::string(",")); + std::string const & delim = std::string(","), + bool keepempty = false); +std::vector const getVectorFromString(docstring const & str, + docstring const & delim = from_ascii(","), bool keepempty = false); // the same vice versa std::string const getStringFromVector(std::vector const & vec, @@ -212,58 +243,36 @@ std::string const getStringFromVector(std::vector const & vec, int findToken(char const * const str[], std::string const & search_token); /// Convert internal line endings to line endings as expected by the OS -lyx::docstring const externalLineEnding(lyx::docstring const & str); +docstring const externalLineEnding(docstring const & str); /// Convert line endings in any formnat to internal line endings -lyx::docstring const internalLineEnding(lyx::docstring const & str); +docstring const internalLineEnding(docstring const & str); -#ifdef I_AM_NOT_AFRAID_OF_HEADER_LIBRARIES - -#include - -template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1 arg1) -{ - return (boost::basic_format(fmt) % arg1).str(); -} - - -template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1 arg1, Arg2 arg2) -{ - return (boost::basic_format(fmt) % arg1 % arg2).str(); -} - - -template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1 arg1, Arg2 arg2, Arg3 arg3) -{ - return (boost::basic_format(fmt) % arg1 % arg2 % arg3).str(); -} - - -template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) -{ - return (boost::basic_format(fmt) % arg1 % arg2 % arg3 % arg4).str(); -} - -#else - template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1); +docstring bformat(docstring const & fmt, Arg1); template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1, Arg2); +docstring bformat(docstring const & fmt, Arg1, Arg2); template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1, Arg2, Arg3); +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3); template -lyx::docstring bformat(lyx::docstring const & fmt, Arg1, Arg2, Arg3, Arg4); +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3, Arg4); + + +template<> docstring bformat(docstring const & fmt, int arg1); +template<> docstring bformat(docstring const & fmt, long arg1); +template<> docstring bformat(docstring const & fmt, unsigned int arg1); +template<> docstring bformat(docstring const & fmt, docstring arg1); +template<> docstring bformat(docstring const & fmt, char * arg1); +template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2); +template<> docstring bformat(docstring const & fmt, char const * arg1, docstring arg2); +template<> docstring bformat(docstring const & fmt, int arg1, int arg2); +template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3); +template<> docstring bformat(docstring const & fmt, docstring arg1, docstring arg2, docstring arg3, docstring arg4); -#endif } // namespace support } // namespace lyx