From e38d6045449d488c69c8af102a8331ee58251a16 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sun, 6 Jun 2021 00:07:39 +0200 Subject: [PATCH] Bug fixing in FString and FTermDetection --- ChangeLog | 3 + examples/rotozoomer.cpp | 2 +- src/flabel.cpp | 2 +- src/fstring.cpp | 23 +- src/fterm.cpp | 4 +- src/ftermdetection.cpp | 33 +-- src/ftextview.cpp | 20 +- src/include/final/ftermdetection.h | 328 ++++++++++++++--------------- src/include/final/ftextview.h | 4 - src/include/final/ftypes.h | 6 + test/fstring-test.cpp | 23 ++ test/ftermdetection-test.cpp | 25 ++- test/ftermfreebsd-test.cpp | 1 + test/ftermlinux-test.cpp | 9 +- test/ftermopenbsd-test.cpp | 2 + 15 files changed, 259 insertions(+), 226 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3fd97394..d908d89d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2021-06-06 Markus Gans + * Bug fixing in FString and FTermDetection + 2021-06-03 Markus Gans * Some FString optimizations diff --git a/examples/rotozoomer.cpp b/examples/rotozoomer.cpp index 03d96a04..7d1f0332 100644 --- a/examples/rotozoomer.cpp +++ b/examples/rotozoomer.cpp @@ -190,7 +190,7 @@ void RotoZoomer::generateReport() finalcut::FStringStream rep; dimension_str << getDesktopWidth() << "x" << getDesktopHeight(); - int elapsed_ms = int(duration_cast(end - start).count()); + auto elapsed_ms = int(duration_cast(end - start).count()); time_str << double(elapsed_ms) / 1000 << "s"; fps_str << double(loops) * 1000.0 / double(elapsed_ms); diff --git a/src/flabel.cpp b/src/flabel.cpp index 085a6fd3..16b00f2e 100644 --- a/src/flabel.cpp +++ b/src/flabel.cpp @@ -141,7 +141,7 @@ bool FLabel::setEnable (bool enable) void FLabel::setText (const FString& txt) { text.setString(txt); - multiline_text = text.split("\r\n"); + multiline_text = text.split("\n"); if ( int(multiline_text.size()) > 1 ) multiline = true; diff --git a/src/fstring.cpp b/src/fstring.cpp index 2676797d..2c07d823 100644 --- a/src/fstring.cpp +++ b/src/fstring.cpp @@ -460,10 +460,7 @@ long FString::toLong() const const FString s{trim()}; const wchar_t* p = s.string.c_str(); - if ( ! p ) - throw std::invalid_argument ("null value"); - - if ( ! *p ) + if ( s.isEmpty() ) throw std::invalid_argument ("empty value"); if ( *p == L'-' ) @@ -513,10 +510,7 @@ uLong FString::toULong() const const FString s{trim()}; const wchar_t* p = s.string.c_str(); - if ( ! p ) - throw std::invalid_argument ("null value"); - - if ( ! *p ) + if ( s.isEmpty() ) throw std::invalid_argument ("empty value"); if ( *p == L'-' ) @@ -612,14 +606,15 @@ FString FString::rtrim() const if ( isEmpty() ) return *this; - const auto first = string.begin(); - auto iter = string.end() - 1; + const auto r_end = string.rend(); + auto r_iter = string.rbegin(); - while ( iter != first && std::iswspace(std::wint_t(*iter)) ) - --iter; + while ( r_iter != r_end && std::iswspace(std::wint_t(*r_iter)) ) + ++r_iter; - if ( first != iter ) - return std::wstring(first, iter + 1); + if ( r_iter != r_end ) + return std::wstring( make_reverse_iterator(r_end) + , make_reverse_iterator(r_iter) ); else return {}; } diff --git a/src/fterm.cpp b/src/fterm.cpp index fe227bbe..7dcbde1c 100644 --- a/src/fterm.cpp +++ b/src/fterm.cpp @@ -2166,8 +2166,8 @@ bool FTerm::init_terminal() const initBaudRate(); // Terminal detection - FTermDetection::detect(); - const auto& term_detection = FTerm::getFTermDetection(); + auto& term_detection = FTerm::getFTermDetection(); + term_detection.detect(); setTermType (term_detection.getTermType()); return true; } diff --git a/src/ftermdetection.cpp b/src/ftermdetection.cpp index c7b9b41e..de4ece36 100644 --- a/src/ftermdetection.cpp +++ b/src/ftermdetection.cpp @@ -50,27 +50,6 @@ namespace finalcut { -// static class attributes -FTermDetection::FTerminalType FTermDetection::terminal_type{}; -FTermDetection::colorEnv FTermDetection::color_env{}; -FTermDetection::kittyVersion FTermDetection::kitty_version{}; -FTermDetection::secondaryDA FTermDetection::secondary_da{}; -char FTermDetection::termtype[256]{}; -char FTermDetection::ttytypename[256]{}; -bool FTermDetection::decscusr_support{}; -bool FTermDetection::terminal_detection{}; -bool FTermDetection::color256{}; -const FString* FTermDetection::answer_back{nullptr}; -const FString* FTermDetection::sec_da{nullptr}; -int FTermDetection::gnome_terminal_id{}; - -#if DEBUG - char FTermDetection::termtype_256color[256]{}; - char FTermDetection::termtype_Answerback[256]{}; - char FTermDetection::termtype_SecDA[256]{}; -#endif // DEBUG - - //---------------------------------------------------------------------- // class FTermDetection //---------------------------------------------------------------------- @@ -105,13 +84,13 @@ FTermDetection::~FTermDetection() // destructor // public methods of FTermDetection //---------------------------------------------------------------------- #if DEBUG -const FString& FTermDetection::getAnswerbackString() +const FString& FTermDetection::getAnswerbackString() const { return ( answer_back ) ? *answer_back : fc::emptyFString::get(); } //---------------------------------------------------------------------- -const FString& FTermDetection::getSecDAString() +const FString& FTermDetection::getSecDAString() const { return ( sec_da ) ? *sec_da : fc::emptyFString::get(); } @@ -330,9 +309,9 @@ void FTermDetection::termtypeAnalysis() if ( std::strncmp(termtype, "screen", 6) == 0 ) { terminal_type.screen = true; - std::string tmux = std::getenv("TMUX"); + auto tmux = std::getenv("TMUX"); - if ( tmux.length() != 0 ) + if ( tmux && tmux[0] != '\0' ) terminal_type.tmux = true; } @@ -452,7 +431,7 @@ bool FTermDetection::get256colorEnvString() color_env.string5 = std::getenv("KONSOLE_DBUS_SESSION"); color_env.string6 = std::getenv("KONSOLE_DCOP"); color_env.string7 = std::getenv("COLORFGBG"); - color_env.string7 = std::getenv("KITTY_WINDOW_ID"); + color_env.string8 = std::getenv("KITTY_WINDOW_ID"); if ( color_env.string1 != nullptr || color_env.string2 != nullptr @@ -780,7 +759,7 @@ int FTermDetection::str2int (const FString& s) constexpr int ERROR = -1; - if ( ! s ) + if ( s.isEmpty() ) return ERROR; try diff --git a/src/ftextview.cpp b/src/ftextview.cpp index c26fe81a..e8c09762 100644 --- a/src/ftextview.cpp +++ b/src/ftextview.cpp @@ -225,7 +225,7 @@ void FTextView::insert (const FString& str, int pos) else s = FString{str}.rtrim().expandTabs(FTerm::getTabstop()); - auto text_split = s.split("\r\n"); + auto text_split = s.split("\n"); for (auto&& line : text_split) // Line loop { @@ -274,13 +274,27 @@ void FTextView::insert (const FString& str, int pos) //---------------------------------------------------------------------- void FTextView::replaceRange (const FString& str, int from, int to) +{ + try + { + deleteRange (from, to); + } + catch (const std::out_of_range&) + { + throw std::out_of_range(""); // Invalid range + } + + insert(str, from); +} + +//---------------------------------------------------------------------- +void FTextView::deleteRange (int from, int to) { if ( from > to || from >= int(getRows()) || to >= int(getRows()) ) - return; + throw std::out_of_range(""); // Invalid range auto iter = data.begin(); data.erase (iter + from, iter + to + 1); - insert(str, from); } //---------------------------------------------------------------------- diff --git a/src/include/final/ftermdetection.h b/src/include/final/ftermdetection.h index 93f0fd5a..9a5fccaf 100644 --- a/src/include/final/ftermdetection.h +++ b/src/include/final/ftermdetection.h @@ -79,7 +79,12 @@ class FTermDetection final uInt8 : 3; // padding bits }; - struct kittyVersion; // forward declaration + struct kittyVersion + { + int primary{0}; + int secondary{0}; + }; + // Constructors FTermDetection(); @@ -94,183 +99,164 @@ class FTermDetection final FTermDetection& operator = (const FTermDetection&) = delete; // Accessor - static FString getClassName(); - static const char* getTermType(); - static int getGnomeTerminalID(); - static kittyVersion getKittyVersion(); + FString getClassName() const; + const char* getTermType() const; + int getGnomeTerminalID() const; + kittyVersion getKittyVersion() const; FTerminalType& getTermTypeStruct(); #if DEBUG - static const FString& getAnswerbackString(); - static const FString& getSecDAString(); - static const char* getTermType_256color(); - static const char* getTermType_Answerback(); - static const char* getTermType_SecDA(); + const FString& getAnswerbackString() const; + const FString& getSecDAString() const; + const char* getTermType_256color() const; + const char* getTermType_Answerback() const; + const char* getTermType_SecDA() const; #endif // Inquiries - static bool isAnsiTerminal(); - static bool isXTerminal(); - static bool isRxvtTerminal(); - static bool isUrxvtTerminal(); - static bool isKdeTerminal(); - static bool isGnomeTerminal(); - static bool isPuttyTerminal(); - static bool isWindowsTerminal(); - static bool isTeraTerm(); - static bool isCygwinTerminal(); - static bool isMinttyTerm(); - static bool isLinuxTerm(); - static bool isFreeBSDTerm(); - static bool isNetBSDTerm(); - static bool isOpenBSDTerm(); - static bool isSunTerminal(); - static bool isScreenTerm(); - static bool isTmuxTerm(); - static bool isKtermTerminal(); - static bool isMltermTerminal(); - static bool isKittyTerminal(); - static bool canDisplay256Colors(); - static bool hasTerminalDetection(); - static bool hasSetCursorStyleSupport(); + bool isAnsiTerminal() const; + bool isXTerminal() const; + bool isRxvtTerminal() const; + bool isUrxvtTerminal() const; + bool isKdeTerminal() const; + bool isGnomeTerminal() const; + bool isPuttyTerminal() const; + bool isWindowsTerminal() const; + bool isTeraTerm() const; + bool isCygwinTerminal() const; + bool isMinttyTerm() const; + bool isLinuxTerm() const; + bool isFreeBSDTerm() const; + bool isNetBSDTerm() const; + bool isOpenBSDTerm() const; + bool isSunTerminal() const; + bool isScreenTerm() const; + bool isTmuxTerm() const; + bool isKtermTerminal() const; + bool isMltermTerminal() const; + bool isKittyTerminal() const; + bool canDisplay256Colors() const; + bool hasTerminalDetection() const; + bool hasSetCursorStyleSupport() const; // Mutators - static void setAnsiTerminal (bool = true); - static void setXTerminal (bool = true); - static void setRxvtTerminal (bool = true); - static void setUrxvtTerminal (bool = true); - static void setKdeTerminal (bool = true); - static void setGnomeTerminal (bool = true); - static void setPuttyTerminal (bool = true); - static void setWindowsTerminal (bool = true); - static void setTeraTerm (bool = true); - static void setCygwinTerminal (bool = true); - static void setMinttyTerm (bool = true); - static void setLinuxTerm (bool = true); - static void setFreeBSDTerm (bool = true); - static void setNetBSDTerm (bool = true); - static void setOpenBSDTerm (bool = true); - static void setSunTerminal (bool = true); - static void setScreenTerm (bool = true); - static void setTmuxTerm (bool = true); - static void setKtermTerminal (bool = true); - static void setMltermTerminal (bool = true); - static void setKittyTerminal (bool = true); - static void setTerminalDetection (bool = true); - static void setTtyTypeFileName (const char[]); + void setAnsiTerminal (bool = true); + void setXTerminal (bool = true); + void setRxvtTerminal (bool = true); + void setUrxvtTerminal (bool = true); + void setKdeTerminal (bool = true); + void setGnomeTerminal (bool = true); + void setPuttyTerminal (bool = true); + void setWindowsTerminal (bool = true); + void setTeraTerm (bool = true); + void setCygwinTerminal (bool = true); + void setMinttyTerm (bool = true); + void setLinuxTerm (bool = true); + void setFreeBSDTerm (bool = true); + void setNetBSDTerm (bool = true); + void setOpenBSDTerm (bool = true); + void setSunTerminal (bool = true); + void setScreenTerm (bool = true); + void setTmuxTerm (bool = true); + void setKtermTerminal (bool = true); + void setMltermTerminal (bool = true); + void setKittyTerminal (bool = true); + void setTerminalDetection (bool = true); + void setTtyTypeFileName (const char[]); // Methods - static void detect(); + void detect(); private: - struct colorEnv; // forward declaration - struct secondaryDA; // forward declaration + struct colorEnv + { + char* string1{nullptr}; + char* string2{nullptr}; + char* string3{nullptr}; + char* string4{nullptr}; + char* string5{nullptr}; + char* string6{nullptr}; + char* string7{nullptr}; + char* string8{nullptr}; + }; + + struct secondaryDA + { + int terminal_id_type{-1}; + int terminal_id_version{-1}; + int terminal_id_hardware{-1}; + }; // Methods - static void deallocation(); - static void getSystemTermType(); - static bool getTTYtype(); + void deallocation(); + void getSystemTermType(); + bool getTTYtype(); #if F_HAVE_GETTTYNAM - static bool getTTYSFileEntry(); + bool getTTYSFileEntry(); #endif - static void termtypeAnalysis(); - static void detectTerminal(); - static const char* init_256colorTerminal(); - static bool get256colorEnvString(); - static const char* termtype_256color_quirks(); - static const char* determineMaxColor (const char[]); - static FString getXTermColorName (FColor); - static const char* parseAnswerbackMsg (const char[]); - static FString getAnswerbackMsg(); - static const char* parseSecDA (const char[]); - static int str2int (const FString&); - static FString getSecDA(); - static const char* secDA_Analysis (const char[]); - static const char* secDA_Analysis_0 (const char[]); - static const char* secDA_Analysis_1 (const char[]); - static const char* secDA_Analysis_24 (const char[]); - static const char* secDA_Analysis_32 (const char[]); - static const char* secDA_Analysis_65 (const char[]); - static const char* secDA_Analysis_67 (const char[]); - static const char* secDA_Analysis_77 (const char[]); - static const char* secDA_Analysis_82 (); - static const char* secDA_Analysis_83 (const char[]); - static const char* secDA_Analysis_84 (const char[]); - static const char* secDA_Analysis_85 (); - static const char* secDA_Analysis_vte (const char[]); - static const char* secDA_Analysis_kitty (const char[]); + void termtypeAnalysis(); + void detectTerminal(); + const char* init_256colorTerminal(); + bool get256colorEnvString(); + const char* termtype_256color_quirks(); + const char* determineMaxColor (const char[]); + FString getXTermColorName (FColor); + const char* parseAnswerbackMsg (const char[]); + FString getAnswerbackMsg(); + const char* parseSecDA (const char[]); + int str2int (const FString&); + FString getSecDA(); + const char* secDA_Analysis (const char[]); + const char* secDA_Analysis_0 (const char[]); + const char* secDA_Analysis_1 (const char[]); + const char* secDA_Analysis_24 (const char[]); + const char* secDA_Analysis_32 (const char[]); + const char* secDA_Analysis_65 (const char[]); + const char* secDA_Analysis_67 (const char[]); + const char* secDA_Analysis_77 (const char[]); + const char* secDA_Analysis_82 (); + const char* secDA_Analysis_83 (const char[]); + const char* secDA_Analysis_84 (const char[]); + const char* secDA_Analysis_85 (); + const char* secDA_Analysis_vte (const char[]); + const char* secDA_Analysis_kitty (const char[]); // Data members #if DEBUG - static char termtype_256color[256]; - static char termtype_Answerback[256]; - static char termtype_SecDA[256]; + char termtype_256color[256]{}; + char termtype_Answerback[256]{}; + char termtype_SecDA[256]{}; #endif - static char termtype[256]; - static char ttytypename[256]; - static bool decscusr_support; - static bool terminal_detection; - static bool color256; - static int gnome_terminal_id; - static const FString* answer_back; - static const FString* sec_da; - static FTerminalType terminal_type; - static colorEnv color_env; - static kittyVersion kitty_version; - static secondaryDA secondary_da; -}; - - -//---------------------------------------------------------------------- -// struct FTermDetection::colorEnv -//---------------------------------------------------------------------- -struct FTermDetection::colorEnv -{ - char* string1{nullptr}; - char* string2{nullptr}; - char* string3{nullptr}; - char* string4{nullptr}; - char* string5{nullptr}; - char* string6{nullptr}; - char* string7{nullptr}; - char* string8{nullptr}; -}; - -//---------------------------------------------------------------------- -// struct FTermDetection::KittyVersion -//---------------------------------------------------------------------- -struct FTermDetection::kittyVersion -{ - int primary{0}; - int secondary{0}; -}; - -//---------------------------------------------------------------------- -// struct FTermDetection::secondaryDA -//---------------------------------------------------------------------- -struct FTermDetection::secondaryDA -{ - int terminal_id_type{-1}; - int terminal_id_version{-1}; - int terminal_id_hardware{-1}; + char termtype[256]{}; + char ttytypename[256]{}; + bool decscusr_support{}; + bool terminal_detection{}; + bool color256{}; + int gnome_terminal_id{}; + const FString* answer_back{nullptr}; + const FString* sec_da{nullptr}; + FTerminalType terminal_type{}; + colorEnv color_env{}; + kittyVersion kitty_version{}; + secondaryDA secondary_da{}; }; // FTermDetection inline functions //---------------------------------------------------------------------- -inline FString FTermDetection::getClassName() +inline FString FTermDetection::getClassName() const { return "FTermDetection"; } //---------------------------------------------------------------------- -inline const char* FTermDetection::getTermType() +inline const char* FTermDetection::getTermType() const { return termtype; } //---------------------------------------------------------------------- -inline int FTermDetection::getGnomeTerminalID() +inline int FTermDetection::getGnomeTerminalID() const { return gnome_terminal_id; } //---------------------------------------------------------------------- -inline FTermDetection::kittyVersion FTermDetection::getKittyVersion() +inline FTermDetection::kittyVersion FTermDetection::getKittyVersion() const { return kitty_version; } //---------------------------------------------------------------------- @@ -279,112 +265,112 @@ inline FTermDetection::FTerminalType& FTermDetection::getTermTypeStruct() #if DEBUG //---------------------------------------------------------------------- -inline const char* FTermDetection::getTermType_256color() +inline const char* FTermDetection::getTermType_256color() const { return termtype_256color; } //---------------------------------------------------------------------- -inline const char* FTermDetection::getTermType_Answerback() +inline const char* FTermDetection::getTermType_Answerback() const { return termtype_Answerback; } //---------------------------------------------------------------------- -inline const char* FTermDetection::getTermType_SecDA() +inline const char* FTermDetection::getTermType_SecDA() const { return termtype_SecDA; } #endif //---------------------------------------------------------------------- -inline bool FTermDetection::canDisplay256Colors() +inline bool FTermDetection::canDisplay256Colors() const { return color256; } //---------------------------------------------------------------------- -inline bool FTermDetection::hasSetCursorStyleSupport() +inline bool FTermDetection::hasSetCursorStyleSupport() const { return decscusr_support; } //---------------------------------------------------------------------- -inline bool FTermDetection::isXTerminal() +inline bool FTermDetection::isXTerminal() const { return terminal_type.xterm; } //---------------------------------------------------------------------- -inline bool FTermDetection::isAnsiTerminal() +inline bool FTermDetection::isAnsiTerminal() const { return terminal_type.ansi; } //---------------------------------------------------------------------- -inline bool FTermDetection::isRxvtTerminal() +inline bool FTermDetection::isRxvtTerminal() const { return terminal_type.rxvt; } //---------------------------------------------------------------------- -inline bool FTermDetection::isUrxvtTerminal() +inline bool FTermDetection::isUrxvtTerminal() const { return terminal_type.urxvt; } //---------------------------------------------------------------------- -inline bool FTermDetection::isMltermTerminal() +inline bool FTermDetection::isMltermTerminal() const { return terminal_type.mlterm; } //---------------------------------------------------------------------- -inline bool FTermDetection::isKittyTerminal() +inline bool FTermDetection::isKittyTerminal() const { return terminal_type.kitty; } //---------------------------------------------------------------------- -inline bool FTermDetection::isPuttyTerminal() +inline bool FTermDetection::isPuttyTerminal() const { return terminal_type.putty; } //---------------------------------------------------------------------- -inline bool FTermDetection::isWindowsTerminal() +inline bool FTermDetection::isWindowsTerminal() const { return terminal_type.win_terminal; } //---------------------------------------------------------------------- -inline bool FTermDetection::isKdeTerminal() +inline bool FTermDetection::isKdeTerminal() const { return terminal_type.kde_konsole; } //---------------------------------------------------------------------- -inline bool FTermDetection::isGnomeTerminal() +inline bool FTermDetection::isGnomeTerminal() const { return terminal_type.gnome_terminal; } //---------------------------------------------------------------------- -inline bool FTermDetection::isKtermTerminal() +inline bool FTermDetection::isKtermTerminal() const { return terminal_type.kterm; } //---------------------------------------------------------------------- -inline bool FTermDetection::isTeraTerm() +inline bool FTermDetection::isTeraTerm() const { return terminal_type.tera_term; } //---------------------------------------------------------------------- -inline bool FTermDetection::isCygwinTerminal() +inline bool FTermDetection::isCygwinTerminal() const { return terminal_type.cygwin; } //---------------------------------------------------------------------- -inline bool FTermDetection::isMinttyTerm() +inline bool FTermDetection::isMinttyTerm() const { return terminal_type.mintty; } //---------------------------------------------------------------------- -inline bool FTermDetection::isLinuxTerm() +inline bool FTermDetection::isLinuxTerm() const { return terminal_type.linux_con; } //---------------------------------------------------------------------- -inline bool FTermDetection::isFreeBSDTerm() +inline bool FTermDetection::isFreeBSDTerm() const { return terminal_type.freebsd_con; } //---------------------------------------------------------------------- -inline bool FTermDetection::isNetBSDTerm() +inline bool FTermDetection::isNetBSDTerm() const { return terminal_type.netbsd_con; } //---------------------------------------------------------------------- -inline bool FTermDetection::isOpenBSDTerm() +inline bool FTermDetection::isOpenBSDTerm() const { return terminal_type.openbsd_con; } //---------------------------------------------------------------------- -inline bool FTermDetection::isSunTerminal() +inline bool FTermDetection::isSunTerminal() const { return terminal_type.sun_con; } //---------------------------------------------------------------------- -inline bool FTermDetection::isScreenTerm() +inline bool FTermDetection::isScreenTerm() const { return terminal_type.screen; } //---------------------------------------------------------------------- -inline bool FTermDetection::isTmuxTerm() +inline bool FTermDetection::isTmuxTerm() const { return terminal_type.tmux; } //---------------------------------------------------------------------- -inline bool FTermDetection::hasTerminalDetection() +inline bool FTermDetection::hasTerminalDetection() const { return terminal_detection; } //---------------------------------------------------------------------- diff --git a/src/include/final/ftextview.h b/src/include/final/ftextview.h index 3b833129..6c11af7a 100644 --- a/src/include/final/ftextview.h +++ b/src/include/final/ftextview.h @@ -251,10 +251,6 @@ void FTextView::insert (const std::initializer_list& list, int pos) } } -//---------------------------------------------------------------------- -inline void FTextView::deleteRange (int from, int to) -{ replaceRange (FString(), from, to); } - //---------------------------------------------------------------------- inline void FTextView::deleteLine (int pos) { deleteRange (pos, pos); } diff --git a/src/include/final/ftypes.h b/src/include/final/ftypes.h index 1275b600..064cd06b 100644 --- a/src/include/final/ftypes.h +++ b/src/include/final/ftypes.h @@ -119,6 +119,12 @@ std::unique_ptr make_unique (Args&&... args) return std::unique_ptr(new T(std::forward(args)...)); } +template +constexpr std::reverse_iterator make_reverse_iterator (Iter iter) +{ + return std::reverse_iterator(iter); +} + using charSubstitution = std::unordered_map; struct FCharAttribute diff --git a/test/fstring-test.cpp b/test/fstring-test.cpp index 4bf2bafc..cbc4e8e6 100644 --- a/test/fstring-test.cpp +++ b/test/fstring-test.cpp @@ -1246,6 +1246,9 @@ void FStringTest::convertToNumberTest() str = "255"; CPPUNIT_ASSERT ( str.toUShort() == 255U ); + str = "0"; + CPPUNIT_ASSERT ( str.toInt() == 0 ); + str = "-32768"; CPPUNIT_ASSERT ( str.toInt() == -32768 ); @@ -1336,6 +1339,12 @@ void FStringTest::exceptionTest() CPPUNIT_ASSERT_THROW ( finalcut::FString("abc").toULong() , std::invalid_argument ); + CPPUNIT_ASSERT_THROW ( finalcut::FString("").toULong() + , std::invalid_argument ); + + CPPUNIT_ASSERT_THROW ( finalcut::FString().toULong() + , std::invalid_argument ); + CPPUNIT_ASSERT_THROW ( finalcut::FString("abc")[4] , std::out_of_range ); @@ -1479,6 +1488,20 @@ void FStringTest::trimTest() CPPUNIT_ASSERT ( trim_str3.trim().isEmpty() ); CPPUNIT_ASSERT ( trim_str3.trim().getLength() == 0 ); CPPUNIT_ASSERT ( trim_str3.trim().capacity() < std::wstring().max_size() ); + + const finalcut::FString trim_str4 = "x"; + CPPUNIT_ASSERT ( trim_str4.ltrim() == "x" ); + CPPUNIT_ASSERT ( ! trim_str4.ltrim().isEmpty() ); + CPPUNIT_ASSERT ( trim_str4.ltrim().getLength() == 1 ); + CPPUNIT_ASSERT ( trim_str4.ltrim().capacity() < std::wstring().max_size() ); + CPPUNIT_ASSERT ( trim_str4.rtrim() == "x" ); + CPPUNIT_ASSERT ( ! trim_str4.rtrim().isEmpty() ); + CPPUNIT_ASSERT ( trim_str4.rtrim().getLength() == 1 ); + CPPUNIT_ASSERT ( trim_str4.rtrim().capacity() < std::wstring().max_size() ); + CPPUNIT_ASSERT ( trim_str4.trim() == "x" ); + CPPUNIT_ASSERT ( ! trim_str4.trim().isEmpty() ); + CPPUNIT_ASSERT ( trim_str4.trim().getLength() == 1 ); + CPPUNIT_ASSERT ( trim_str4.trim().capacity() < std::wstring().max_size() ); } //---------------------------------------------------------------------- diff --git a/test/ftermdetection-test.cpp b/test/ftermdetection-test.cpp index 5c8eccdc..e7e84166 100644 --- a/test/ftermdetection-test.cpp +++ b/test/ftermdetection-test.cpp @@ -150,6 +150,7 @@ void FTermDetectionTest::ansiTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "ansi", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -222,6 +223,7 @@ void FTermDetectionTest::xtermTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm", 1); setenv ("XTERM_VERSION", "XTerm(312)", 1); unsetenv("TERMCAP"); @@ -286,6 +288,7 @@ void FTermDetectionTest::rxvtTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "rxvt-cygwin-native", 1); setenv ("COLORTERM", "rxvt-xpm", 1); setenv ("COLORFGBG", "default;default", 1); @@ -351,6 +354,7 @@ void FTermDetectionTest::urxvtTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "rxvt-unicode-256color", 1); setenv ("COLORTERM", "rxvt-xpm", 1); setenv ("COLORFGBG", "default;default;0", 1); @@ -415,6 +419,7 @@ void FTermDetectionTest::kdeKonsoleTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-256color", 1); setenv ("COLORTERM", "truecolor", 1); setenv ("KONSOLE_DBUS_SERVICE", "DCOPRef(konsole-11768,konsole)", 1); @@ -479,6 +484,7 @@ void FTermDetectionTest::gnomeTerminalTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-256color", 1); setenv ("COLORTERM", "truecolor", 1); setenv ("VTE_VERSION", "5202", 1); @@ -543,6 +549,7 @@ void FTermDetectionTest::newerVteTerminalTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-256color", 1); setenv ("COLORTERM", "truecolor", 1); setenv ("VTE_VERSION", "5300", 1); @@ -607,6 +614,7 @@ void FTermDetectionTest::puttyTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -672,6 +680,7 @@ void FTermDetectionTest::windowsTerminalTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-256color", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -738,6 +747,7 @@ void FTermDetectionTest::teraTermTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -802,6 +812,7 @@ void FTermDetectionTest::cygwinTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "cygwin", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -866,6 +877,7 @@ void FTermDetectionTest::minttyTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-256color", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -930,6 +942,7 @@ void FTermDetectionTest::linuxTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1001,6 +1014,7 @@ void FTermDetectionTest::freebsdTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1075,6 +1089,7 @@ void FTermDetectionTest::netbsdTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "wsvt25", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1147,6 +1162,7 @@ void FTermDetectionTest::openbsdTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "vt220", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1218,6 +1234,7 @@ void FTermDetectionTest::sunTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "sun-color", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1289,6 +1306,7 @@ void FTermDetectionTest::screenTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "screen", 1); setenv ("TERMCAP", "SC|screen|VT 100/ANSI X3.64 virtual terminal:...", 1); unsetenv("COLORTERM"); @@ -1359,6 +1377,7 @@ void FTermDetectionTest::tmuxTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "screen", 1); setenv ("TMUX", "/tmp/tmux-1000/default,7844,0", 1); setenv ("TMUX_PANE", "%0", 1); @@ -1430,6 +1449,7 @@ void FTermDetectionTest::ktermTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "kterm", 1); unsetenv("TERMCAP"); unsetenv("COLORTERM"); @@ -1501,6 +1521,7 @@ void FTermDetectionTest::mltermTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "mlterm", 1); setenv ("MLTERM", "3.8.4", 1); setenv ("COLORFGBG", "default;default", 1); @@ -1573,6 +1594,7 @@ void FTermDetectionTest::kittyTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "xterm-kitty", 1); setenv ("KITTY_WINDOW_ID", "1", 1); setenv ("COLORTERM", "truecolor", 1); @@ -1585,7 +1607,7 @@ void FTermDetectionTest::kittyTest() unsetenv("TMUX"); detect.detect(); - CPPUNIT_ASSERT ( ! detect.isXTerminal() ); + CPPUNIT_ASSERT ( detect.isXTerminal() ); CPPUNIT_ASSERT ( ! detect.isAnsiTerminal() ); CPPUNIT_ASSERT ( ! detect.isRxvtTerminal() ); CPPUNIT_ASSERT ( ! detect.isUrxvtTerminal() ); @@ -1675,6 +1697,7 @@ void FTermDetectionTest::ttytypeTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child unsetenv("TERM"); unsetenv("TERMCAP"); unsetenv("COLORTERM"); diff --git a/test/ftermfreebsd-test.cpp b/test/ftermfreebsd-test.cpp index 470459b8..e7ee3b18 100644 --- a/test/ftermfreebsd-test.cpp +++ b/test/ftermfreebsd-test.cpp @@ -657,6 +657,7 @@ void ftermfreebsdTest::freebsdConsoleTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child static constexpr int left_alt = 0x38; finalcut::FTermFreeBSD freebsd; const auto& fsystem = finalcut::FTerm::getFSystem(); diff --git a/test/ftermlinux-test.cpp b/test/ftermlinux-test.cpp index 3b3953e3..3e0bb0be 100644 --- a/test/ftermlinux-test.cpp +++ b/test/ftermlinux-test.cpp @@ -2109,6 +2109,7 @@ void FTermLinuxTest::linuxConsoleTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); @@ -2233,6 +2234,7 @@ void FTermLinuxTest::linuxConsoleLat15Test() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); @@ -2314,13 +2316,14 @@ void FTermLinuxTest::linuxCursorStyleTest() // setupterm is needed for tputs in ncurses >= 6.1 setupterm (static_cast(0), 1, static_cast(0)); - const auto& term_detection = finalcut::FTerm::getFTermDetection(); + auto& term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); @@ -2511,6 +2514,7 @@ void FTermLinuxTest::linuxColorPaletteTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); @@ -2778,13 +2782,14 @@ void FTermLinuxTest::linuxFontTest() // setupterm is needed for tputs in ncurses >= 6.1 setupterm (static_cast(0), 1, static_cast(0)); - const auto& term_detection = finalcut::FTerm::getFTermDetection(); + auto& term_detection = finalcut::FTerm::getFTermDetection(); finalcut::FTermLinux linux; pid_t pid = forkConEmu(); if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child setenv ("TERM", "linux", 1); setenv ("COLUMNS", "90", 1); setenv ("LINES", "30", 1); diff --git a/test/ftermopenbsd-test.cpp b/test/ftermopenbsd-test.cpp index d3080f6a..4b0c35ea 100644 --- a/test/ftermopenbsd-test.cpp +++ b/test/ftermopenbsd-test.cpp @@ -380,6 +380,7 @@ void ftermopenbsdTest::netbsdConsoleTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child finalcut::FTermOpenBSD netbsd; setenv ("TERM", "wsvt25", 1); @@ -484,6 +485,7 @@ void ftermopenbsdTest::openbsdConsoleTest() if ( isConEmuChildProcess(pid) ) { + // (gdb) set follow-fork-mode child finalcut::FTermOpenBSD openbsd; setenv ("TERM", "vt220", 1);