From 8997284b16b83847b6bea5161fd4eb4f02d5c668 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Tue, 29 Jun 2021 23:23:35 +0200 Subject: [PATCH] added trim(...) functions to convert/text.h void trim_first_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_first_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_last_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_last_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); void trim_first(std::string & str, wchar_t c); void trim_first(std::wstring & str, wchar_t c); void trim_last(std::string & str, wchar_t c); void trim_last(std::wstring & str, wchar_t c); void trim(std::string & str, wchar_t c); void trim(std::wstring & str, wchar_t c); --- src/convert/text.cpp | 68 ++++++++++++++++++++++++ src/convert/text.h | 20 +++++++ src/convert/text_private.h | 106 +++++++++++++++++++++++++++++++++++++ 3 files changed, 194 insertions(+) diff --git a/src/convert/text.cpp b/src/convert/text.cpp index 8551ba0..7f0227a 100644 --- a/src/convert/text.cpp +++ b/src/convert/text.cpp @@ -463,8 +463,76 @@ bool is_substr_nc(const std::wstring & short_str, const std::wstring & long_str) } +void trim_first_white(std::string & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_first_white_generic(str, check_additional_chars, treat_new_line_as_white); +} +void trim_first_white(std::wstring & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_first_white_generic(str, check_additional_chars, treat_new_line_as_white); +} + + +void trim_last_white(std::string & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_last_white_generic(str, check_additional_chars, treat_new_line_as_white); +} + + +void trim_last_white(std::wstring & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_last_white_generic(str, check_additional_chars, treat_new_line_as_white); +} + + +void trim_white(std::string & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_white_generic(str, check_additional_chars, treat_new_line_as_white); +} + + +void trim_white(std::wstring & str, bool check_additional_chars, bool treat_new_line_as_white) +{ + pt_private::trim_white_generic(str, check_additional_chars, treat_new_line_as_white); +} + + +void trim_first(std::string & str, wchar_t c) +{ + pt_private::trim_first_generic(str, c); +} + + +void trim_first(std::wstring & str, wchar_t c) +{ + pt_private::trim_first_generic(str, c); +} + + +void trim_last(std::string & str, wchar_t c) +{ + pt_private::trim_last_generic(str, c); +} + + +void trim_last(std::wstring & str, wchar_t c) +{ + pt_private::trim_last_generic(str, c); +} + + +void trim(std::string & str, wchar_t c) +{ + pt_private::trim_generic(str, c); +} + + +void trim(std::wstring & str, wchar_t c) +{ + pt_private::trim_generic(str, c); +} diff --git a/src/convert/text.h b/src/convert/text.h index d5dcdf2..14df30e 100644 --- a/src/convert/text.h +++ b/src/convert/text.h @@ -143,6 +143,26 @@ bool is_substr_nc(const std::string & short_str, const std::string & long_str); bool is_substr_nc(const std::wstring & short_str, const std::wstring & long_str); +void trim_first_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); +void trim_first_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); + +void trim_last_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); +void trim_last_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); + +void trim_white(std::string & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); +void trim_white(std::wstring & str, bool check_additional_chars = true, bool treat_new_line_as_white = true); + +void trim_first(std::string & str, wchar_t c); +void trim_first(std::wstring & str, wchar_t c); + +void trim_last(std::string & str, wchar_t c); +void trim_last(std::wstring & str, wchar_t c); + +void trim(std::string & str, wchar_t c); +void trim(std::wstring & str, wchar_t c); + + + } diff --git a/src/convert/text_private.h b/src/convert/text_private.h index 2b93ac4..8718b80 100644 --- a/src/convert/text_private.h +++ b/src/convert/text_private.h @@ -299,6 +299,112 @@ bool is_substr_nc_generic(const StringType1 * short_str, const StringType2 * lon +template +void trim_first_white_generic(StringType & s, bool check_additional_chars, bool treat_new_line_as_white) +{ +size_t i; + + if( s.empty() ) + return; + + // looking for white characters at the beginning + for(i=0 ; i +void trim_last_white_generic(StringType & s, bool check_additional_chars, bool treat_new_line_as_white) +{ +size_t i; + + if( s.empty() ) + return; + + // looking for white characters at the end + for(i=s.size()-1 ; i>0 && is_white(s[i], check_additional_chars, treat_new_line_as_white) ; --i); + + if( i==0 && is_white(s[i], check_additional_chars, treat_new_line_as_white) ) + { + // the whole string has white characters + s.clear(); + return; + } + + // deleting white characters at the end + if( i != s.size() - 1 ) + s.erase(i+1, StringType::npos); +} + + +template +void trim_white_generic(StringType & s, bool check_additional_chars, bool treat_new_line_as_white) +{ + if( s.empty() ) + return; + + trim_last_white_generic(s, check_additional_chars, treat_new_line_as_white); + trim_first_white_generic(s, check_additional_chars, treat_new_line_as_white); +} + + + +template +void trim_first_generic(StringType & s, wchar_t c) +{ +size_t i; + + if( s.empty() ) + return; + + // looking for the 'c' characters at the beginning + for(i=0 ; i +void trim_last_generic(StringType & s, wchar_t c) +{ +size_t i; + + if( s.empty() ) + return; + + // looking for the 'c' characters at the end + for(i=s.size()-1 ; i>0 && s[i]==c ; --i); + + if( i==0 && s[i]==c ) + { + // the whole string has the 'c' characters + s.clear(); + return; + } + + // deleting 'c' characters at the end + if( i != s.size() - 1 ) + s.erase(i+1, StringType::npos); +} + + +template +void trim_generic(StringType & s, wchar_t c) +{ + if( s.empty() ) + return; + + trim_last_generic(s, c); + trim_first_generic(s, c); +} + + + } // namespace pt_private