From 0ae2c768fc8b2e43d271284544af35a27dc2cd17 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 6 Jun 2022 11:27:32 +0200 Subject: Add trim_left() and trim_right() in addition to trim() Also improve the trim() implementation. --- libbutl/utility.cxx | 41 +++++++++++++++++++++++++++++++++++------ libbutl/utility.hxx | 18 ++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/libbutl/utility.cxx b/libbutl/utility.cxx index 78abbd8..b03a8f8 100644 --- a/libbutl/utility.cxx +++ b/libbutl/utility.cxx @@ -171,13 +171,42 @@ namespace butl for (; i != n && ws (l[i]); ++i) ; for (; n != i && ws (l[n - 1]); --n) ; - if (i != 0) + if (n != l.size ()) l.resize (n); + if (i != 0) l.erase (0, i); + + return l; + } + + string& + trim_left (string& l) + { + auto ws = [] (char c ) { - string s (l, i, n - i); - l.swap (s); - } - else if (n != l.size ()) - l.resize (n); + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + }; + + size_t i (0), n (l.size ()); + + for (; i != n && ws (l[i]); ++i) ; + + if (i != 0) l.erase (0, i); + + return l; + } + + string& + trim_right (string& l) + { + auto ws = [] (char c ) + { + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + }; + + size_t i (0), n (l.size ()); + + for (; n != i && ws (l[n - 1]); --n) ; + + if (n != l.size ()) l.resize (n); return l; } diff --git a/libbutl/utility.hxx b/libbutl/utility.hxx index 49b61b3..95a7f78 100644 --- a/libbutl/utility.hxx +++ b/libbutl/utility.hxx @@ -146,12 +146,30 @@ namespace butl LIBBUTL_SYMEXPORT std::string& trim (std::string&); + LIBBUTL_SYMEXPORT std::string& + trim_left (std::string&); + + LIBBUTL_SYMEXPORT std::string& + trim_right (std::string&); + inline std::string trim (std::string&& s) { return move (trim (s)); } + inline std::string + trim_left (std::string&& s) + { + return move (trim_left (s)); + } + + inline std::string + trim_right (std::string&& s) + { + return move (trim_right (s)); + } + // Find the beginning and end poistions of the next word. Return the size // of the word or 0 and set b = e = n if there are no more words. For // example: -- cgit v1.1