X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=87e7f242fd7691785e12966ba4f5ad98f444537b;hb=e4c3ce462791c85922d919f8859e3408f57d10fa;hp=51dc20ad91136ecb7dde44084f735799bad83b75;hpb=d31244b5e2c29b5c03f38272e6a1ff51a1197b5c;p=lyx.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 51dc20ad91..87e7f242fd 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -7,7 +7,7 @@ * \author Lars Gullik Bjønnes * \author Jean-Marc Lasgouttes * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. * * A collection of string helper functions that works with string. * Some of these would certainly benefit from a rewrite/optimization. @@ -16,20 +16,26 @@ #ifndef LSTRINGS_H #define LSTRINGS_H +#include "support/docstring.h" + #include -#include "Lsstream.h" -#include "LString.h" +namespace lyx { +namespace support { + +/// +int compare_no_case(std::string const & s, std::string const & s2); +int compare_no_case(docstring const & s, docstring const & s2); /// -int compare_no_case(string const & s, string const & s2); +int compare_ascii_no_case(std::string const & s, std::string const & s2); /// -int compare_ascii_no_case(string const & s, string const & s2); +int compare_ascii_no_case(docstring const & s, docstring const & s2); /// -int compare_no_case(string const & s, string const & s2, unsigned int len); +int compare_no_case(std::string const & s, std::string const & s2, unsigned int len); /// inline @@ -54,22 +60,20 @@ int compare(char const * a, char const * b, unsigned int len) } /// -bool isStrInt(string const & str); +bool isStrInt(std::string const & str); -/// does the string represent an unsigned integer value ? -bool isStrUnsignedInt(string const & str); +/// does the std::string represent an unsigned integer value ? +bool isStrUnsignedInt(std::string const & str); /// -int strToInt(string const & str); +bool isStrDbl(std::string const & str); -/// convert string to an unsigned integer -unsigned int strToUnsignedInt(string const & str); +bool isHex(lyx::docstring const & str); -/// -bool isStrDbl(string const & str); +int hexToInt(lyx::docstring const & str); -/// -double strToDbl(string const & str); +/// is \p str pure ascii? +bool isAscii(docstring const & str); /// char lowercase(char c); @@ -77,81 +81,56 @@ char lowercase(char c); /// char uppercase(char c); +/// changes the case only if c is a one-byte char +char_type lowercase(char_type c); + +/// changes the case only if c is a one-byte char +char_type uppercase(char_type c); + /// same as lowercase(), but ignores locale -string const ascii_lowercase(string const &); +std::string const ascii_lowercase(std::string const &); +docstring const ascii_lowercase(docstring const &); /// -string const lowercase(string const &); +std::string const lowercase(std::string const &); +docstring const lowercase(docstring const &); /// -string const uppercase(string const &); +std::string const uppercase(std::string const &); -/// convert \a T to string -template -inline -string const tostr(T const & t) -{ - ostringstream ostr; - ostr << t; - return STRCONV(ostr.str()); - // We need to use the .c_str since we sometimes are using - // our own string class and that is not compatible with - // basic_string. (of course we don't want this later) -} +/// Does the std::string start with this prefix? +bool prefixIs(std::string const &, std::string const &); +bool prefixIs(lyx::docstring const &, lyx::docstring const &); + +/// Does the string end with this char? +bool suffixIs(std::string const &, char); +/// Does the std::string end with this suffix? +bool suffixIs(std::string const &, std::string const &); /// -template<> -inline -string const tostr(bool const & b) +inline bool contains(std::string const & a, std::string const & b) { - return (b ? "true" : "false"); + return a.find(b) != std::string::npos; } -/// -template<> -inline -string const tostr(string const & s) +inline bool contains(docstring const & a, docstring const & b) { - return s; + return a.find(b) != docstring::npos; } -/// Does the string start with this prefix? -bool prefixIs(string const &, char const *); - -/// Does the string start with this prefix? -bool prefixIs(string const &, string const &); - -/// Does the string end with this char? -bool suffixIs(string const &, char); - -/// Does the string end with this suffix? -bool suffixIs(string const &, char const *); - -/// Does the string end with this suffix? -bool suffixIs(string const &, string const &); - -/// -bool contains(string const & a, string const & b); - -/// -bool contains(string const & a, char b); - -/// This should probably we rewritten to be more general. -class contains_functor { -public: - typedef string first_argument_type; - typedef string second_argument_type; - typedef bool result_type; - - bool operator()(string const & haystack, string const & needle) const { - return contains(haystack, needle); - } -}; +inline bool contains(std::string const & a, char b) +{ + return a.find(b) != std::string::npos; +} +inline bool contains(docstring const & a, char_type b) +{ + return a.find(b) != docstring::npos; +} /// -bool containsOnly(string const &, string const &); +bool containsOnly(std::string const &, std::string const &); /** Extracts a token from this string at the nth delim. Doesn't modify the original string. Similar to strtok. @@ -161,8 +140,9 @@ bool containsOnly(string const &, string const &); token("a;bc;d", ';', 2) == "d"; \endcode */ -string const token(string const & a, char delim, int n); +std::string const token(std::string const & a, char 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 @@ -173,45 +153,52 @@ string const token(string const & a, char delim, int n); tokenPos("a;bc;d", ';', "d") == 2; \endcode */ -int tokenPos(string const & a, char delim, string const & tok); +int tokenPos(std::string const & a, char delim, std::string const & tok); -/** Compares a string and a (simple) regular expression - The only element allowed is "*" for any string of characters - */ -bool regexMatch(string const & a, string const & pattern); +/// 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 -string const subst(string const & a, char oldchar, char newchar); +docstring const subst(docstring const & a, char_type oldchar, char_type newchar); -/// Substitutes all instances of \a oldstr with \a newstr -string const subst(string const & a, - char const * oldstr, string const & newstr); +/// 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 -string const subst(string const & a, - string const & oldstr, string 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 +*/ +docstring const trim(docstring const & a, char const * p = " "); /** Trims characters off the end and beginning of a string. \code trim("ccabccc", "c") == "ab". \endcode */ -string const trim(string const & a, char const * p = " "); +std::string const trim(std::string const & a, char const * p = " "); /** Trims characters off the end of a string. \code rtrim("abccc", "c") == "ab". \endcode */ -string const rtrim(string const & a, char const * p = " "); +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" + ("ababcdef", "ab") = "cdef" \endcode */ -string const ltrim(string const & a, char const * p = " "); +std::string const ltrim(std::string const & a, char const * p = " "); +docstring const ltrim(docstring const & a, char const * p = " "); /** Splits the string by the first delim. Splits the string by the first appearance of delim. @@ -222,34 +209,88 @@ string const ltrim(string const & a, char const * p = " "); s1= ""; s2= "a;bc".split(s1, ';') -> s1 == "a"; s2 == "bc"; \endcode */ -string const split(string const & a, string & piece, char delim); +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 -string const split(string const & a, char delim); +std::string const split(std::string const & a, char delim); /// Same as split but uses the last delim. -string const rsplit(string const & a, string & piece, char delim); +std::string const rsplit(std::string const & a, std::string & piece, char delim); -/// Escapes non ASCII chars -string const escape(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 -std::vector const getVectorFromString(string const & str, - string const & delim = ","); +std::vector const getVectorFromString(std::string const & str, + std::string const & delim = std::string(",")); +std::vector const getVectorFromString(docstring const & str, + docstring const & delim = from_ascii(",")); // the same vice versa -string const getStringFromVector(std::vector const & vec, - string const & delim = ","); - -// wrapper around boost::format using one argument %1$s -string bformat(char const * fmt, string const & arg1); -// arguments %1$s and %2$s -string bformat(char const * fmt, string const & arg1, string const & arg2); -// arguments %1$s and %2$s and %3$s -string bformat(char const * fmt, string const & arg1, string const & arg2, - string const & arg3); -// arguments %1$s and %2$s and %3$s and %4$s -string bformat(char const * fmt, string const & arg1, string const & arg2, - string const & arg3, string const & arg4); +std::string const getStringFromVector(std::vector const & vec, + std::string const & delim = std::string(",")); + +/// Search \p search_token in \p str and return the position if it is +/// found, else -1. The last item in \p str must be "". +int findToken(char const * const str[], std::string const & search_token); + +/// Convert internal line endings to line endings as expected by the OS +docstring const externalLineEnding(docstring const & str); + +/// Convert line endings in any formnat to internal line endings +docstring const internalLineEnding(docstring const & str); + + +#ifdef I_AM_NOT_AFRAID_OF_HEADER_LIBRARIES + +#include + +template +docstring bformat(docstring const & fmt, Arg1 arg1) +{ + return (boost::basic_format(fmt) % arg1).str(); +} + + +template +docstring bformat(docstring const & fmt, Arg1 arg1, Arg2 arg2) +{ + return (boost::basic_format(fmt) % arg1 % arg2).str(); +} + + +template +docstring bformat(docstring const & fmt, Arg1 arg1, Arg2 arg2, Arg3 arg3) +{ + return (boost::basic_format(fmt) % arg1 % arg2 % arg3).str(); +} + + +template +docstring bformat(docstring const & fmt, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) +{ + return (boost::basic_format(fmt) % arg1 % arg2 % arg3 % arg4).str(); +} + +#else + +template +docstring bformat(docstring const & fmt, Arg1); + +template +docstring bformat(docstring const & fmt, Arg1, Arg2); + +template +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3); + +template +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3, Arg4); + +#endif + +} // namespace support +} // namespace lyx #endif