X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsupport%2Flstrings.h;h=8bcee0ae2389bde9df13b68d24963ce1ce06e789;hb=043298544c6338b3de3503876d17054faef149fc;hp=b51d33a84f5b1ad64fbcb23571c1ce2a383bcd3f;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/support/lstrings.h b/src/support/lstrings.h index b51d33a84f..8bcee0ae23 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -1,162 +1,177 @@ // -*- C++ -*- -/** This is a collection of string helper functions that works +/** String helper functions. + \file lstrings.h + 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. + \author Lars Gullik Bjønnes + \author Jean-Marc Lasgouttes */ #ifndef LSTRINGS_H #define LSTRINGS_H -#include +#ifdef __GNUG__ +#pragma interface +#endif -//#warning verify this please. Lgb -/// -template -size_t lstrlen(T const * t) -{ - Assert(t); // we don't want null pointers - size_t count = 0; - T const * r = t; - while(*r != 0) ++r, ++count; - return count; -} +#include +#include "Lsstream.h" -//#warning verify this please. Lgb -/// -template -T * lstrchr(T const * t, int c) -{ - Assert(t); // we don't want null pointers - T * r = const_cast(t); - while(*r != 0) - if (*r == c) return r; else ++r; - return 0; -} - -#include #include "LString.h" /// -inline int compare_no_case(string const & s, string const & s2) -{ - // ANSI C - string::const_iterator p = s.begin(); - string::const_iterator p2 = s2.begin(); - - while (p != s.end() && p2 != s2.end()) { - if (tolower(*p) != tolower(*p2)) - return (tolower(*p) < tolower(*p2)) ? -1 : 1; - ++p; - ++p2; - } +int compare_no_case(string const & s, string const & s2); - return s.size() - s2.size(); -} +/// +int compare_ascii_no_case(string const & s, string const & s2); /// -inline int compare_no_case(string const & s, string const & s2, - unsigned int len) -{ -//#warning verify this func please - string::const_iterator p = s.begin(); - string::const_iterator p2 = s2.begin(); - unsigned int i = 0; - while (i < len && p != s.end() && p2 != s2.end()) { - if (tolower(*p) != tolower(*p2)) - return (tolower(*p) < tolower(*p2)) ? -1 : 1; - ++i; - ++p; - ++p2; - } - return s.size() - s2.size(); -} +int compare_no_case(string const & s, string const & s2, unsigned int len); /// -inline int compare(char const * a, char const * b) +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) +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 } /// bool isStrInt(string const & str); +/// does the string represent an unsigned integer value ? +bool isStrUnsignedInt(string const & str); + /// int strToInt(string const & str); +/// convert string to an unsigned integer +unsigned int strToUnsignedInt(string const & str); + /// -string lowercase(string const &); +bool isStrDbl(string const & str); -/// int to string -string tostr(int i); +/// +double strToDbl(string const & str); /// -string tostr(unsigned int); +char lowercase(char c); -/// long to string -string tostr(long l); +/// +char uppercase(char c); + +/// same as lowercase(), but ignores locale +string const ascii_lowercase(string const &); /// -string tostr(unsigned long l); +string const lowercase(string const &); /// -string tostr(char c); +string const uppercase(string const &); -/// void* to string -string tostr(void* v); +/// convert \a T to string +template +inline +string const tostr(T const & t) +{ + 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) +} -/// bool to string -string tostr(bool b); /// -string tostr(double d); +template<> +inline +string const tostr(bool const & b) +{ + return (b ? "true" : "false"); +} + +/// +template<> +inline +string const tostr(string const & s) +{ + return s; +} /// 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 *); -/// -bool contains(char const * a, string const & b); - -/// -bool contains(string const & a, char const * b); +/// Does the string end with this suffix? +bool suffixIs(string const &, string const &); /// bool contains(string const & a, string const & b); /// -bool contains(char const * a, char 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); + } +}; -/// Counts how many of character c there is in a -int countChar(string const & a, char const c); + +/// +bool containsOnly(string const &, string const &); /** 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";# + Doesn't modify the original string. Similar to strtok. + Example: + \code + token("a;bc;d", ';', 1) == "bc"; + token("a;bc;d", ';', 2) == "d"; + \endcode */ -string token(string const & a, char delim, int n); +string const token(string const & a, char delim, int n); /** 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;# + 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(string const & a, char delim, string const & tok); @@ -166,39 +181,64 @@ int tokenPos(string const & a, char delim, string const & tok); */ bool regexMatch(string const & a, string const & pattern); -/// Substitute all "oldchar"s with "newchar" -string subst(string const & a, char oldchar, char newchar); +/// Substitute all \a oldchar with \a newchar +string const subst(string const & a, char oldchar, char newchar); -/// Substitutes all instances of oldstr with newstr -string subst(string const & a, - char const * oldstr, string const & newstr); +/// Substitutes all instances of \a oldstr with \a newstr +string const subst(string const & a, + char const * oldstr, string const & newstr); -/** Strips characters off the end of a string. - #"abccc".strip('c') = "ab".# - */ -string strip(string const & a, char const c = ' '); +/// substitutes all instances of \a oldstr with \a newstr +string const subst(string const & a, + string const & oldstr, string const & newstr); -/** Strips characters of the beginning of a string. - #"cccba".frontstrip('c') = "ba"#. */ -string frontStrip(string const & a, char const c = ' '); +/** 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 = " "); + +/** Trims characters off the end of a string. + \code + rtrim("abccc", "c") == "ab". + \endcode +*/ +string const rtrim(string const & a, char const * p = " "); -/** Strips characters off the beginning of a string. - #"ababcdef".frontstrip("ab") = "cdef"# .*/ -string frontStrip(string const & a, char const * p); +/** Trims characters off the beginning of a string. + \code + ltrim("ababcdef", "ab") = "cdef" + \endcode +*/ +string const ltrim(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: - #s1=""; s2="a;bc".split(s1, ';') -> s1=="a"; s2 == "bc";# - */ -string split(string const & a, string & piece, char 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: + \code + s1= ""; s2= "a;bc".split(s1, ';') -> s1 == "a"; s2 == "bc"; + \endcode +*/ +string const split(string const & a, string & piece, char delim); /// Same as split but does not return a piece -string split(string const & a, char delim); +string const split(string const & a, char delim); /// Same as split but uses the last delim. -string rsplit(string const & a, string & piece, char delim); +string const rsplit(string const & a, string & piece, char delim); + +/// Escapes non ASCII chars +string const escape(string const & lab); + +/// gives a vector of stringparts which have the delimiter delim +std::vector const getVectorFromString(string const & str, + string const & delim = ","); + +// the same vice versa +string const getStringFromVector(std::vector const & vec, + string const & delim = ","); #endif