|
|
|
@ -65,10 +65,18 @@
|
|
|
|
|
#if defined(Q_WS_WIN)
|
|
|
|
|
#include "qt_windows.h"
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
#endif
|
|
|
|
|
#if !defined( QT_NO_COMPONENT ) && !defined( QT_LITE_COMPONENT )
|
|
|
|
|
#include "ntqcleanuphandler.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
#define LINUX_MEMLOCK_LIMIT_BYTES 16384
|
|
|
|
|
#define LINUX_MEMLOCK_LIMIT_CHARACTERS LINUX_MEMLOCK_LIMIT_BYTES/sizeof(TQChar)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef LLONG_MAX
|
|
|
|
|
#define LLONG_MAX TQ_INT64_C(9223372036854775807)
|
|
|
|
|
#endif
|
|
|
|
@ -1025,6 +1033,14 @@ static inline bool format(TQChar::Decomposition tag, TQString & str,
|
|
|
|
|
} // format()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
TQStringData::~TQStringData() {
|
|
|
|
|
if ( unicode ) delete[] ((char*)unicode);
|
|
|
|
|
if ( ascii && security_unpaged ) {
|
|
|
|
|
munlock(ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
}
|
|
|
|
|
if ( ascii ) delete[] ascii;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
TQString::compose() and visual() were developed by Gordon Tisher
|
|
|
|
|
<tisher@uniserve.ca>, with input from Lars Knoll <knoll@mpi-hd.mpg.de>,
|
|
|
|
@ -1202,6 +1218,15 @@ static TQChar* internalLatin1ToUnicode( const char *str, uint* len,
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
ABI compatibility
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
char* TQString::unicodeToLatin1(const TQChar *uc, uint l)
|
|
|
|
|
{
|
|
|
|
|
return unicodeToLatin1(uc, l, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
This utility function converts \a l 16-bit characters from \a uc
|
|
|
|
|
to ASCII, returning a '\0'-terminated string.
|
|
|
|
@ -1209,13 +1234,19 @@ static TQChar* internalLatin1ToUnicode( const char *str, uint* len,
|
|
|
|
|
The caller is responsible for deleting the resultant string with
|
|
|
|
|
delete[].
|
|
|
|
|
*/
|
|
|
|
|
char* TQString::unicodeToLatin1(const TQChar *uc, uint l)
|
|
|
|
|
|
|
|
|
|
char* TQString::unicodeToLatin1(const TQChar *uc, uint l, bool unpaged)
|
|
|
|
|
{
|
|
|
|
|
if (!uc) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
char *a = new char[l+1];
|
|
|
|
|
char *result = a;
|
|
|
|
|
if (unpaged) {
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
mlock(result, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
while (l--) {
|
|
|
|
|
*a++ = (uc->unicode() > 0xff) ? '?' : (char)uc->unicode();
|
|
|
|
|
uc++;
|
|
|
|
@ -1707,8 +1738,10 @@ void TQString::setLength( uint newLen )
|
|
|
|
|
if ( nd ) {
|
|
|
|
|
uint len = TQMIN( d->len, newLen );
|
|
|
|
|
memcpy( nd, d->unicode, sizeof(TQChar) * len );
|
|
|
|
|
bool unpaged = d->security_unpaged;
|
|
|
|
|
deref();
|
|
|
|
|
d = new TQStringData( nd, newLen, newMax );
|
|
|
|
|
setSecurityUnPaged(unpaged);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
d->len = newLen;
|
|
|
|
@ -1760,8 +1793,10 @@ void TQString::reserve( uint minCapacity )
|
|
|
|
|
uint len = d->len;
|
|
|
|
|
if ( len )
|
|
|
|
|
memcpy( nd, d->unicode, sizeof(TQChar) * len );
|
|
|
|
|
bool unpaged = d->security_unpaged;
|
|
|
|
|
deref();
|
|
|
|
|
d = new TQStringData( nd, len, minCapacity );
|
|
|
|
|
setSecurityUnPaged(unpaged);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1780,8 +1815,10 @@ void TQString::squeeze()
|
|
|
|
|
uint len = d->len;
|
|
|
|
|
if ( len )
|
|
|
|
|
memcpy( nd, d->unicode, sizeof(TQChar) * len );
|
|
|
|
|
bool unpaged = d->security_unpaged;
|
|
|
|
|
deref();
|
|
|
|
|
d = new TQStringData( nd, len, len );
|
|
|
|
|
setSecurityUnPaged(unpaged);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -2744,9 +2781,11 @@ TQString& TQString::fill( TQChar c, int len )
|
|
|
|
|
if ( len == 0 ) {
|
|
|
|
|
*this = "";
|
|
|
|
|
} else {
|
|
|
|
|
bool unpaged = d->security_unpaged;
|
|
|
|
|
deref();
|
|
|
|
|
TQChar * nd = QT_ALLOC_QCHAR_VEC( len );
|
|
|
|
|
d = new TQStringData(nd,len,len);
|
|
|
|
|
setSecurityUnPaged(unpaged);
|
|
|
|
|
while (len--) *nd++ = c;
|
|
|
|
|
}
|
|
|
|
|
return *this;
|
|
|
|
@ -5678,8 +5717,15 @@ TQString &TQString::operator+=( char c )
|
|
|
|
|
const char* TQString::latin1() const
|
|
|
|
|
{
|
|
|
|
|
if ( !d->ascii || !d->islatin1 ) {
|
|
|
|
|
if (d->security_unpaged) {
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
if (d->ascii) {
|
|
|
|
|
munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
delete [] d->ascii;
|
|
|
|
|
d->ascii = unicodeToLatin1( d->unicode, d->len );
|
|
|
|
|
d->ascii = unicodeToLatin1( d->unicode, d->len, d->security_unpaged );
|
|
|
|
|
d->islatin1 = TRUE;
|
|
|
|
|
}
|
|
|
|
|
return d->ascii;
|
|
|
|
@ -5699,10 +5745,22 @@ const char* TQString::ascii() const
|
|
|
|
|
#ifndef QT_NO_TEXTCODEC
|
|
|
|
|
if ( TQTextCodec::codecForCStrings() ) {
|
|
|
|
|
if ( !d->ascii || d->islatin1 ) {
|
|
|
|
|
if (d->security_unpaged) {
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
if (d->ascii) {
|
|
|
|
|
munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
delete [] d->ascii;
|
|
|
|
|
if (d->unicode) {
|
|
|
|
|
TQCString s = TQTextCodec::codecForCStrings()->fromUnicode( *this );
|
|
|
|
|
d->ascii = new char[s.length() + 1];
|
|
|
|
|
if (d->security_unpaged) {
|
|
|
|
|
#if defined(Q_OS_LINUX)
|
|
|
|
|
mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
memcpy(d->ascii, s.data(), s.length() + 1);
|
|
|
|
|
} else {
|
|
|
|
|
d->ascii = 0;
|
|
|
|
@ -5715,6 +5773,23 @@ const char* TQString::ascii() const
|
|
|
|
|
return latin1();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TQString::setSecurityUnPaged(bool lock) {
|
|
|
|
|
if (lock != d->security_unpaged) {
|
|
|
|
|
if (d->security_unpaged) {
|
|
|
|
|
if (d->ascii) {
|
|
|
|
|
munlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
}
|
|
|
|
|
d->security_unpaged = false;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (d->ascii) {
|
|
|
|
|
mlock(d->ascii, LINUX_MEMLOCK_LIMIT_BYTES);
|
|
|
|
|
}
|
|
|
|
|
d->security_unpaged = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
Returns the string encoded in UTF-8 format.
|
|
|
|
|
|
|
|
|
|