summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2019-02-10 11:25:02 +0100
committerSlávek Banko <slavek.banko@axis.cz>2019-02-10 11:26:51 +0100
commit80d5792c61ca4504242b77dcdd4b312b361551b4 (patch)
tree1e17a31de4675c0951e4de8c5c5760869034e2fb
parent6c6fcc79bf87913fac3e34c01e49f0bb72eddaf7 (diff)
downloadqt3-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.cpp21
-rw-r--r--src/tools/qstring.h14
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& );