X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flstrings.h;h=9130f687c8b1c564faaa38c5d6c7c5eef929fdb0;hb=741bd1221aa56a6e278d6f8280a0dd7e2e901cac;hp=3f47c4820b4cb8b06ba8ed4739bfef0506382d09;hpb=f7a3d05a2374043f8f1842051a377dd40c3c3464;p=features.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index 3f47c4820b..9130f687c8 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -1,212 +1,280 @@ // -*- C++ -*- - -/* - This is a collection of string helper functions that works - together with string (and later also with STL String. Some of these - would certainly benefit from a rewrite/optimization. -*/ +/** + * \file lstrings.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * + * 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. + */ #ifndef LSTRINGS_H #define LSTRINGS_H -#ifdef __GNUG__ -#pragma interface -#endif +#include "support/docstring.h" -#include -#include +#include +#include -#include "Lsstream.h" -#include "LString.h" +namespace lyx { +namespace support { +/// 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); -/// -int compare_no_case(string const & s, string 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(string const & s, string const & s2, unsigned int len); +/// Compare \p s and \p s2, ignoring the case of ASCII characters only. +int compare_ascii_no_case(docstring const & s, docstring const & s2); /// -inline -int compare(char const * a, char const * b) -{ - return strcmp(a, b); -} +bool isStrInt(std::string const & str); -/// -inline -int compare(char const * a, char const * b, unsigned int len) -{ - return strncmp(a, b, len); -} +/// does the std::string represent an unsigned integer value ? +bool isStrUnsignedInt(std::string const & str); /// -bool isStrInt(string const & str); +bool isStrDbl(std::string const & str); -/// does the string represent an unsigned integer value ? -bool isStrUnsignedInt(string const & str); +bool isHex(docstring const & str); -/// -int strToInt(string const & str); +int hexToInt(docstring const & str); -/// convert string to an unsigned integer -unsigned int strToUnsignedInt(string const & str); +/// is \p str pure ascii? +bool isAscii(docstring const & str); -/// -bool isStrDbl(string const & str); +/// is \p str pure ascii? +bool isAscii(std::string const & str); -/// -double strToDbl(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); -/// -string const lowercase(string const &); +/// Changes the case of \p c to lowercase. +/// Does not depend on the locale. +char_type lowercase(char_type c); -/// -string const uppercase(string const &); +/// 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 &); + +/// Changes the case of \p s to lowercase. +/// Does not depend on the locale. +docstring const lowercase(docstring const & s); + +/// 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 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); -/// convert T to string -template -inline -string const tostr(T const & t) +/// Does the string end with this suffix? +bool suffixIs(std::string const &, std::string const &); +bool suffixIs(docstring const &, docstring const &); + +/// +inline bool contains(std::string const & a, std::string const & b) { - ostringstream ostr; - ostr << t; - return ostr.str().c_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) + return a.find(b) != std::string::npos; } +inline bool contains(docstring const & a, docstring const & b) +{ + return a.find(b) != docstring::npos; +} -/// -template<> -inline -string const tostr(bool const & b) +inline bool contains(std::string const & a, char 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, char_type b) { - return s; + return a.find(b) != docstring::npos; } -/// Does the string start with this prefix? -bool prefixIs(string const &, char const *); +/// +bool containsOnly(std::string const &, std::string const &); -/// Does the string start with this prefix? -bool prefixIs(string const &, string const &); +/** Extracts a token from this string at the nth delim. + Doesn't modify the original string. Similar to strtok. + Example: + \code + token("a;bc;d", ';', 1) == "bc"; + token("a;bc;d", ';', 2) == "d"; + \endcode +*/ +std::string const token(std::string const & a, char delim, int n); -/// Does the string end with this char? -bool suffixIs(string const &, char); +docstring const token(docstring const & a, char_type delim, int n); -/// Does the string end with this suffix? -bool suffixIs(string const &, char const *); +/** Search a token in this string using the delim. + Doesn't modify the original string. Returns -1 in case of + failure. + Example: + \code + tokenPos("a;bc;d", ';', "bc") == 1; + tokenPos("a;bc;d", ';', "d") == 2; + \endcode +*/ +int tokenPos(std::string const & a, char delim, std::string const & tok); +int tokenPos(docstring const & a, char_type delim, docstring const & tok); -/// Does the string end with this suffix? -bool suffixIs(string const &, string const &); -/// -bool contains(char const * a, string const & b); +/// Substitute all \a oldchar with \a newchar +std::string const subst(std::string const & a, char oldchar, char newchar); -/// -bool contains(string const & a, char const * b); +/// Substitute all \a oldchar with \a newchar +docstring const subst(docstring const & a, char_type oldchar, char_type newchar); -/// -bool contains(string const & a, string const & b); +/// 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); -/// -bool contains(string const & a, char b); +/// substitutes all instances of \a oldstr with \a newstr +docstring const subst(docstring const & a, + docstring const & oldstr, docstring const & newstr); -/// -bool contains(char const * a, char const * b); +/** 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 = " "); -/// -bool containsOnly(string const &, char const *); +/** Trims characters off the end and beginning of a string. + \code + trim("ccabccc", "c") == "ab". + \endcode +*/ +std::string const trim(std::string const & a, char const * p = " "); -/// -bool containsOnly(string const &, string const &); +/** Trims characters off the end of a string, removing any character + in p. + \code + 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 = " "); -/// -bool containsOnly(char const *, char const *); +/** Trims characters off the beginning of a string. + \code + ("abbabcdef", "ab") = "cdef" + \endcode +*/ +std::string const ltrim(std::string const & a, char const * p = " "); +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= "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); -/// -bool containsOnly(char const *, string const &); +/// Same as split but does not return a piece +std::string const split(std::string const & a, char delim); -/// Counts how many of character c there is in a -string::size_type countChar(string const & a, char c); +/// Same as split but uses the last delim. +std::string const rsplit(std::string const & a, std::string & piece, char delim); -/** Extracts a token from this string at the nth delim. - Doesn't modify the original string. Similar to strtok. - Example: - #"a;bc;d".token(';', 1) == "bc";# - #"a;bc;d".token(';', 2) == "d";# -*/ -string const token(string const & a, char delim, int n); +/// 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(","), + bool keepempty = false); +std::vector const getVectorFromString(docstring const & str, + docstring const & delim = from_ascii(","), bool keepempty = false); -/** Search a token in this string using the delim. - Doesn't modify the original string. Returns -1 in case of - failure. - Example: - #"a;bc;d".tokenPos(';', "bc") == 1;# - #"a;bc;d".token(';', "d") == 2;# -*/ -int tokenPos(string const & a, char delim, string const & tok); +// the same vice versa +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); -/** 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); +/// Convert internal line endings to line endings as expected by the OS +docstring const externalLineEnding(docstring const & str); -/// Substitute all "oldchar"s with "newchar" -string const subst(string const & a, char oldchar, char newchar); +/// Convert line endings in any formnat to internal line endings +docstring const internalLineEnding(docstring const & str); -/// Substitutes all instances of oldstr with newstr -string const subst(string const & a, - char const * oldstr, string const & newstr); -/// substitutes all instances ofr oldstr with newstr -string const subst(string const & a, - string const & oldstr, string const & newstr); +template +docstring bformat(docstring const & fmt, Arg1); -/** Strips characters off the end of a string. - #"abccc".strip('c') = "ab".# - */ -string const strip(string const & a, char c = ' '); +template +docstring bformat(docstring const & fmt, Arg1, Arg2); -/** Strips characters of the beginning of a string. - #"cccba".frontstrip('c') = "ba"#. */ -string const frontStrip(string const & a, char c = ' '); +template +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3); -/** Strips characters off the beginning of a string. - #"ababcdef".frontstrip("ab") = "cdef"# .*/ -string const frontStrip(string const & a, char const * p); +template +docstring bformat(docstring const & fmt, Arg1, Arg2, Arg3, Arg4); -/** 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: - #s1= ""; s2= "a;bc".split(s1, ';') -> s1 == "a"; s2 == "bc";# - */ -string const split(string const & a, string & piece, char delim); -/// Same as split but does not return a piece -string const split(string const & a, char delim); +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); -/// Same as split but uses the last delim. -string const rsplit(string const & a, string & piece, char delim); + +} // namespace support +} // namespace lyx #endif