diff options
author | Slávek Banko <slavek.banko@axis.cz> | 2019-02-10 11:25:02 +0100 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2019-02-10 11:26:51 +0100 |
commit | 80d5792c61ca4504242b77dcdd4b312b361551b4 (patch) | |
tree | 1e17a31de4675c0951e4de8c5c5760869034e2fb | |
parent | 6c6fcc79bf87913fac3e34c01e49f0bb72eddaf7 (diff) | |
download | qt3-80d5792c61ca4504242b77dcdd4b312b361551b4.tar.gz qt3-80d5792c61ca4504242b77dcdd4b312b361551b4.zip |
Make use of QString::utf8() and QString::local8Bit() safe for conversion to char*.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
(based on commit 0a1966b25e36fbca6263b656fec8de9d42770f8d)
-rw-r--r-- | src/tools/qstring.cpp | 21 | ||||
-rw-r--r-- | src/tools/qstring.h | 14 |
2 files changed, 26 insertions, 9 deletions
diff --git a/src/tools/qstring.cpp b/src/tools/qstring.cpp index 24b8164..8d52468 100644 --- a/src/tools/qstring.cpp +++ b/src/tools/qstring.cpp @@ -5768,6 +5768,10 @@ QCString QString::utf8() const ++ch; } rstr.truncate( cursor - (uchar*)rstr.data() ); + if (!d->cString) { + d->cString = new QCString; + } + *d->cString = rstr; return rstr; } @@ -5964,23 +5968,28 @@ QString QString::fromLatin1( const char* chars, int len ) QCString QString::local8Bit() const { + if (!d->cString) { + d->cString = new QCString; + } #ifdef QT_NO_TEXTCODEC - return latin1(); + *d->cString = QCString(latin1()); + return *d->cString; #else #ifdef Q_WS_X11 QTextCodec* codec = QTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : QCString(latin1()); + *d->cString = codec ? codec->fromUnicode(*this) : QCString(latin1()); + return *d->cString; #endif #if defined( Q_WS_MACX ) return utf8(); #endif #if defined( Q_WS_MAC9 ) - return QCString(latin1()); //I'm evil.. + *d->cString = QCString(latin1()); //I'm evil.. + return *d->cString; #endif #ifdef Q_WS_WIN - return isNull() ? QCString("") : qt_winQString2MB( *this ); + *d->cString = isNull() ? QCString("") : qt_winQString2MB( *this ); + return *d->cString; #endif #ifdef Q_WS_QWS return utf8(); // ### if there is any 8 bit format supported? diff --git a/src/tools/qstring.h b/src/tools/qstring.h index 587d0f2..f36e581 100644 --- a/src/tools/qstring.h +++ b/src/tools/qstring.h @@ -360,11 +360,13 @@ inline bool operator>( QChar c1, QChar c2 ) { return !(c2>=c1); } // internal struct Q_EXPORT QStringData : public QShared { QStringData() : - QShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); } + QShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE), cString(0) { ref(); } QStringData(QChar *u, uint l, uint m) : - QShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { } + QShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE), cString(0) { } ~QStringData() { if ( unicode ) delete[] ((char*)unicode); - if ( ascii ) delete[] ascii; } + if ( ascii ) delete[] ascii; + if (cString) delete cString; + } void deleteSelf(); QChar *unicode; @@ -374,6 +376,10 @@ struct Q_EXPORT QStringData : public QShared { delete [] ascii; ascii = 0; } + if (cString) { + delete cString; + cString = 0; + } issimpletext = FALSE; } #ifdef Q_OS_MAC9 @@ -389,6 +395,8 @@ struct Q_EXPORT QStringData : public QShared { #endif uint islatin1 : 1; + QCString *cString; + private: #if defined(Q_DISABLE_COPY) QStringData( const QStringData& ); |