====== Stringutils ======
Helper rund um die Strings.
**stringutils.h**
#ifdef OS_WINDOWS
#define STRING_COMPARE_IGNORE_CASE _stricmp
#else
#define STRING_COMPARE_IGNORE_CASE strcasecmp
#endif // #ifdef OS_WINDOWS
namespace utils
{
class stringutils // Helper rund um die Strings.
{
public:
stringutils() = delete;
~stringutils() = delete;
public:
static const char* const WHITESPACE;
static const char* const EMPTY;
public:
static const string::size_type npos; // Ersatz für "string::npos", welches wegen des DLL-Imports/Link-Problemen nicht verwendet werden kann.
public:
static std::vector split_lines(const string &s); // Trennt den String nach Zeilen.
static std::vector split(const string &s, char delim, int count = INT_MAX); // Trennt den String nach dem Zeichen.
static string trim(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen links und rechts ab.
static string trim_left(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen links ab.
static string trim_right(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen rechts ab.
static string pad_right(const string& s, char c); // Hängt ein Zeichen an, wenn es noch nicht vorhanden ist.
static string pad_right(const string& s, size_t size, const char c = ' '); // Ergänzt fehlendes Padding.
static string pad_left(const string& s, char c); // Ergänzt ein Zeichen links, wenn es noch nicht vorhanden ist.
static string pad_left(const string& s, size_t size, const char c = ' '); // Ergänzt fehlendes Padding links.
static string to_upper(const string &s); // Wandelt den String in Grossbuchstaben um.
static string replace(const string &s, const string &old, const string &newText); // Ersetzt Teilstrings durch neue Strings.
static int compare_nocase(const string &s1, const string &s2);
private:
static std::vector& split(const string &s, char delim, std::vector &elems, int count);
static std::vector& split_lines(const string &s, std::vector &elems);
}; // class stringutils
// --- inlines ---
inline std::vector stringutils::split(const string &s, char delim, int count)
{
std::vector elems;
split(s, delim, elems, count);
return elems;
} // split()
inline std::vector stringutils::split_lines(const string &s)
{
std::vector elems;
split_lines(s, elems);
return elems;
} // split_lines()
inline string stringutils::trim_left(const string& s, const char* trimChars)
{
size_t startpos = s.find_first_not_of(trimChars ? trimChars : WHITESPACE);
return (startpos == string::npos) ? EMPTY : ((startpos == 0) ? s : s.substr(startpos));
} // trim_left()
inline string stringutils::trim_right(const string& s, const char* trimChars)
{
size_t endpos = s.find_last_not_of(trimChars ? trimChars : WHITESPACE);
return (endpos == string::npos) ? EMPTY : ((endpos == s.length() - 1) ? s : s.substr(0, endpos + 1));
} // trim_right()
inline string stringutils::trim(const string& s, const char* trimChars)
{
size_t startpos = s.find_first_not_of(trimChars ? trimChars : WHITESPACE);
if (startpos == string::npos)
return EMPTY;
size_t endpos = s.find_last_not_of(trimChars ? trimChars : WHITESPACE);
if ((startpos == 0) && (endpos == s.length() - 1))
return s;
return s.substr(startpos, endpos - startpos + 1);
} // trim()
inline string stringutils::pad_right(const string& s, char c)
{
if (s.empty())
return s;
if (s[s.length() - 1] == c)
return s;
return s + c;
} // pad_right()
inline string stringutils::pad_right(const string& s, size_t size, char c)
{
if (s.length() >= size)
return s;
string ss = s;
ss.resize(size, c);
return ss;
} // pad_right()
inline string stringutils::pad_left(const string& s, char c)
{
if (s.empty())
return s;
if (s[0] == c)
return s;
return c + s;
} // pad_left()
inline string stringutils::pad_left(const string& s, size_t size, char c)
{
if (s.length() >= size)
return s;
return string(size - s.length(), c) + s;
} // pad_left()
inline string stringutils::to_upper(const string &s)
{
string t = s;
#ifdef OS_UNIX_AIX
std::transform(t.begin(), t.end(), t.begin(), (int (*)(int))std::toupper);
#else
std::transform(t.begin(), t.end(), t.begin(), ::toupper);
#endif
return t;
} // to_upper()
inline int stringutils::compare_nocase(const string &s1, const string &s2)
{
return STRING_COMPARE_IGNORE_CASE(s1.c_str(), s2.c_str());
} // compare_nocase()
} // namespace utils
// EOF
**stringutils.cpp**
namespace utils
{
const char* const stringutils::WHITESPACE = " \n\r\t";
const char* const stringutils::EMPTY = "";
const string::size_type stringutils::npos = string::npos;
std::vector& stringutils::split(const string &s, char delim, std::vector &elems, int count)
{
const char* current = s.c_str();
const char* to;
int cnt = 0;
while (current != nullptr)
{
++cnt;
if (cnt >= count)
{
to = nullptr;
}
else
{
to = strchr(current, delim);
}
if (to == nullptr)
{
elems.push_back(current);
break;
}
elems.push_back(string(current, to));
current = to + 1;
}
return elems;
} // split()
std::vector& stringutils::split_lines(const string &s, std::vector &elems)
{
std::stringstream ss(s);
string item;
while (std::getline(ss, item))
elems.push_back(item);
return elems;
} // split_lines()
string stringutils::replace(const string &s, const string &old, const string &newText)
{
string result = s;
auto len = old.length();
auto pos = result.find(old);
while (pos != string::npos)
{
result.replace(pos, len, newText);
pos = result.find(old);
}
return result;
} // replace()
} // namespace utils
// EOF
----
Stand: 30.10.2018\\
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF