From: Vadim Zeitlin Date: Thu, 28 Jan 1999 14:01:37 +0000 (+0000) Subject: corrected an off-by-1 bug in GetNumberOfLines() and PositionToXY() for X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2829d9e3e80656dcbf3cbd74600a82acd1b89d26 corrected an off-by-1 bug in GetNumberOfLines() and PositionToXY() for single-line text controls git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1506 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index f165c20805..bdf1a999a9 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -435,12 +435,18 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const { wxString text = GetValue(); - if( pos >= (long)text.Len() ) + // cast to prevent warning. But pos really should've been unsigned. + if( (unsigned long)pos > text.Len() ) return FALSE; *x=1; // Col 1 *y=1; // Line 1 - for ( const char *p = text.c_str(); *p; p++ ) + + if (pos == 0) + return TRUE; + + const char* stop = text.c_str() + pos + 1; + for ( const char *p = text.c_str(); p <= stop; p++ ) { if (*p == '\n') { @@ -453,7 +459,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const } else // single line control { - if ( pos < GTK_ENTRY(m_text)->text_length ) + if ( pos <= GTK_ENTRY(m_text)->text_length ) { *y = 1; *x = pos; @@ -473,10 +479,11 @@ long wxTextCtrl::XYToPosition(long x, long y ) const if (!(m_windowStyle & wxTE_MULTILINE)) return 0; long pos=0; + /* This is a kludge; our XY values are 1-based, but GetLineLength() + * and --Text() start counting at 0. (and so say the docs) */ + for( int i=1; i= (long)text.Len() ) + // cast to prevent warning. But pos really should've been unsigned. + if( (unsigned long)pos > text.Len() ) return FALSE; *x=1; // Col 1 *y=1; // Line 1 - for ( const char *p = text.c_str(); *p; p++ ) + + if (pos == 0) + return TRUE; + + const char* stop = text.c_str() + pos + 1; + for ( const char *p = text.c_str(); p <= stop; p++ ) { if (*p == '\n') { @@ -453,7 +459,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const } else // single line control { - if ( pos < GTK_ENTRY(m_text)->text_length ) + if ( pos <= GTK_ENTRY(m_text)->text_length ) { *y = 1; *x = pos; @@ -473,10 +479,11 @@ long wxTextCtrl::XYToPosition(long x, long y ) const if (!(m_windowStyle & wxTE_MULTILINE)) return 0; long pos=0; + /* This is a kludge; our XY values are 1-based, but GetLineLength() + * and --Text() start counting at 0. (and so say the docs) */ + for( int i=1; i