summaryrefslogtreecommitdiffstats
path: root/src/base/string_util.hh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/base/string_util.hh68
1 files changed, 67 insertions, 1 deletions
diff --git a/src/base/string_util.hh b/src/base/string_util.hh
index 73a8b87..886fb6c 100644
--- a/src/base/string_util.hh
+++ b/src/base/string_util.hh
@@ -100,7 +100,12 @@ endswith(const std::string& str, const char (&suffix)[N])
void truncate_to(std::string& str, size_t max_char_len);
-std::string scrub_ws(const char* in);
+std::string scrub_ws(const char* in, ssize_t len = -1);
+inline std::string
+scrub_ws(const string_fragment& sf)
+{
+ return scrub_ws(sf.data(), sf.length());
+}
inline std::string
trim(const std::string& str)
@@ -115,6 +120,16 @@ trim(const std::string& str)
return str.substr(start, end - start);
}
+inline const char*
+ltrim(const char* str)
+{
+ while (isspace(*str)) {
+ str += 1;
+ }
+
+ return str;
+}
+
inline std::string
rtrim(const std::string& str)
{
@@ -213,6 +228,8 @@ bool is_blank(const std::string& str);
size_t abbreviate_str(char* str, size_t len, size_t max_len);
+size_t last_word_str(char* str, size_t len, size_t max_len);
+
void split_ws(const std::string& str, std::vector<std::string>& toks_out);
std::string repeat(const std::string& input, size_t num);
@@ -229,4 +246,53 @@ on_blank(const std::string& str, const std::string& def)
return str;
}
+namespace lnav {
+class tainted_string {
+public:
+ explicit tainted_string(std::string s) : ts_str(std::move(s)) {}
+
+ bool operator==(const tainted_string& other) const
+ {
+ return this->ts_str == other.ts_str;
+ }
+
+ bool operator!=(const tainted_string& other) const
+ {
+ return this->ts_str != other.ts_str;
+ }
+
+ bool operator<(const tainted_string& other) const
+ {
+ return this->ts_str < other.ts_str;
+ }
+
+ bool empty() const { return this->ts_str.empty(); }
+
+ size_t length() const { return this->ts_str.length(); }
+
+ size_t size() const { return this->ts_str.size(); }
+
+ friend fmt::formatter<lnav::tainted_string>;
+
+private:
+ const std::string ts_str;
+};
+} // namespace lnav
+
+namespace fmt {
+template<>
+struct formatter<lnav::tainted_string> : formatter<string_view> {
+ auto format(const lnav::tainted_string& ts,
+ format_context& ctx) -> decltype(ctx.out()) const;
+};
+} // namespace fmt
+
+namespace lnav {
+namespace pcre2pp {
+
+std::string quote(string_fragment sf);
+
+}
+} // namespace lnav
+
#endif