common/Util.hpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
New commits: commit 8e784f2bdd9cc789fe896a31d13d22aa8d39e0bb Author: Ashod Nakashian <[email protected]> AuthorDate: Sat Jun 20 14:06:41 2020 -0400 Commit: Ashod Nakashian <[email protected]> CommitDate: Tue Jun 23 06:38:34 2020 +0200 wsd: tokenization and hexify utils Change-Id: I3a8eb39092ad5ed1a8589c05a893fd0ce6445e8b Reviewed-on: https://gerrit.libreoffice.org/c/online/+/96827 Tested-by: Jenkins Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Ashod Nakashian <[email protected]> diff --git a/common/Util.hpp b/common/Util.hpp index 9c82b3068..f6ca50825 100644 --- a/common/Util.hpp +++ b/common/Util.hpp @@ -224,6 +224,21 @@ namespace Util return os.str(); } + /// Dump a string as hex by splitting on multiple lines per width. + /// Useful for debugging and logging data that contain non-printables. + inline std::string stringifyHexLine(const std::string& s, const std::size_t width = 16) + { + std::ostringstream oss; + for (std::size_t i = 0; i < s.size(); i += width) + { + const std::size_t rem = std::min(width, s.size() - i); + oss << stringifyHexLine(std::vector<char>(s.data(), s.data() + s.size()), i, rem); + oss << '\n'; + } + + return oss.str(); + } + /// Dump data as hex and chars to stream inline void dumpHex (std::ostream &os, const char *legend, const char *prefix, const std::vector<char> &buffer, bool skipDup = true, @@ -433,6 +448,39 @@ namespace Util return StringVector(s, std::move(tokens)); } + /// Tokenize by the delimiter string. + inline StringVector tokenize(const std::string& s, const char* delimiter, int len = -1) + { + if (s.empty() || len == 0 || delimiter == nullptr || *delimiter == '\0') + return StringVector(); + + if (len < 0) + len = std::strlen(delimiter); + + std::size_t start = 0; + std::size_t end = s.find(delimiter, start); + + std::vector<StringToken> tokens; + tokens.reserve(16); + + tokens.emplace_back(start, end - start); + start = end + len; + + while (end != std::string::npos) + { + end = s.find(delimiter, start); + tokens.emplace_back(start, end - start); + start = end + len; + } + + return StringVector(s, std::move(tokens)); + } + + inline StringVector tokenize(const std::string& s, const std::string& delimiter) + { + return tokenize(s, delimiter.data(), delimiter.size()); + } + /** Tokenize based on any of the characters in 'delimiters'. Ie. when there is '\n\r' in there, any of them means a delimiter. _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
