diff options
Diffstat (limited to 'tqtinterface/qt4/src/tools/tqstring.cpp')
-rw-r--r-- | tqtinterface/qt4/src/tools/tqstring.cpp | 8493 |
1 files changed, 0 insertions, 8493 deletions
diff --git a/tqtinterface/qt4/src/tools/tqstring.cpp b/tqtinterface/qt4/src/tools/tqstring.cpp deleted file mode 100644 index c57b539..0000000 --- a/tqtinterface/qt4/src/tools/tqstring.cpp +++ /dev/null @@ -1,8493 +0,0 @@ -/**************************************************************************** -** -** Implementation of the TQString class and related Unicode functions -** -** Created : 920722 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the tools module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -// Don't define it while compiling this module, or USERS of TQt will -// not be able to link. -#ifdef TQT_NO_CAST_ASCII -#undef TQT_NO_CAST_ASCII -#endif - -#include "tqstring.h" -#include "tqregexp.h" -#include "tqdatastream.h" -#ifndef TQT_NO_TEXTCODEC -#include "tqtextcodec.h" -#endif -#include "tqlocale.h" -#include "tqlocale_p.h" - -#include "tqunicodetables_p.h" -#include <limits.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef TQ_OS_TEMP -#include <locale.h> -#endif -#if defined(TQ_WS_WIN) -#include "tqt_windows.h" -#endif -#if !defined( TQT_NO_COMPONENT ) && !defined( TQT_LITE_COMPONENT ) -#include "tqcleanuphandler.h" -#endif - -#ifndef LLONG_MAX -#define LLONG_MAX TQ_INT64_C(9223372036854775807) -#endif -#ifndef LLONG_MIN -#define LLONG_MIN (-LLONG_MAX - TQ_INT64_C(1)) -#endif -#ifndef ULLONG_MAX -#define ULLONG_MAX TQ_UINT64_C(18446744073709551615) -#endif - -#ifdef USE_QT4 - -// #include <Qt/qhash.h> - -// static QHash<void *, QByteArray> *asciiCache = 0; - -TQT_STATIC_CONST_IMPL TQChar TQChar::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::replacement((ushort)0xfffd); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderMark((ushort)0xfeff); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderSwapped((ushort)0xfffe); -TQT_STATIC_CONST_IMPL TQChar TQChar::nbsp((ushort)0x00a0); - -/*! - \internal -*/ -const char *TQString::ascii_helper() const -{ - // tqstring_ascii_ba must be a persistent member variable within the class instance, but NOT static. A static variable is global for ALL class instances (very bad!) - // Also, it MUST be declared mutable, otherwise a raft of "discards qualifiers" errors will pop up. - -// tqstring_ascii_ba = toAscii(); - // Get a real, TRUE copy of the data, not some stupid shared copy that will randomly invalidate my pointer at an unknown future date/time - QByteArray tempba = toAscii(); - tqstring_ascii_ba.resize(tempba.size()); - memcpy(tqstring_ascii_ba.data(), tempba.data(), tempba.size()); - return tqstring_ascii_ba.data(); -} - -/*! - \internal -*/ -const char *TQString::latin1_helper() const -{ - // tqstring_latin1_ba must be a persistent member variable within the class instance, but NOT static. A static variable is global for ALL class instances (very bad!) - // Also, it MUST be declared mutable, otherwise a raft of "discards qualifiers" errors will pop up. - - //tqstring_latin1_ba = toLatin1(); - // Get a real, TRUE copy of the data, not some stupid shared copy that will randomly invalidate my pointer at an unknown future date/time - QByteArray tempba = toLatin1(); - tqstring_latin1_ba.resize(tempba.size()); - memcpy(tqstring_latin1_ba.data(), tempba.data(), tempba.size()); - return tqstring_latin1_ba.data(); -} - -/*! - This utility function converts \a l 16-bit characters from \a uc - to ASCII, returning a '\0'-terminated string. - - The caller is responsible for deleting the resultant string with - delete[]. -*/ -char* TQString::tqunicodeToLatin1(const TQChar *uc, uint l) -{ - if (!uc) { - return 0; - } - char *a = new char[l+1]; - char *result = a; - while (l--) { - *a++ = (uc->tqunicode() > 0xff) ? '?' : (char)uc->tqunicode(); - uc++; - } - *a = '\0'; - return result; -} - -#if defined(Q_CC_MSVC) && _MSC_VER <= 1300 -const TQString::Null TQString::null; -#else -const TQString::Null TQString::null = { }; -#endif - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQString - - Writes the string \a str to the stream \a s. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQString &str ) -{ - if ( s.version() == 1 ) { - TQCString l( str.latin1() ); - s << l; - } - else { - int byteOrder = s.byteOrder(); - const TQChar* ub = str.tqunicode(); - if ( ub || s.version() < 3 ) { - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( str.length()*sizeof(TQChar) > auto_size ) { - b = new char[str.length()*sizeof(TQChar)]; - } else { - b = t; - } - int l = str.length(); - char *c=b; - while ( l-- ) { - if ( byteOrder == TQDataStream::BigEndian ) { - *c++ = (char)ub->row(); - *c++ = (char)ub->cell(); - } else { - *c++ = (char)ub->cell(); - *c++ = (char)ub->row(); - } - ub++; - } - s.writeBytes( b, sizeof(TQChar)*str.length() ); - if ( str.length()*sizeof(TQChar) > auto_size ) - delete [] b; - } else { - // write null marker - s << (TQ_UINT32)0xffffffff; - } - } - return s; -} - -/*! - \relates TQString - - Reads a string from the stream \a s into string \a str. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQString &str ) -{ -#ifdef TQT_TQSTRING_UCS_4 -#if defined(TQ_CC_GNU) -#warning "operator>> not working properly" -#endif -#endif - if ( s.version() == 1 ) { - TQCString l; - s >> l; - str = TQString( l ); - } - else { - TQ_UINT32 bytes = 0; - s >> bytes; // read size of string - if ( bytes == 0xffffffff ) { // null string - str = TQString::null; - } else if ( bytes > 0 ) { // not empty - int byteOrder = s.byteOrder(); - str.setLength( bytes/2 ); -// TQChar* ch = str.d->tqunicode; - TQChar* ch = static_cast<TQChar*>(str.data()); - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( bytes > auto_size ) { - b = new char[bytes]; - } else { - b = t; - } - s.readRawBytes( b, bytes ); - int bt = bytes/2; - char *oldb = b; - while ( bt-- ) { - if ( byteOrder == TQDataStream::BigEndian ) - *ch++ = (ushort) (((ushort)b[0])<<8) | (uchar)b[1]; - else - *ch++ = (ushort) (((ushort)b[1])<<8) | (uchar)b[0]; - b += 2; - } - if ( bytes > auto_size ) - delete [] oldb; - } else { - str = ""; - } - } - return s; -} -#endif // TQT_NO_DATASTREAM - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::operatorPlusEqHelper( const char *s, uint len2 ) -{ -// if ( s ) { -// #ifndef TQT_NO_TEXTCODEC -// if ( TQTextCodec::codecForCStrings() ) -// return operator+=( fromAscii( s, len2 ) ); -// #endif -// -// uint len1 = length(); -// if ( len2 == UINT_MAX ) -// len2 = int(strlen( s )); -// if ( len2 ) { -// grow( len1 + len2 ); -// TQChar* uc = d->tqunicode + len1; -// while ( len2-- ) -// *uc++ = *s++; -// } else if ( isNull() ) { // ## just for 1.x compat: -// *this = tqfromLatin1( "" ); -// } -// } -// return *this; - - this->append(s); - return *this; -} -#endif - -/*! - \class TQCharRef tqstring.h - \reentrant - \brief The TQCharRef class is a helper class for TQString. - - \ingroup text - - When you get an object of type TQCharRef, if you can assign to it, - the assignment will apply to the character in the string from - which you got the reference. That is its whole purpose in life. - The TQCharRef becomes invalid once modifications are made to the - string: if you want to keep the character, copy it into a TQChar. - - Most of the TQChar member functions also exist in TQCharRef. - However, they are not explicitly documented here. - - \sa TQString::operator[]() TQString::at() TQChar -*/ - -/*! \fn TQString& TQString::append( const char *str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! - Appends \a str to the string and returns a reference to the string. -*/ -TQString& TQString::operator+=( const TQString &str ) -{ -// uint len1 = length(); -// uint len2 = str.length(); -// if ( len2 ) { -// if ( isEmpty() ) { -// operator=( str ); -// } else { -// grow( len1+len2 ); -// memcpy( d->tqunicode+len1, str.tqunicode(), sizeof(TQChar)*len2 ); -// } -// } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat: -// *this = tqfromLatin1( "" ); -// } -// return *this; - - this->append(str); - return *this; -} - -/*! - \overload - - Appends \a str to the string and returns a reference to the string. -*/ -#ifndef TQT_NO_CAST_ASCII -TQString& TQString::operator+=( const char *str ) -{ - // ### TQt 4: make this function inline - return operatorPlusEqHelper( str ); -} -#endif - -/*! \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( TQChar c ) -{ -// grow( length()+1 ); -// d->tqunicode[length()-1] = c; -// return *this; - - this->append(c); - return *this; -} - -/*! - \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( char c ) -{ -// #ifndef TQT_NO_TEXTCODEC -// if ( TQTextCodec::codecForCStrings() ) -// return operator+=( fromAscii( &c, 1 ) ); -// #endif -// grow( length()+1 ); -// d->tqunicode[length()-1] = c; -// return *this; - - this->append(c); - return *this; -} - -TQString &TQString::operator+=(const QStringRef &s) { - //return convertFromQString(); - return (*static_cast<TQString*>(&append(s))); -} - -TQString &TQString::operator+=(const QLatin1String &s) { - return (*static_cast<TQString*>(&append(s))); -} - -TQString &TQString::operator+=(QChar c) { - return (*static_cast<TQString*>(&append(c))); -} - -/*! - \fn TQCharRef TQString::at( uint i ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::null. -*/ - -/* - Internal chunk of code to handle the - uncommon cases of at() above. -*/ -void TQString::subat( uint i ) -{ - uint olen = length(); - if ( i >= olen ) { - setLength( i+1 ); // i is index; i+1 is needed length - for ( uint j=olen; j<=i; j++ ) - tqat(j) = TQChar::null; - } else { - // Just be sure to detach -// real_detach(); - } -} - -/*! - \fn const TQChar* TQString::tqunicode() const - - Returns the Unicode representation of the string. The result - remains valid until the string is modified. -*/ - -/*! - Returns the string encoded in a locale-specific format. On X11, - this is the TQTextCodec::codecForLocale(). On Windows, it is a - system-defined encoding. On Mac OS X, this always uses UTF-8 as - the encoding. - - See TQTextCodec for more diverse coding/decoding of Unicode - strings. - - \sa fromLocal8Bit(), ascii(), latin1(), utf8() -*/ - -TQCString TQString::local8Bit() const -{ -#ifdef TQT_NO_TEXTCODEC - return latin1(); -#else -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : TQCString(latin1()); -#endif -#if defined( TQ_WS_MACX ) - return utf8(); -#endif -#if defined( TQ_WS_MAC9 ) - return TQCString(latin1()); //I'm evil.. -#endif -#ifdef TQ_WS_WIN - return isNull() ? TQCString("") : qt_winTQString2MB( *this ); -#endif -#ifdef TQ_WS_TQWS - return utf8(); // ### if there is any 8 bit format supported? -#endif -#endif -} - -// TQCString TQString::local8Bit() const -// { -// return toLocal8Bit(); -// } - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a utf8, ignoring the rest of \a utf8. If \a len is - -1 then the length of \a utf8 is used. If \a len is bigger than - the length of \a utf8 then it will use the length of \a utf8. - - \code - TQString str = TQString::fromUtf8( "123456789", 5 ); - // str == "12345" - \endcode - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromUtf8( const char* utf8, int len ) -{ - if ( !utf8 ) - return TQString(); - TQString result = QString::fromUtf8(utf8, len); - int slen = int(strlen(utf8)); - if (result.length() > slen) { - result.truncate(slen); - } - return result; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a chars, ignoring the rest of \a chars. If \a len - is -1 then the length of \a chars is used. If \a len is bigger - than the length of \a chars then it will use the length of \a - chars. - - \sa fromAscii() -*/ -TQString TQString::fromLatin1( const char* chars, int len ) -{ - if ( !chars ) - return TQString(); - TQString result = QString::fromLatin1(chars, len); - int slen = int(strlen(chars)); - if (result.length() > slen) { - result.truncate(slen); - } - return result; -} - -/*! - Returns the string encoded in UTF-8 format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. - - \sa fromUtf8(), ascii(), latin1(), local8Bit() -*/ -TQCString TQString::utf8() const -{ - int l = length(); - int rlen = l*3+1; - TQCString rstr(rlen); - uchar* cursor = (uchar*)rstr.data(); - const TQChar *ch = static_cast<const TQChar*>(data()); - for (int i=0; i < l; i++) { - uint u = ch->tqunicode(); - if ( u < 0x80 ) { - *cursor++ = (uchar)u; - } else { - if ( u < 0x0800 ) { - *cursor++ = 0xc0 | ((uchar) (u >> 6)); - } else { - if (u >= 0xd800 && u < 0xdc00 && i < l-1) { - unsigned short low = ch[1].tqunicode(); - if (low >= 0xdc00 && low < 0xe000) { - ++ch; - ++i; - u = (u - 0xd800)*0x400 + (low - 0xdc00) + 0x10000; - } - } - if (u > 0xffff) { - // if people are working in utf8, but strings are encoded in eg. latin1, the resulting - // name might be invalid utf8. This and the corresponding code in fromUtf8 takes care - // we can handle this without loosing information. This can happen with latin filenames - // and a utf8 locale under Unix. - if (u > 0x10fe00 && u < 0x10ff00) { - *cursor++ = (u - 0x10fe00); - ++ch; - continue; - } else { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | ( ((uchar) (u >> 12)) & 0x3f); - } - } else { - *cursor++ = 0xe0 | ((uchar) (u >> 12)); - } - *cursor++ = 0x80 | ( ((uchar) (u >> 6)) & 0x3f); - } - *cursor++ = 0x80 | ((uchar) (u&0x3f)); - } - ++ch; - } - rstr.truncate( cursor - (uchar*)rstr.data() ); - return rstr; -} - -static bool tqIsUpper(char c) -{ - return c >= 'A' && c <= 'Z'; -} - -static bool tqIsDigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static char tqToLower(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} - -struct ArgEscapeData -{ - uint min_escape; // lowest escape sequence number - uint occurrences; // number of occurences of the lowest escape - // sequence number - uint locale_occurrences; // number of occurences of the lowest escape - // sequence number which contain 'L' - uint escape_len; // total length of escape sequences which will - // be replaced -}; - -static ArgEscapeData findArgEscapes(const TQString &s) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - ArgEscapeData d; - - d.min_escape = 10; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - - const TQChar *c = uc_begin; - while (c != uc_end) { - while (c != uc_end && c->tqunicode() != '%') - ++c; - - if (c == uc_end || ++c == uc_end) - break; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - if (++c == uc_end) - break; - } - - if (c->tqunicode() < '0' || c->tqunicode() > '9') - continue; - - uint escape = c->tqunicode() - '0'; - ++c; - - if (escape > d.min_escape) - continue; - - if (escape < d.min_escape) { - d.min_escape = escape; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - } - -#if TQT_VERSION < 0x040000 - // ### remove preprocessor in TQt 4.0 - /* Since in TQt < 4.0 only the first instance is replaced, - escape_len should hold the length of only the first escape - sequence */ - if (d.occurrences == 0) -#endif - { - ++d.occurrences; - if (locale_arg) { - ++d.locale_occurrences; - d.escape_len += 3; - } - else - d.escape_len += 2; - } - } - - return d; -} - -static TQString replaceArgEscapes(const TQString &s, const ArgEscapeData &d, int field_width, - const TQString &arg, const TQString &larg) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - uint abs_field_width = TQABS(field_width); - uint result_len = s.length() - - d.escape_len - + (d.occurrences - d.locale_occurrences) - *TQMAX(abs_field_width, arg.length()) - + d.locale_occurrences - *TQMAX(abs_field_width, larg.length()); - - TQString result; - result.setLength(result_len); - TQChar *result_buff = (TQChar*) result.tqunicode(); - - TQChar *rc = result_buff; - const TQChar *c = uc_begin; - uint repl_cnt = 0; - while (c != uc_end) { - /* We don't have to check if we run off the end of the string with c, - because as long as d.occurrences > 0 we KNOW there are valid escape - sequences. */ - - const TQChar *text_start = c; - - while (c->tqunicode() != '%') - ++c; - - const TQChar *escape_start = c++; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - ++c; - } - - if (c->tqunicode() != '0' + d.min_escape) { - memcpy(rc, text_start, (c - text_start)*sizeof(TQChar)); - rc += c - text_start; - } - else { - ++c; - - memcpy(rc, text_start, (escape_start - text_start)*sizeof(TQChar)); - rc += escape_start - text_start; - - uint pad_chars; - if (locale_arg) - pad_chars = TQMAX(abs_field_width, larg.length()) - larg.length(); - else - pad_chars = TQMAX(abs_field_width, arg.length()) - arg.length(); - - if (field_width > 0) { // left padded - for (uint i = 0; i < pad_chars; ++i) -// (rc++)->tqunicode() = ' '; - *(rc++) = ' '; - } - - if (locale_arg) { - memcpy(rc, larg.tqunicode(), larg.length()*sizeof(TQChar)); - rc += larg.length(); - } - else { - memcpy(rc, arg.tqunicode(), arg.length()*sizeof(TQChar)); - rc += arg.length(); - } - - if (field_width < 0) { // right padded - for (uint i = 0; i < pad_chars; ++i) -// (rc++)->tqunicode() = ' '; - *(rc++) = ' '; - } - - if (++repl_cnt == d.occurrences) { - memcpy(rc, c, (uc_end - c)*sizeof(TQChar)); - rc += uc_end - c; - TQ_ASSERT(rc - result_buff == (int)result_len); - c = uc_end; - } - } - } - - return result; -} - -/*! - This function will return a string that replaces the lowest - numbered occurrence of \c %1, \c %2, ..., \c %9 with \a a. - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce right-aligned - text, whereas a negative value will produce left-aligned text. - - The following example shows how we could create a 'status' string - when processing a list of files: - \code - TQString status = TQString( "Processing file %1 of %2: %3" ) - .tqarg( i ) // current file's number - .tqarg( total ) // number of files to process - .tqarg( fileName ); // current file's name - \endcode - - It is generally fine to use filenames and numbers as we have done - in the example above. But note that using tqarg() to construct - natural language sentences does not usually translate well into - other languages because sentence structure and word order often - differ between languages. - - If there is no place marker (\c %1, \c %2, etc.), a warning - message (qWarning()) is output and the result is undefined. - - \warning If any placeholder occurs more than once, the result is undefined. - -*/ -TQString TQString::tqarg( const TQString& a, int fieldWidth ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %s", latin1(), - a.latin1() ); - return *this; - } - - return replaceArgEscapes(*this, d, fieldWidth, a, a); -} - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2 ) const - - \overload - - This is the same as str.tqarg(\a a1).tqarg(\a a2), except that - the strings are replaced in one pass. This can make a difference - if \a a1 contains e.g. \c{%1}: - - \code - TQString str( "%1 %2" ); - str.tqarg( "Hello", "world" ); // returns "Hello world" - str.tqarg( "Hello" ).tqarg( "world" ); // returns "Hello world" - - str.tqarg( "(%1)", "Hello" ); // returns "(%1) Hello" - str.tqarg( "(%1)" ).tqarg( "Hello" ); // returns "(Hello) %2" - \endcode -*/ - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const - \overload - - This is the same as calling str.tqarg(\a a1).tqarg(\a a2).tqarg(\a a3), - except that the strings are replaced in one pass. -*/ - -/*! - \fn TQString TQString::tqarg( const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const - \overload - - This is the same as calling - str.tqarg(\a a1).tqarg(\a a2).tqarg(\a a3).tqarg(\a a4), - except that the strings are replaced in one pass. -*/ - -/*! - \overload - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce a right-aligned - number, whereas a negative value will produce a left-aligned - number. - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. - - The '%' can be followed by an 'L', in which case the sequence is - replaced with a localized representation of \a a. The conversion - uses the default locale. The default locale is determined from the - system's locale settings at application startup. It can be changed - using TQLocale::setDefault(). The 'L' flag is ignored if \a base is - not 10. - - \code - TQString str; - str = TQString( "Decimal 63 is %1 in hexadecimal" ) - .tqarg( 63, 0, 16 ); - // str == "Decimal 63 is 3f in hexadecimal" - - TQLocale::setDefault(TQLocale::English, TQLocale::UnitedStates); - str = TQString( "%1 %L2 %L3" ) - .tqarg( 12345 ) - .tqarg( 12345 ) - .tqarg( 12345, 0, 16 ); - // str == "12345 12,345 3039" - \endcode -*/ -TQString TQString::tqarg( long a, int fieldWidth, int base ) const -{ - return tqarg((TQ_LLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( ulong a, int fieldWidth, int base ) const -{ - return tqarg((TQ_ULLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( TQ_LLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %lld", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->longLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::tqarg( TQ_ULLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %llu", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->unsLongLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \fn TQString TQString::tqarg( int a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( uint a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( short a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::tqarg( ushort a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - - -/*! - \overload - - \a a is assumed to be in the Latin-1 character set. -*/ -TQString TQString::tqarg( char a, int fieldWidth ) const -{ - TQString c; - c += a; - return tqarg( c, fieldWidth ); -} - -/*! - \overload -*/ -TQString TQString::tqarg( TQChar a, int fieldWidth ) const -{ - TQString c; - c += a; - return tqarg( c, fieldWidth ); -} - -/*! - \overload - - \target arg-formats - - Argument \a a is formatted according to the \a fmt format specified, - which is 'g' by default and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .tqarg( d, 0, 'E', 3 ); - // ds == "'E' format, precision 3, gives 1.234E+01" - \endcode - - The '%L' syntax can be used to produce localized strings. -*/ -TQString TQString::tqarg( double a, int fieldWidth, char fmt, int prec ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::tqarg(): Argument missing: %s, %g", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, fmt, prec); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (tqIsUpper(fmt)) - flags = TQLocalePrivate::CapitalEorX; - fmt = tqToLower(fmt); - - switch (fmt) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", fmt ); -#endif - break; - } - - flags |= TQLocalePrivate::ThousandsGroup; - - locale_arg = locale.d->doubleToString(a, prec, form, -1, flags); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -TQString TQString::tqmultiArg( int numArgs, const TQString& a1, const TQString& a2, const TQString& a3, const TQString& a4 ) const -{ - TQString result; - union { - int digitUsed[10]; - int argForDigit[10]; - }; - register const TQChar *uc = this->tqunicode(); - const TQString *args[4]; - const int len = (int) length(); - const int end = len - 1; - int lastDigit = -1; - int i; - - memset( digitUsed, 0, sizeof(digitUsed) ); - args[0] = &a1; - args[1] = &a2; - args[2] = &a3; - args[3] = &a4; - - for ( i = 0; i < end; i++ ) { - if ( uc[i] == '%' ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= 9 ) - digitUsed[digit]++; - } - } - - for ( i = 0; i < numArgs; i++ ) { - do { - ++lastDigit; - } while ( lastDigit < 10 && digitUsed[lastDigit] == 0 ); - - if ( lastDigit == 10 ) { - qWarning( "TQString::arg(): Argument missing: %s, %s", - latin1(), args[i]->latin1() ); - numArgs = i; - lastDigit = 9; - break; - } - argForDigit[lastDigit] = i; - } - - i = 0; - while ( i < len ) { - if ( uc[i] == '%' && i != end ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= lastDigit ) { - result += *args[argForDigit[digit]]; - i += 2; - continue; - } - } - result += uc[i++]; - } - return result; -} - -TQString &TQString::setAscii( const char *str, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - *this = TQString::fromAscii( str, len ); - return *this; - } -#endif // TQT_NO_TEXTCODEC - return setLatin1( str, len ); -} - -TQString &TQString::setLatin1( const char *ch, int len ) { - *this = fromLatin1(ch, len); return *this; -} - -bool TQString::simpleText() const { - if ( !tqstring_issimpletext ) checkSimpleText(); - return tqstring_issimpletext; -} - -/*! \internal - */ -void TQString::checkSimpleText() const -{ - TQChar *p = const_cast<TQChar*>(tqunicode()); - TQChar *end = p + length(); - while ( p < end ) { - ushort uc = p->tqunicode(); - // sort out regions of complex text formatting - if ( uc > 0x058f && ( uc < 0x1100 || uc > 0xfb0f ) ) { - tqstring_issimpletext = FALSE; - return; - } - p++; - } - tqstring_issimpletext = TRUE; -} - -/*! - Resizes the string to \a len characters and copies \a - tqunicode_as_ushorts into the string (on some X11 client platforms - this will involve a byte-swapping pass). - - If \a tqunicode_as_ushorts is 0, nothing is copied, but the string - is still resized to \a len. If \a len is zero, the string becomes - a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ -TQString TQString::setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ) -{ - return TQString(setUnicode((const TQChar*)tqunicode_as_ushorts, len)); -} - -/*! - Returns the string converted to a \c double value. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString string( "1234.56" ); - double a = string.toDouble(); // a == 1234.56 - \endcode - - The string-to-number functions: - \list - \i toShort() - \i toUShort() - \i toInt() - \i toUInt() - \i toLong() - \i toULong() - \i toLongLong() - \i toULongLong() - \i toFloat() - \i toDouble() - \endlist - can handle numbers - represented in various locales. These representations may use different - characters for the decimal point, thousands group sepearator - and even individual digits. TQString's functions try to interpret - the string according to the current locale. The current locale is - determined from the system at application startup and can be changed - by calling TQLocale::setDefault(). If the string cannot be interpreted - according to the current locale, this function falls back - on the "C" locale. - - \code - bool ok; - double d; - - TQLocale::setDefault(TQLocale::C); - d = TQString( "1234,56" ).toDouble(&ok); // ok == false - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale::German); - d = TQString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56 - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - \endcode - - Due to the ambiguity between the decimal point and thousands group - separator in various locales, these functions do not handle - thousands group separators. If you need to convert such numbers, - use the corresponding function in TQLocale. - - \code - bool ok; - TQLocale::setDefault(TQLocale::C); - double d = TQString( "1,234,567.89" ).toDouble(&ok); // ok == false - \endcode - - \warning If the string contains trailing whitespace this function - will fail, and set \a *ok to false if \a ok is not 0. Leading - whitespace is ignored. - - \sa number() TQLocale::setDefault() TQLocale::toDouble() stripWhiteSpace() -*/ - -double TQString::toDouble( bool *ok ) const -{ - // If there is trailing whitespace, set ok to false but return the correct - // result anyway to preserve behavour of pervious versions of TQt - if (length() > 0 && tqunicode()[length() - 1].isSpace()) { - TQString tmp = stripWhiteSpace(); - if (ok != 0) - *ok = FALSE; - return tmp.toDouble(); - } - - // Try the default locale - bool my_ok; - TQLocale def_locale; - double result = def_locale.d->stringToDouble(*this, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToDouble(*this, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c float value. - - Returns 0.0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \warning If the string contains trailing whitespace this function - will fail, settings \a *ok to false if \a ok is not 0. - Leading whitespace is ignored. - - \sa number() -*/ - -#define TQT_MAX_FLOAT 3.4028234663852886e+38 - -float TQString::toFloat( bool *ok ) const -{ - bool myOk; - double d = toDouble(&myOk); - if (!myOk || d > TQT_MAX_FLOAT || d < -TQT_MAX_FLOAT) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - if (ok != 0) - *ok = TRUE; - return (float) d; -} - -/*! - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. The returned string is in "C" locale. - - The base is 10 by default and must be between 2 and 36. - - \code - TQString string; - string = string.setNum( 1234 ); // string == "1234" - \endcode -*/ - -#else // USE_QT4 - -static int ucstrcmp( const TQString &as, const TQString &bs ) -{ - const TQChar *a = as.tqunicode(); - const TQChar *b = bs.tqunicode(); - if ( a == b ) - return 0; - if ( a == 0 ) - return 1; - if ( b == 0 ) - return -1; - int l=TQMIN(as.length(),bs.length()); - while ( l-- && *a == *b ) - a++,b++; - if ( l==-1 ) - return ( as.length()-bs.length() ); - return a->tqunicode() - b->tqunicode(); -} - -static int ucstrncmp( const TQChar *a, const TQChar *b, int l ) -{ - while ( l-- && *a == *b ) - a++,b++; - if ( l==-1 ) - return 0; - return a->tqunicode() - b->tqunicode(); -} - -static int ucstrnicmp( const TQChar *a, const TQChar *b, int l ) -{ - while ( l-- && ::lower( *a ) == ::lower( *b ) ) - a++,b++; - if ( l==-1 ) - return 0; - return ::lower( *a ).tqunicode() - ::lower( *b ).tqunicode(); -} - -static uint computeNewMax( uint len ) -{ - if (len >= 0x80000000) - return len; - - uint newMax = 4; - while ( newMax < len ) - newMax *= 2; - // try to save some memory - if ( newMax >= 1024 * 1024 && len <= newMax - (newMax >> 2) ) - newMax -= newMax >> 2; - return newMax; -} - -static bool qIsUpper(char c) -{ - return c >= 'A' && c <= 'Z'; -} - -static bool qIsDigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static char qToLower(char c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - else - return c; -} - -/*! - \class TQCharRef tqstring.h - \reentrant - \brief The TQCharRef class is a helper class for TQString. - - \ingroup text - - When you get an object of type TQCharRef, if you can assign to it, - the assignment will apply to the character in the string from - which you got the reference. That is its whole purpose in life. - The TQCharRef becomes invalid once modifications are made to the - string: if you want to keep the character, copy it into a TQChar. - - Most of the TQChar member functions also exist in TQCharRef. - However, they are not explicitly documented here. - - \sa TQString::operator[]() TQString::at() TQChar -*/ - -/*! - \class TQChar tqstring.h - \reentrant - \brief The TQChar class provides a lightweight Unicode character. - - \ingroup text - - Unicode characters are (so far) 16-bit entities without any markup - or structure. This class represents such an entity. It is - lightweight, so it can be used everywhere. Most compilers treat it - like a "short int". (In a few years it may be necessary to make - TQChar 32-bit when more than 65536 Unicode code points have been - defined and come into use.) - - TQChar provides a full complement of testing/classification - functions, converting to and from other formats, converting from - composed to decomposed Unicode, and trying to compare and - case-convert if you ask it to. - - The classification functions include functions like those in - ctype.h, but operating on the full range of Unicode characters. - They all return TRUE if the character is a certain type of - character; otherwise they return FALSE. These classification - functions are isNull() (returns TRUE if the character is U+0000), - isPrint() (TRUE if the character is any sort of printable - character, including whitespace), isPunct() (any sort of - punctation), isMark() (Unicode Mark), isLetter (a letter), - isNumber() (any sort of numeric character), isLetterOrNumber(), - and isDigit() (decimal digits). All of these are wrappers around - category() which return the Unicode-defined category of each - character. - - TQChar further provides direction(), which indicates the "natural" - writing direction of this character. The joining() function - indicates how the character joins with its neighbors (needed - mostly for Arabic) and finally mirrored(), which indicates whether - the character needs to be mirrored when it is printed in its - "unnatural" writing direction. - - Composed Unicode characters (like å) can be converted to - decomposed Unicode ("a" followed by "ring above") by using - decomposition(). - - In Unicode, comparison is not necessarily possible and case - conversion is very difficult at best. Unicode, covering the - "entire" world, also includes most of the world's case and sorting - problems. TQt tries, but not very hard: operator==() and friends - will do comparison based purely on the numeric Unicode value (code - point) of the characters, and upper() and lower() will do case - changes when the character has a well-defined upper/lower-case - equivalent. There is no provision for locale-dependent case - folding rules or comparison; these functions are meant to be fast - so they can be used unambiguously in data structures. (See - TQString::localeAwareCompare() though.) - - The conversion functions include tqunicode() (to a scalar), latin1() - (to scalar, but converts all non-Latin-1 characters to 0), row() - (gives the Unicode row), cell() (gives the Unicode cell), - digitValue() (gives the integer value of any of the numerous digit - characters), and a host of constructors. - - More information can be found in the document \link tqunicode.html - About Unicode. \endlink - - \sa TQString TQCharRef -*/ - -/*! - \enum TQChar::Category - - This enum maps the Unicode character categories. - - The following characters are normative in Unicode: - - \value Mark_NonSpacing Unicode class name Mn - - \value Mark_SpacingCombining Unicode class name Mc - - \value Mark_Enclosing Unicode class name Me - - \value Number_DecimalDigit Unicode class name Nd - - \value Number_Letter Unicode class name Nl - - \value Number_Other Unicode class name No - - \value Separator_Space Unicode class name Zs - - \value Separator_Line Unicode class name Zl - - \value Separator_Paragraph Unicode class name Zp - - \value Other_Control Unicode class name Cc - - \value Other_Format Unicode class name Cf - - \value Other_Surrogate Unicode class name Cs - - \value Other_PrivateUse Unicode class name Co - - \value Other_NotAssigned Unicode class name Cn - - - The following categories are informative in Unicode: - - \value Letter_Uppercase Unicode class name Lu - - \value Letter_Lowercase Unicode class name Ll - - \value Letter_Titlecase Unicode class name Lt - - \value Letter_Modifier Unicode class name Lm - - \value Letter_Other Unicode class name Lo - - \value Punctuation_Connector Unicode class name Pc - - \value Punctuation_Dash Unicode class name Pd - - \value Punctuation_Open Unicode class name Ps - - \value Punctuation_Close Unicode class name Pe - - \value Punctuation_InitialQuote Unicode class name Pi - - \value Punctuation_FinalQuote Unicode class name Pf - - \value Punctuation_Other Unicode class name Po - - \value Symbol_Math Unicode class name Sm - - \value Symbol_Currency Unicode class name Sc - - \value Symbol_Modifier Unicode class name Sk - - \value Symbol_Other Unicode class name So - - - There are two categories that are specific to TQt: - - \value NoCategory used when TQt is dazed and confused and cannot - make sense of anything. - - \value Punctuation_Dask old typo alias for Punctuation_Dash - -*/ - -/*! - \enum TQChar::Direction - - This enum type defines the Unicode direction attributes. See \link - http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. - - In order to conform to C/C++ naming conventions "Dir" is prepended - to the codes used in the Unicode Standard. -*/ - -/*! - \enum TQChar::Decomposition - - This enum type defines the Unicode decomposition attributes. See - \link http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. -*/ - -/*! - \enum TQChar::Joining - - This enum type defines the Unicode joining attributes. See \link - http://www.tqunicode.org/ the Unicode Standard\endlink for a - description of the values. -*/ - -/*! - \enum TQChar::CombiningClass - - This enum type defines names for some of the Unicode combining - classes. See \link http://www.tqunicode.org/ the Unicode - Standard\endlink for a description of the values. -*/ - -/*! - \fn void TQChar::setCell( uchar cell ) - \internal -*/ - -/*! - \fn void TQChar::setRow( uchar row ) - \internal -*/ - - -/*! - \fn TQChar::TQChar() - - Constructs a null TQChar (one that isNull()). -*/ - - -/*! - \fn TQChar::TQChar( char c ) - - Constructs a TQChar corresponding to ASCII/Latin-1 character \a c. -*/ - - -/*! - \fn TQChar::TQChar( uchar c ) - - Constructs a TQChar corresponding to ASCII/Latin-1 character \a c. -*/ - - -/*! - \fn TQChar::TQChar( uchar c, uchar r ) - - Constructs a TQChar for Unicode cell \a c in row \a r. -*/ - - -/*! - \fn TQChar::TQChar( const TQChar& c ) - - Constructs a copy of \a c. This is a deep copy, if such a - lightweight object can be said to have deep copies. -*/ - - -/*! - \fn TQChar::TQChar( ushort rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( short rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( uint rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn TQChar::TQChar( int rc ) - - Constructs a TQChar for the character with Unicode code point \a rc. -*/ - - -/*! - \fn bool TQChar::networkOrdered () - - \obsolete - - Returns TRUE if this character is in network byte order (MSB - first); otherwise returns FALSE. This is platform dependent. -*/ - - -/*! - \fn bool TQChar::isNull() const - - Returns TRUE if the character is the Unicode character 0x0000 - (ASCII NUL); otherwise returns FALSE. -*/ - -/*! - \fn uchar TQChar::cell () const - - Returns the cell (least significant byte) of the Unicode - character. -*/ - -/*! - \fn uchar TQChar::row () const - - Returns the row (most significant byte) of the Unicode character. -*/ - -/*! - Returns TRUE if the character is a printable character; otherwise - returns FALSE. This is any character not of category Cc or Cn. - - Note that this gives no indication of whether the character is - available in a particular \link TQFont font\endlink. -*/ -bool TQChar::isPrint() const -{ - Category c = ::category( *this ); - return !(c == Other_Control || c == Other_NotAssigned); -} - -/*! - Returns TRUE if the character is a separator character - (Separator_* categories); otherwise returns FALSE. -*/ -bool TQChar::isSpace() const -{ - return ::isSpace( *this ); -} - -/*! - Returns TRUE if the character is a mark (Mark_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isMark() const -{ - Category c = ::category( *this ); - return c >= Mark_NonSpacing && c <= Mark_Enclosing; -} - -/*! - Returns TRUE if the character is a punctuation mark (Punctuation_* - categories); otherwise returns FALSE. -*/ -bool TQChar::isPunct() const -{ - Category c = ::category( *this ); - return (c >= Punctuation_Connector && c <= Punctuation_Other); -} - -/*! - Returns TRUE if the character is a letter (Letter_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isLetter() const -{ - Category c = ::category( *this ); - return (c >= Letter_Uppercase && c <= Letter_Other); -} - -/*! - Returns TRUE if the character is a number (of any sort - Number_* - categories); otherwise returns FALSE. - - \sa isDigit() -*/ -bool TQChar::isNumber() const -{ - Category c = ::category( *this ); - return c >= Number_DecimalDigit && c <= Number_Other; -} - -/*! - Returns TRUE if the character is a letter or number (Letter_* or - Number_* categories); otherwise returns FALSE. -*/ -bool TQChar::isLetterOrNumber() const -{ - Category c = ::category( *this ); - return (c >= Letter_Uppercase && c <= Letter_Other) - || (c >= Number_DecimalDigit && c <= Number_Other); -} - - -/*! - Returns TRUE if the character is a decimal digit - (Number_DecimalDigit); otherwise returns FALSE. -*/ -bool TQChar::isDigit() const -{ - return (::category( *this ) == Number_DecimalDigit); -} - - -/*! - Returns TRUE if the character is a symbol (Symbol_* categories); - otherwise returns FALSE. -*/ -bool TQChar::isSymbol() const -{ - Category c = ::category( *this ); - return c >= Symbol_Math && c <= Symbol_Other; -} - -/*! - Returns the numeric value of the digit, or -1 if the character is - not a digit. -*/ -int TQChar::digitValue() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decimal_info[row()]; - if( !pos ) - return -1; - return TQUnicodeTables::decimal_info[(pos<<8) + cell()]; -#else - // ##### just latin1 - if ( ucs < '0' || ucs > '9' ) - return -1; - else - return ucs - '0'; -#endif -} - -/*! - Returns the character category. - - \sa Category -*/ -TQChar::Category TQChar::category() const -{ - return ::category( *this ); -} - -/*! - Returns the character's direction. - - \sa Direction -*/ -TQChar::Direction TQChar::direction() const -{ - return ::direction( *this ); -} - -/*! - \warning This function is not supported (it may change to use - Unicode character classes). - - Returns information about the joining properties of the character - (needed for example, for Arabic). -*/ -TQChar::Joining TQChar::joining() const -{ - return ::joining( *this ); -} - - -/*! - Returns TRUE if the character is a mirrored character (one that - should be reversed if the text direction is reversed); otherwise - returns FALSE. -*/ -bool TQChar::mirrored() const -{ - return ::mirrored( *this ); -} - -/*! - Returns the mirrored character if this character is a mirrored - character, otherwise returns the character itself. -*/ -TQChar TQChar::mirroredChar() const -{ - return ::mirroredChar( *this ); -} - -#ifndef TQT_NO_UNICODETABLES -// ### REMOVE ME 4.0 -static TQString shared_decomp; -#endif -/*! - \nonreentrant - - Decomposes a character into its parts. Returns TQString::null if no - decomposition exists. -*/ -const TQString &TQChar::decomposition() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decomposition_info[row()]; - if(!pos) return TQString::null; - - pos = TQUnicodeTables::decomposition_info[(pos<<8)+cell()]; - if(!pos) return TQString::null; - pos+=2; - - TQString s; - TQ_UINT16 c; - while ( (c = TQUnicodeTables::decomposition_map[pos++]) != 0 ) - s += TQChar( c ); - // ### In 4.0, return s, and not shared_decomp. shared_decomp - // prevents this function from being reentrant. - shared_decomp = s; - return shared_decomp; -#else - return TQString::null; -#endif -} - -/*! - Returns the tag defining the composition of the character. Returns - TQChar::Single if no decomposition exists. -*/ -TQChar::Decomposition TQChar::decompositionTag() const -{ -#ifndef TQT_NO_UNICODETABLES - register int pos = TQUnicodeTables::decomposition_info[row()]; - if(!pos) return TQChar::Single; - - pos = TQUnicodeTables::decomposition_info[(pos<<8)+cell()]; - if(!pos) return TQChar::Single; - - return (TQChar::Decomposition) TQUnicodeTables::decomposition_map[pos]; -#else - return Single; // ########### FIX eg. just latin1 -#endif -} - -/*! - Returns the combining class for the character as defined in the - Unicode standard. This is mainly useful as a positioning hint for - marks attached to a base character. - - The TQt text rendering engine uses this information to correctly - position non spacing marks around a base character. -*/ -unsigned char TQChar::combiningClass() const -{ - return ::combiningClass( *this ); -} - - -/*! - Returns the lowercase equivalent if the character is uppercase; - otherwise returns the character itself. -*/ -TQChar TQChar::lower() const -{ - return ::lower( *this ); -} - -/*! - Returns the uppercase equivalent if the character is lowercase; - otherwise returns the character itself. -*/ -TQChar TQChar::upper() const -{ - return ::upper( *this ); -} - -/*! - \fn TQChar::operator char() const - - Returns the Latin-1 character equivalent to the TQChar, or 0. This - is mainly useful for non-internationalized software. - - \sa tqunicode() -*/ - -/*! - \fn ushort TQChar::tqunicode() const - - Returns the numeric Unicode value equal to the TQChar. Normally, - you should use TQChar objects as they are equivalent, but for some - low-level tasks (e.g. indexing into an array of Unicode - information), this function is useful. -*/ - -/*! - \fn ushort & TQChar::tqunicode() - - \overload - - Returns a reference to the numeric Unicode value equal to the - TQChar. -*/ - -/***************************************************************************** - Documentation of TQChar related functions - *****************************************************************************/ - -/*! - \fn bool operator==( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if \a c1 and \a c2 are the same Unicode character; - otherwise returns FALSE. -*/ - -/*! - \fn bool operator==( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if \a c is the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn bool operator==( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if \a c is the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if \a c1 and \a c2 are not the same Unicode - character; otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if \a c is not the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator!=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if \a c is not the ASCII/Latin-1 character \a ch; - otherwise returns FALSE. -*/ - -/*! - \fn int operator<=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is less than - that of \a c2, or they are the same Unicode character; otherwise - returns FALSE. -*/ - -/*! - \fn int operator<=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is less than or - equal to that of the ASCII/Latin-1 character \a ch; otherwise - returns FALSE. -*/ - -/*! - \fn int operator<=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is less than or equal to that of \a c; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is greater than - that of \a c2, or they are the same Unicode character; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is greater than - or equal to that of the ASCII/Latin-1 character \a ch; otherwise - returns FALSE. -*/ - -/*! - \fn int operator>=( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is greater than or equal to that of \a c; - otherwise returns FALSE. -*/ - -/*! - \fn int operator<( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is less than - that of \a c2; otherwise returns FALSE. -*/ - -/*! - \fn int operator<( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is less than that - of the ASCII/Latin-1 character \a ch; otherwise returns FALSE. -*/ - -/*! - \fn int operator<( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is less than that of \a c; otherwise returns - FALSE. -*/ - -/*! - \fn int operator>( TQChar c1, TQChar c2 ) - - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c1 is greater than - that of \a c2; otherwise returns FALSE. -*/ - -/*! - \fn int operator>( TQChar c, char ch ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of \a c is greater than - that of the ASCII/Latin-1 character \a ch; otherwise returns FALSE. -*/ - -/*! - \fn int operator>( char ch, TQChar c ) - - \overload - \relates TQChar - - Returns TRUE if the numeric Unicode value of the ASCII/Latin-1 - character \a ch is greater than that of \a c; otherwise returns - FALSE. -*/ - -#ifndef TQT_NO_UNICODETABLES - -// small class used internally in TQString::Compose() -class TQLigature -{ -public: - TQLigature( TQChar c ); - - TQ_UINT16 first() { cur = ligatures; return cur ? *cur : 0; } - TQ_UINT16 next() { return cur && *cur ? *(cur++) : 0; } - TQ_UINT16 current() { return cur ? *cur : 0; } - - int match(TQString & str, unsigned int index); - TQChar head(); - TQChar::Decomposition tag(); - -private: - TQ_UINT16 *ligatures; - TQ_UINT16 *cur; -}; - -TQLigature::TQLigature( TQChar c ) -{ - register int pos = TQUnicodeTables::ligature_info[c.row()]; - if( !pos ) - ligatures = 0; - else - { - pos = TQUnicodeTables::ligature_info[(pos<<8)+c.cell()]; - ligatures = (TQ_UINT16 *)&(TQUnicodeTables::ligature_map[pos]); - } - cur = ligatures; -} - -TQChar TQLigature::head() -{ - if(current()) - return TQChar(TQUnicodeTables::decomposition_map[current()+1]); - - return TQChar::null; -} - -TQChar::Decomposition TQLigature::tag() -{ - if(current()) - return (TQChar::Decomposition) TQUnicodeTables::decomposition_map[current()]; - - return TQChar::Canonical; -} - -int TQLigature::match(TQString & str, unsigned int index) -{ - unsigned int i=index; - - if(!current()) return 0; - - TQ_UINT16 lig = current() + 2; - TQ_UINT16 ch; - - while ((i < str.length()) && (ch = TQUnicodeTables::decomposition_map[lig])) { - if (str[(int)i] != TQChar(ch)) - return 0; - i++; - lig++; - } - - if (!TQUnicodeTables::decomposition_map[lig]) - { - return i-index; - } - return 0; -} - - -// this function is just used in TQString::compose() -static inline bool format(TQChar::Decomposition tag, TQString & str, - int index, int len) -{ - unsigned int l = index + len; - unsigned int r = index; - - bool left = FALSE, right = FALSE; - - left = ((l < str.length()) && - ((str[(int)l].joining() == TQChar::Dual) || - (str[(int)l].joining() == TQChar::Right))); - if (r > 0) { - r--; - //printf("joining(right) = %d\n", str[(int)r].joining()); - right = (str[(int)r].joining() == TQChar::Dual); - } - - - switch (tag) { - case TQChar::Medial: - return (left & right); - case TQChar::Initial: - return (left && !right); - case TQChar::Final: - return (right);// && !left); - case TQChar::Isolated: - default: - return (!right && !left); - } -} // format() -#endif - -/* - TQString::compose() and visual() were developed by Gordon Tisher - <tisher@uniserve.ca>, with input from Lars Knoll <knoll@mpi-hd.mpg.de>, - who developed the tqunicode data tables. -*/ -/*! - \warning This function is not supported in TQt 3.x. It is provided - for experimental and illustrative purposes only. It is mainly of - interest to those experimenting with Arabic and other - composition-rich texts. - - Applies possible ligatures to a TQString. Useful when - composition-rich text requires rendering with glyph-poor fonts, - but it also makes compositions such as TQChar(0x0041) ('A') and - TQChar(0x0308) (Unicode accent diaresis), giving TQChar(0x00c4) - (German A Umlaut). -*/ -void TQString::compose() -{ -#ifndef TQT_NO_UNICODETABLES - unsigned int index=0, len; - unsigned int cindex = 0; - - TQChar code, head; - - TQMemArray<TQChar> dia; - - TQString composed = *this; - - while (index < length()) { - code = at(index); - //printf("\n\nligature for 0x%x:\n", code.tqunicode()); - TQLigature ligature(code); - ligature.first(); - while ( ligature.current() ) { - if ((len = ligature.match(*this, index)) != 0) { - head = ligature.head(); - unsigned short code = head.tqunicode(); - // we exclude Arabic presentation forms A and a few - // other ligatures, which are undefined in most fonts - if(!(code > 0xfb50 && code < 0xfe80) && - !(code > 0xfb00 && code < 0xfb2a)) { - // joining info is only needed for Arabic - if (format(ligature.tag(), *this, index, len)) { - //printf("using ligature 0x%x, len=%d\n",code,len); - // replace letter - composed.replace(cindex, len, TQChar(head)); - index += len-1; - // we continue searching in case we have a final - // form because medial ones are preferred. - if ( len != 1 || ligature.tag() !=TQChar::Final ) - break; - } - } - } - ligature.next(); - } - cindex++; - index++; - } - *this = composed; -#endif -} - - -// These macros are used for efficient allocation of TQChar strings. -// IMPORTANT! If you change these, make sure you also change the -// "delete tqunicode" statement in ~TQStringData() in tqstring.h correspondingly! - -#define TQT_ALLOC_TQCHAR_VEC( N ) (TQChar*) new char[ sizeof(TQChar)*( N ) ] -#define TQT_DELETE_TQCHAR_VEC( P ) delete[] ((char*)( P )) - - -/*! - This utility function converts the 8-bit string \a ba to Unicode, - returning the result. - - The caller is responsible for deleting the return value with - delete[]. -*/ - -TQChar* TQString::latin1ToUnicode( const TQByteArray& ba, uint* len ) -{ - if ( ba.isNull() ) { - *len = 0; - return 0; - } - int l = 0; - while ( l < (int)ba.size() && ba[l] ) - l++; - const char* str = ba.data(); - TQChar *uc = new TQChar[ l ]; // Can't use macro, since function is public - TQChar *result = uc; - if ( len ) - *len = l; - while (l--) - *uc++ = *str++; - return result; -} - -static TQChar* internalLatin1ToUnicode( const TQByteArray& ba, uint* len ) -{ - if ( ba.isNull() ) { - *len = 0; - return 0; - } - int l = 0; - while ( l < (int)ba.size() && ba[l] ) - l++; - const char* str = ba.data(); - TQChar *uc = TQT_ALLOC_TQCHAR_VEC( l ); - TQChar *result = uc; - if ( len ) - *len = l; - while (l--) - *uc++ = *str++; - return result; -} - -/*! - \overload - - This utility function converts the '\0'-terminated 8-bit string \a - str to Unicode, returning the result and setting \a *len to the - length of the Unicode string. - - The caller is responsible for deleting the return value with - delete[]. -*/ - -TQChar* TQString::latin1ToUnicode( const char *str, uint* len, uint maxlen ) -{ - TQChar* result = 0; - uint l = 0; - if ( str ) { - if ( maxlen != (uint)-1 ) { - while ( l < maxlen && str[l] ) - l++; - } else { - // Faster? - l = int(strlen( str )); - } - TQChar *uc = new TQChar[ l ]; // Can't use macro since function is public - result = uc; - uint i = l; - while ( i-- ) - *uc++ = *str++; - } - if ( len ) - *len = l; - return result; -} - -static TQChar* internalLatin1ToUnicode( const char *str, uint* len, - uint maxlen = (uint)-1 ) -{ - TQChar* result = 0; - uint l = 0; - if ( str ) { - if ( maxlen != (uint)-1 ) { - while ( l < maxlen && str[l] ) - l++; - } else { - // Faster? - l = int(strlen( str )); - } - TQChar *uc = TQT_ALLOC_TQCHAR_VEC( l ); - result = uc; - uint i = l; - while ( i-- ) - *uc++ = *str++; - } - if ( len ) - *len = l; - return result; -} - -/*! - This utility function converts \a l 16-bit characters from \a uc - to ASCII, returning a '\0'-terminated string. - - The caller is responsible for deleting the resultant string with - delete[]. -*/ -char* TQString::tqunicodeToLatin1(const TQChar *uc, uint l) -{ - if (!uc) { - return 0; - } - char *a = new char[l+1]; - char *result = a; - while (l--) { - *a++ = (uc->tqunicode() > 0xff) ? '?' : (char)uc->tqunicode(); - uc++; - } - *a = '\0'; - return result; -} - -/***************************************************************************** - TQString member functions - *****************************************************************************/ - -/*! - \class TQString tqstring.h - \reentrant - - \brief The TQString class provides an abstraction of Unicode text - and the classic C '\0'-terminated char array. - - \ingroup tools - \ingroup shared - \ingroup text - \mainclass - - TQString uses \link shclass.html implicit sharing\endlink, which - makes it very efficient and easy to use. - - In all of the TQString methods that take \c {const char *} - parameters, the \c {const char *} is interpreted as a classic - C-style '\0'-terminated ASCII string. It is legal for the \c - {const char *} parameter to be 0. If the \c {const char *} is not - '\0'-terminated, the results are undefined. Functions that copy - classic C strings into a TQString will not copy the terminating - '\0' character. The TQChar array of the TQString (as returned by - tqunicode()) is generally not terminated by a '\0'. If you need to - pass a TQString to a function that requires a C '\0'-terminated - string use latin1(). - - \keyword TQString::null - A TQString that has not been assigned to anything is \e null, i.e. - both the length and data pointer is 0. A TQString that references - the empty string ("", a single '\0' char) is \e empty. Both null - and empty TQStrings are legal parameters to the methods. Assigning - \c{(const char *) 0} to TQString gives a null TQString. For - convenience, \c TQString::null is a null TQString. When sorting, - empty strings come first, followed by non-empty strings, followed - by null strings. We recommend using \c{if ( !str.isNull() )} to - check for a non-null string rather than \c{if ( !str )}; see \l - operator!() for an explanation. - - Note that if you find that you are mixing usage of \l TQCString, - TQString, and \l TQByteArray, this causes lots of unnecessary - copying and might indicate that the true nature of the data you - are dealing with is uncertain. If the data is '\0'-terminated 8-bit - data, use \l TQCString; if it is unterminated (i.e. contains '\0's) - 8-bit data, use \l TQByteArray; if it is text, use TQString. - - Lists of strings are handled by the TQStringList class. You can - split a string into a list of strings using TQStringList::split(), - and join a list of strings into a single string with an optional - separator using TQStringList::join(). You can obtain a list of - strings from a string list that contain a particular substring or - that match a particular \link tqregexp.html regex\endlink using - TQStringList::grep(). - - <b>Note for C programmers</b> - - Due to C++'s type system and the fact that TQString is implicitly - shared, TQStrings can be treated like ints or other simple base - types. For example: - - \code - TQString boolToString( bool b ) - { - TQString result; - if ( b ) - result = "True"; - else - result = "False"; - return result; - } - \endcode - - The variable, result, is an auto variable allocated on the stack. - When return is called, because we're returning by value, The copy - constructor is called and a copy of the string is returned. (No - actual copying takes place thanks to the implicit sharing, see - below.) - - Throughout TQt's source code you will encounter TQString usages like - this: - \code - TQString func( const TQString& input ) - { - TQString output = input; - // process output - return output; - } - \endcode - - The 'copying' of input to output is almost as fast as copying a - pointer because behind the scenes copying is achieved by - incrementing a reference count. TQString (like all TQt's implicitly - shared classes) operates on a copy-on-write basis, only copying if - an instance is actually changed. - - If you wish to create a deep copy of a TQString without losing any - Unicode information then you should use TQDeepCopy. - - \sa TQChar TQCString TQByteArray TQConstString -*/ - -/*! \enum TQt::ComparisonFlags -\internal -*/ -/*! - \enum TQt::StringComparisonMode - - This enum type is used to set the string comparison mode when - searching for an item. It is used by TQListBox, TQListView and - TQIconView, for example. We'll refer to the string being searched - as the 'target' string. - - \value CaseSensitive The strings must match case sensitively. - \value ExactMatch The target and search strings must match exactly. - \value BeginsWith The target string begins with the search string. - \value EndsWith The target string ends with the search string. - \value Contains The target string contains the search string. - - If you OR these flags together (excluding \c CaseSensitive), the - search criteria be applied in the following order: \c ExactMatch, - \c BeginsWith, \c EndsWith, \c Contains. - - Matching is case-insensitive unless \c CaseSensitive is set. \c - CaseSensitive can be OR-ed with any combination of the other - flags. - -*/ -TQ_EXPORT TQStringData *TQString::shared_null = 0; -TQT_STATIC_CONST_IMPL TQString TQString::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::null; -TQT_STATIC_CONST_IMPL TQChar TQChar::replacement((ushort)0xfffd); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderMark((ushort)0xfeff); -TQT_STATIC_CONST_IMPL TQChar TQChar::byteOrderSwapped((ushort)0xfffe); -TQT_STATIC_CONST_IMPL TQChar TQChar::nbsp((ushort)0x00a0); - -TQStringData* TQString::makeSharedNull() -{ - TQString::shared_null = new TQStringData; -#if defined( TQ_OS_MAC ) || defined(TQ_OS_SOLARIS) || defined(TQ_OS_HPUX) || defined(TQ_OS_AIX) - TQString *that = const_cast<TQString *>(&TQString::null); - that->d = TQString::shared_null; -#endif - return TQString::shared_null; -} - -/*! - \fn TQString::TQString() - - Constructs a null string, i.e. both the length and data pointer - are 0. - - \sa isNull() -*/ - -/*! - Constructs a string of length one, containing the character \a ch. -*/ -TQString::TQString( TQChar ch ) -{ - d = new TQStringData( TQT_ALLOC_TQCHAR_VEC( 1 ), 1, 1 ); - d->tqunicode[0] = ch; -} - -/*! - Constructs an implicitly shared copy of \a s. This is very fast - since it only involves incrementing a reference count. -*/ -TQString::TQString( const TQString &s ) : - d(s.d) -{ - d->ref(); -} - -#ifdef USE_QT4 - -// Interoperability -// FIXME -// These conversions are probably too weak - -/*! - QT4 INTEROPERABILITY -*/ -TQString::TQString( const QString &qs ) -{ - setAscii( TQString(qs).ascii() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQString::operator QString() const -{ - return QString::fromUtf8( this->utf8() ); -} - -/*! - QT4 INTEROPERABILITY -*/ -TQString &TQString::operator=( const QString &qs ) -{ - return setAscii( TQString(qs).ascii() ); -} - -bool operator==( const QString &s1, const TQString &s2 ) -{ - return (TQString(s1).ascii() == s2.ascii()); -} - -#endif // USE_QT4 - -/*! - \internal - - Private function. - - Constructs a string with preallocated space for \a size characters. - - The string is empty. - - \sa isNull() -*/ - -TQString::TQString( int size, bool /*dummy*/ ) -{ - if ( size ) { - int l = size; - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( l ); - d = new TQStringData( uc, 0, l ); - } else { - d = shared_null ? shared_null : (shared_null=new TQStringData); - d->ref(); - } -} - -/*! - Constructs a string that is a deep copy of \a ba interpreted as a - classic C string. -*/ - -TQString::TQString( const TQByteArray& ba ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( ba.data(), ba.size() ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(ba,&l); - d = new TQStringData(uc,l,l); -} - -/*! - Constructs a string that is a deep copy of the first \a length - characters in the TQChar array. - - If \a tqunicode and \a length are 0, then a null string is created. - - If only \a tqunicode is 0, the string is empty but has \a length - characters of space preallocated: TQString expands automatically - anyway, but this may speed up some cases a little. We recommend - using the plain constructor and setLength() for this purpose since - it will result in more readable code. - - \sa isNull() setLength() -*/ - -TQString::TQString( const TQChar* tqunicode, uint length ) -{ - if ( !tqunicode && !length ) { - d = shared_null ? shared_null : makeSharedNull(); - d->ref(); - } else { - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( length ); - if ( tqunicode ) - memcpy(uc, tqunicode, length*sizeof(TQChar)); - d = new TQStringData(uc,tqunicode ? length : 0,length); - } -} - -/*! - Constructs a string that is a deep copy of \a str, interpreted as - a classic C string. The encoding is assumed to be Latin-1, unless - you change it using TQTextCodec::setCodecForCStrings(). - - If \a str is 0, then a null string is created. - - This is a cast constructor, but it is perfectly safe: converting a - Latin-1 \c{const char *} to TQString preserves all the information. You - can disable this constructor by defining \c TQT_NO_CAST_ASCII when - you compile your applications. You can also make TQString objects - by using setLatin1(), tqfromLatin1(), fromLocal8Bit(), and - fromUtf8(). Or whatever encoding is appropriate for the 8-bit data - you have. - - \sa isNull(), fromAscii() -*/ - -TQString::TQString( const char *str ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( str ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(str,&l); - d = new TQStringData(uc,l,l); -} - -#ifndef TQT_NO_STL -/*! - Constructs a string that is a deep copy of \a str. - - This is the same as fromAscii(\a str). -*/ - -TQString::TQString( const std::string &str ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - d = 0; - *this = fromAscii( str.c_str() ); - return; - } -#endif - uint l; - TQChar *uc = internalLatin1ToUnicode(str.c_str(),&l); - d = new TQStringData(uc,l,l); -} -#endif - -/*! - \fn TQString::~TQString() - - Destroys the string and frees the string's data if this is the - last reference to the string. -*/ - - -/*! - Deallocates any space reserved solely by this TQString. - - If the string does not share its data with another TQString - instance, nothing happens; otherwise the function creates a new, - unique copy of this string. This function is called whenever the - string is modified. -*/ - -void TQString::real_detach() -{ - setLength( length() ); -} - -void TQString::deref() -{ - if ( d && d->deref() ) { - if ( d != shared_null ) - delete d; - d = 0; - } -} - -void TQStringData::deleteSelf() -{ - delete this; -} - -/*! - \fn TQString& TQString::operator=( TQChar c ) - - Sets the string to contain just the single character \a c. -*/ - -/*! - \fn TQString& TQString::operator=( const std::string& s ) - - \overload - - Makes a deep copy of \a s and returns a reference to the deep - copy. -*/ - -/*! - \fn TQString& TQString::operator=( char c ) - - \overload - - Sets the string to contain just the single character \a c. -*/ - -/*! - \overload - - Assigns a shallow copy of \a s to this string and returns a - reference to this string. This is very fast because the string - isn't actually copied. -*/ -TQString &TQString::operator=( const TQString &s ) -{ - s.d->ref(); - deref(); - d = s.d; - return *this; -} - -/*! - \overload - - Assigns a deep copy of \a cstr, interpreted as a classic C - string, to this string. Returns a reference to this string. -*/ -TQString &TQString::operator=( const TQCString& cstr ) -{ - return setAscii( cstr ); -} - - -/*! - \overload - - Assigns a deep copy of \a str, interpreted as a classic C string - to this string and returns a reference to this string. - - If \a str is 0, then a null string is created. - - \sa isNull() -*/ -TQString &TQString::operator=( const char *str ) -{ - return setAscii(str); -} - - -/*! - \fn bool TQString::isNull() const - - Returns TRUE if the string is null; otherwise returns FALSE. A - null string is always empty. - - \code - TQString a; // a.tqunicode() == 0, a.length() == 0 - a.isNull(); // TRUE, because a.tqunicode() == 0 - a.isEmpty(); // TRUE, because a.length() == 0 - \endcode - - \sa isEmpty(), length() -*/ - -/*! - \fn bool TQString::isEmpty() const - - Returns TRUE if the string is empty, i.e. if length() == 0; - otherwise returns FALSE. Null strings are also empty. - - \code - TQString a( "" ); - a.isEmpty(); // TRUE - a.isNull(); // FALSE - - TQString b; - b.isEmpty(); // TRUE - b.isNull(); // TRUE - \endcode - - \sa isNull(), length() -*/ - -/*! - \fn uint TQString::length() const - - Returns the length of the string. - - Null strings and empty strings have zero length. - - \sa isNull(), isEmpty() -*/ - -/*! - If \a newLen is less than the length of the string, then the - string is truncated at position \a newLen. Otherwise nothing - happens. - - \code - TQString s = "truncate me"; - s.truncate( 5 ); // s == "trunc" - \endcode - - \sa setLength() -*/ - -void TQString::truncate( uint newLen ) -{ - if ( newLen < d->len ) - setLength( newLen ); -} - -/*! - Ensures that at least \a newLen characters are allocated to the - string, and sets the length of the string to \a newLen. Any new - space allocated contains arbitrary data. - - \sa reserve(), truncate() -*/ -void TQString::setLength( uint newLen ) -{ - if ( d->count != 1 || newLen > d->maxl || - ( newLen * 4 < d->maxl && d->maxl > 4 ) ) { - // detach, grow or shrink - uint newMax = computeNewMax( newLen ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( nd ) { - uint len = TQMIN( d->len, newLen ); - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, newLen, newMax ); - } - } else { - d->len = newLen; - d->setDirty(); - } -} - -/*! - \fn uint TQString::capacity() const - - Returns the number of characters this string can hold - in the allocated memory. - - \sa reserve(), squeeze() -*/ - -/*! - Ensures that at least \a minCapacity characters are allocated to - the string. - - This function is useful for code that needs to build up a long - string and wants to avoid repeated reallocation. In this example, - we want to add to the string until some condition is true, and - we're fairly sure that size is big enough: - \code - TQString result; - int len = 0; - result.reserve(maxLen); - while (...) { - result[len++] = ... // fill part of the space - } - result.squeeze(); - \endcode - - If \e maxLen is an underestimate, the worst that will happen is - that the loop will slow down. - - If it is not possible to allocate enough memory, the string - remains unchanged. - - \sa capacity(), squeeze(), setLength() -*/ - -void TQString::reserve( uint minCapacity ) -{ - if ( d->maxl < minCapacity ) { - TQChar *nd = TQT_ALLOC_TQCHAR_VEC( minCapacity ); - if ( nd ) { - uint len = d->len; - if ( len ) - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, len, minCapacity ); - } - } -} - - -/*! - Squeezes the string's capacity to the current content. - - \sa capacity(), reserve() -*/ -void TQString::squeeze() -{ - if ( d->maxl > d->len ) { - TQChar *nd = TQT_ALLOC_TQCHAR_VEC( d->len ); - if ( nd ) { - uint len = d->len; - if ( len ) - memcpy( nd, d->tqunicode, sizeof(TQChar) * len ); - deref(); - d = new TQStringData( nd, len, len ); - } - } -} - -/*! - \internal - - Like setLength, but doesn't shrink the allocated memory. -*/ -void TQString::grow( uint newLen ) -{ - if ( d->count != 1 || newLen > d->maxl ) { - setLength( newLen ); - } else { - d->len = newLen; - d->setDirty(); - } -} - -struct ArgEscapeData -{ - uint min_escape; // lowest escape sequence number - uint occurrences; // number of occurences of the lowest escape - // sequence number - uint locale_occurrences; // number of occurences of the lowest escape - // sequence number which contain 'L' - uint escape_len; // total length of escape sequences which will - // be replaced -}; - -static ArgEscapeData findArgEscapes(const TQString &s) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - ArgEscapeData d; - - d.min_escape = 10; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - - const TQChar *c = uc_begin; - while (c != uc_end) { - while (c != uc_end && c->tqunicode() != '%') - ++c; - - if (c == uc_end || ++c == uc_end) - break; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - if (++c == uc_end) - break; - } - - if (c->tqunicode() < '0' || c->tqunicode() > '9') - continue; - - uint escape = c->tqunicode() - '0'; - ++c; - - if (escape > d.min_escape) - continue; - - if (escape < d.min_escape) { - d.min_escape = escape; - d.occurrences = 0; - d.escape_len = 0; - d.locale_occurrences = 0; - } - -#if TQT_VERSION < 0x040000 - // ### remove preprocessor in TQt 4.0 - /* Since in TQt < 4.0 only the first instance is replaced, - escape_len should hold the length of only the first escape - sequence */ - if (d.occurrences == 0) -#endif - { - ++d.occurrences; - if (locale_arg) { - ++d.locale_occurrences; - d.escape_len += 3; - } - else - d.escape_len += 2; - } - } - - return d; -} - -static TQString replaceArgEscapes(const TQString &s, const ArgEscapeData &d, int field_width, - const TQString &arg, const TQString &larg) -{ - const TQChar *uc_begin = s.tqunicode(); - const TQChar *uc_end = uc_begin + s.length(); - - uint abs_field_width = TQABS(field_width); - uint result_len = s.length() - - d.escape_len - + (d.occurrences - d.locale_occurrences) - *TQMAX(abs_field_width, arg.length()) - + d.locale_occurrences - *TQMAX(abs_field_width, larg.length()); - - TQString result; - result.setLength(result_len); - TQChar *result_buff = (TQChar*) result.tqunicode(); - - TQChar *rc = result_buff; - const TQChar *c = uc_begin; - uint repl_cnt = 0; - while (c != uc_end) { - /* We don't have to check if we run off the end of the string with c, - because as long as d.occurrences > 0 we KNOW there are valid escape - sequences. */ - - const TQChar *text_start = c; - - while (c->tqunicode() != '%') - ++c; - - const TQChar *escape_start = c++; - - bool locale_arg = FALSE; - if (c->tqunicode() == 'L') { - locale_arg = TRUE; - ++c; - } - - if (c->tqunicode() != '0' + d.min_escape) { - memcpy(rc, text_start, (c - text_start)*sizeof(TQChar)); - rc += c - text_start; - } - else { - ++c; - - memcpy(rc, text_start, (escape_start - text_start)*sizeof(TQChar)); - rc += escape_start - text_start; - - uint pad_chars; - if (locale_arg) - pad_chars = TQMAX(abs_field_width, larg.length()) - larg.length(); - else - pad_chars = TQMAX(abs_field_width, arg.length()) - arg.length(); - - if (field_width > 0) { // left padded - for (uint i = 0; i < pad_chars; ++i) - (rc++)->tqunicode() = ' '; - } - - if (locale_arg) { - memcpy(rc, larg.tqunicode(), larg.length()*sizeof(TQChar)); - rc += larg.length(); - } - else { - memcpy(rc, arg.tqunicode(), arg.length()*sizeof(TQChar)); - rc += arg.length(); - } - - if (field_width < 0) { // right padded - for (uint i = 0; i < pad_chars; ++i) - (rc++)->tqunicode() = ' '; - } - - if (++repl_cnt == d.occurrences) { - memcpy(rc, c, (uc_end - c)*sizeof(TQChar)); - rc += uc_end - c; - TQ_ASSERT(rc - result_buff == (int)result_len); - c = uc_end; - } - } - } - - return result; -} - -/*! - This function will return a string that replaces the lowest - numbered occurrence of \c %1, \c %2, ..., \c %9 with \a a. - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce right-aligned - text, whereas a negative value will produce left-aligned text. - - The following example shows how we could create a 'status' string - when processing a list of files: - \code - TQString status = TQString( "Processing file %1 of %2: %3" ) - .arg( i ) // current file's number - .arg( total ) // number of files to process - .arg( fileName ); // current file's name - \endcode - - It is generally fine to use filenames and numbers as we have done - in the example above. But note that using arg() to construct - natural language sentences does not usually translate well into - other languages because sentence structure and word order often - differ between languages. - - If there is no place marker (\c %1, \c %2, etc.), a warning - message (qWarning()) is output and the result is undefined. - - \warning If any placeholder occurs more than once, the result is undefined. - -*/ -TQString TQString::arg( const TQString& a, int fieldWidth ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %s", latin1(), - a.latin1() ); - return *this; - } - - return replaceArgEscapes(*this, d, fieldWidth, a, a); -} - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2 ) const - - \overload - - This is the same as str.arg(\a a1).arg(\a a2), except that - the strings are replaced in one pass. This can make a difference - if \a a1 contains e.g. \c{%1}: - - \code - TQString str( "%1 %2" ); - str.arg( "Hello", "world" ); // returns "Hello world" - str.arg( "Hello" ).arg( "world" ); // returns "Hello world" - - str.arg( "(%1)", "Hello" ); // returns "(%1) Hello" - str.arg( "(%1)" ).arg( "Hello" ); // returns "(Hello) %2" - \endcode -*/ - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3 ) const - \overload - - This is the same as calling str.arg(\a a1).arg(\a a2).arg(\a a3), - except that the strings are replaced in one pass. -*/ - -/*! - \fn TQString TQString::arg( const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const - \overload - - This is the same as calling - str.arg(\a a1).arg(\a a2).arg(\a a3).arg(\a a4), - except that the strings are replaced in one pass. -*/ - -/*! - \overload - - The \a fieldWidth value specifies the minimum amount of space that - \a a is padded to. A positive value will produce a right-aligned - number, whereas a negative value will produce a left-aligned - number. - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. - - The '%' can be followed by an 'L', in which case the sequence is - replaced with a localized representation of \a a. The conversion - uses the default locale. The default locale is determined from the - system's locale settings at application startup. It can be changed - using TQLocale::setDefault(). The 'L' flag is ignored if \a base is - not 10. - - \code - TQString str; - str = TQString( "Decimal 63 is %1 in hexadecimal" ) - .arg( 63, 0, 16 ); - // str == "Decimal 63 is 3f in hexadecimal" - - TQLocale::setDefault(TQLocale::English, TQLocale::UnitedStates); - str = TQString( "%1 %L2 %L3" ) - .arg( 12345 ) - .arg( 12345 ) - .arg( 12345, 0, 16 ); - // str == "12345 12,345 3039" - \endcode -*/ -TQString TQString::arg( long a, int fieldWidth, int base ) const -{ - return arg((TQ_LLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( ulong a, int fieldWidth, int base ) const -{ - return arg((TQ_ULLONG)a, fieldWidth, base); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( TQ_LLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %lld", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->longLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ -TQString TQString::arg( TQ_ULLONG a, int fieldWidth, int base ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %llu", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, base); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - locale_arg = locale.d->unsLongLongToString(a, -1, base, -1, TQLocalePrivate::ThousandsGroup); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -/*! - \fn TQString TQString::arg( int a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( uint a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( short a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - -/*! - \fn TQString TQString::arg( ushort a, int fieldWidth, int base ) const - - \overload - - \a a is expressed in base \a base, which is 10 by default and must - be between 2 and 36. If \a base is 10, the '%L' syntax can be used - to produce localized strings. -*/ - - -/*! - \overload - - \a a is assumed to be in the Latin-1 character set. -*/ -TQString TQString::arg( char a, int fieldWidth ) const -{ - TQString c; - c += a; - return arg( c, fieldWidth ); -} - -/*! - \overload -*/ -TQString TQString::arg( TQChar a, int fieldWidth ) const -{ - TQString c; - c += a; - return arg( c, fieldWidth ); -} - -/*! - \overload - - \target arg-formats - - Argument \a a is formatted according to the \a fmt format specified, - which is 'g' by default and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .arg( d, 0, 'E', 3 ); - // ds == "'E' format, precision 3, gives 1.234E+01" - \endcode - - The '%L' syntax can be used to produce localized strings. -*/ -TQString TQString::arg( double a, int fieldWidth, char fmt, int prec ) const -{ - ArgEscapeData d = findArgEscapes(*this); - - if (d.occurrences == 0) { - qWarning( "TQString::arg(): Argument missing: %s, %g", latin1(), - a ); - return *this; - } - - TQString arg; - if (d.occurrences > d.locale_occurrences) - arg = number(a, fmt, prec); - - TQString locale_arg; - if (d.locale_occurrences > 0) { - TQLocale locale; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (qIsUpper(fmt)) - flags = TQLocalePrivate::CapitalEorX; - fmt = qToLower(fmt); - - switch (fmt) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", fmt ); -#endif - break; - } - - flags |= TQLocalePrivate::ThousandsGroup; - - locale_arg = locale.d->doubleToString(a, prec, form, -1, flags); - } - - return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg); -} - -TQString TQString::multiArg( int numArgs, const TQString& a1, const TQString& a2, - const TQString& a3, const TQString& a4 ) const -{ - TQString result; - union { - int digitUsed[10]; - int argForDigit[10]; - }; - register const TQChar *uc = d->tqunicode; - const TQString *args[4]; - const int len = (int) length(); - const int end = len - 1; - int lastDigit = -1; - int i; - - memset( digitUsed, 0, sizeof(digitUsed) ); - args[0] = &a1; - args[1] = &a2; - args[2] = &a3; - args[3] = &a4; - - for ( i = 0; i < end; i++ ) { - if ( uc[i] == '%' ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= 9 ) - digitUsed[digit]++; - } - } - - for ( i = 0; i < numArgs; i++ ) { - do { - ++lastDigit; - } while ( lastDigit < 10 && digitUsed[lastDigit] == 0 ); - - if ( lastDigit == 10 ) { - qWarning( "TQString::arg(): Argument missing: %s, %s", - latin1(), args[i]->latin1() ); - numArgs = i; - lastDigit = 9; - break; - } - argForDigit[lastDigit] = i; - } - - i = 0; - while ( i < len ) { - if ( uc[i] == '%' && i != end ) { - int digit = uc[i + 1].tqunicode() - '0'; - if ( digit >= 0 && digit <= lastDigit ) { - result += *args[argForDigit[digit]]; - i += 2; - continue; - } - } - result += uc[i++]; - } - return result; -} - - -/*! - Safely builds a formatted string from the format string \a cformat - and an arbitrary list of arguments. The format string supports all - the escape sequences of printf() in the standard C library. - - The %s escape sequence expects a utf8() encoded string. The format - string \e cformat is expected to be in latin1. If you need a - Unicode format string, use arg() instead. For typesafe string - building, with full Unicode support, you can use TQTextOStream like - this: - - \code - TQString str; - TQString s = ...; - int x = ...; - TQTextOStream( &str ) << s << " : " << x; - \endcode - - For \link TQObject::tr() translations,\endlink especially if the - strings contains more than one escape sequence, you should - consider using the arg() function instead. This allows the order - of the replacements to be controlled by the translator, and has - Unicode support. - - The %lc escape sequence expects a tqunicode character of type ushort - (as returned by TQChar::tqunicode()). - The %ls escape sequence expects a pointer to a zero-terminated - array of tqunicode characters of type ushort (as returned by - TQString::ucs2()). - - \sa arg() -*/ - -#ifndef TQT_NO_SPRINTF -TQString &TQString::sprintf( const char* cformat, ... ) -{ - TQLocale locale(TQLocale::C); - - va_list ap; - va_start( ap, cformat ); - - if ( !cformat || !*cformat ) { - // TQt 1.x compat - *this = tqfromLatin1( "" ); - return *this; - } - - // Parse cformat - - TQString result; - const char *c = cformat; - for (;;) { - // Copy non-escape chars to result - while (*c != '\0' && *c != '%') - result.append(*c++); - - if (*c == '\0') - break; - - // Found '%' - const char *escape_start = c; - ++c; - - if (*c == '\0') { - result.append('%'); // a % at the end of the string - treat as non-escape text - break; - } - if (*c == '%') { - result.append('%'); // %% - ++c; - continue; - } - - // Parse flag characters - unsigned flags = 0; - bool no_more_flags = FALSE; - do { - switch (*c) { - case '#': flags |= TQLocalePrivate::Alternate; break; - case '0': flags |= TQLocalePrivate::ZeroPadded; break; - case '-': flags |= TQLocalePrivate::LeftAdjusted; break; - case ' ': flags |= TQLocalePrivate::BlankBeforePositive; break; - case '+': flags |= TQLocalePrivate::AlwaysShowSign; break; - case '\'': flags |= TQLocalePrivate::ThousandsGroup; break; - default: no_more_flags = TRUE; break; - } - - if (!no_more_flags) - ++c; - } while (!no_more_flags); - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse field width - int width = -1; // -1 means unspecified - if (qIsDigit(*c)) { - TQString width_str; - while (*c != '\0' && qIsDigit(*c)) - width_str.append(*c++); - - // can't be negative - started with a digit - // contains at least one digit - width = width_str.toInt(); - } - else if (*c == '*') { - width = va_arg(ap, int); - if (width < 0) - width = -1; // treat all negative numbers as unspecified - ++c; - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse precision - int precision = -1; // -1 means unspecified - if (*c == '.') { - ++c; - if (qIsDigit(*c)) { - TQString precision_str; - while (*c != '\0' && qIsDigit(*c)) - precision_str.append(*c++); - - // can't be negative - started with a digit - // contains at least one digit - precision = precision_str.toInt(); - } - else if (*c == '*') { - precision = va_arg(ap, int); - if (precision < 0) - precision = -1; // treat all negative numbers as unspecified - ++c; - } - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse the length modifier - enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t }; - LengthMod length_mod = lm_none; - switch (*c) { - case 'h': - ++c; - if (*c == 'h') { - length_mod = lm_hh; - ++c; - } - else - length_mod = lm_h; - break; - - case 'l': - ++c; - if (*c == 'l') { - length_mod = lm_ll; - ++c; - } - else - length_mod = lm_l; - break; - - case 'L': - ++c; - length_mod = lm_L; - break; - - case 'j': - ++c; - length_mod = lm_j; - break; - - case 'z': - case 'Z': - ++c; - length_mod = lm_z; - break; - - case 't': - ++c; - length_mod = lm_t; - break; - - default: break; - } - - if (*c == '\0') { - result.append(escape_start); // incomplete escape, treat as non-escape text - break; - } - - // Parse the conversion specifier and do the conversion - TQString subst; - switch (*c) { - case 'd': - case 'i': { - TQ_LLONG i; - switch (length_mod) { - case lm_none: i = va_arg(ap, int); break; - case lm_hh: i = va_arg(ap, int); break; - case lm_h: i = va_arg(ap, int); break; - case lm_l: i = va_arg(ap, long int); break; - case lm_ll: i = va_arg(ap, TQ_LLONG); break; - case lm_j: i = va_arg(ap, long int); break; - case lm_z: i = va_arg(ap, size_t); break; - case lm_t: i = va_arg(ap, int); break; - default: i = 0; break; - } - subst = locale.d->longLongToString(i, precision, 10, width, flags); - ++c; - break; - } - case 'o': - case 'u': - case 'x': - case 'X': { - TQ_ULLONG u; - switch (length_mod) { - case lm_none: u = va_arg(ap, unsigned int); break; - case lm_hh: u = va_arg(ap, unsigned int); break; - case lm_h: u = va_arg(ap, unsigned int); break; - case lm_l: u = va_arg(ap, unsigned long int); break; - case lm_ll: u = va_arg(ap, TQ_ULLONG); break; - default: u = 0; break; - } - - if (qIsUpper(*c)) - flags |= TQLocalePrivate::CapitalEorX; - - int base = 10; - switch (qToLower(*c)) { - case 'o': - base = 8; break; - case 'u': - base = 10; break; - case 'x': - base = 16; break; - default: break; - } - subst = locale.d->unsLongLongToString(u, precision, base, width, flags); - ++c; - break; - } - case 'E': - case 'e': - case 'F': - case 'f': - case 'G': - case 'g': - case 'A': - case 'a': { - double d; - if (length_mod == lm_L) - d = va_arg(ap, long double); // not supported - converted to a double - else - d = va_arg(ap, double); - - if (qIsUpper(*c)) - flags |= TQLocalePrivate::CapitalEorX; - - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - switch (qToLower(*c)) { - case 'e': form = TQLocalePrivate::DFExponent; break; - case 'a': // not supported - decimal form used instead - case 'f': form = TQLocalePrivate::DFDecimal; break; - case 'g': form = TQLocalePrivate::DFSignificantDigits; break; - default: break; - } - subst = locale.d->doubleToString(d, precision, form, width, flags); - ++c; - break; - } - case 'c': { - if (length_mod == lm_l) - subst = TQChar((ushort) va_arg(ap, int)); - else - subst = (uchar) va_arg(ap, int); - ++c; - break; - } - case 's': { - if (length_mod == lm_l) { - const ushort *buff = va_arg(ap, const ushort*); - const ushort *ch = buff; - while (*ch != 0) - ++ch; - subst.setUnicodeCodes(buff, ch - buff); - } else - subst = TQString::fromUtf8(va_arg(ap, const char*)); - if (precision != -1) - subst.truncate(precision); - ++c; - break; - } - case 'p': { - TQ_ULLONG i; -#ifdef TQ_OS_WIN64 - i = (TQ_ULLONG) va_arg(ap, void*); -#else - i = (TQ_ULONG) va_arg(ap, void*); -#endif - -#ifdef TQ_OS_WIN32 - flags |= TQLocalePrivate::CapitalEorX; // Windows does 1234ABCD -#else - flags |= TQLocalePrivate::Alternate; // Unix and Mac do 0x1234abcd -#endif - - subst = locale.d->unsLongLongToString(i, precision, 16, width, flags); - ++c; - break; - } - case 'n': - switch (length_mod) { - case lm_hh: { - signed char *n = va_arg(ap, signed char*); - *n = result.length(); - break; - } - case lm_h: { - short int *n = va_arg(ap, short int*); - *n = result.length(); - break; - } - case lm_l: { - long int *n = va_arg(ap, long int*); - *n = result.length(); - break; - } - case lm_ll: { - TQ_LLONG *n = va_arg(ap, TQ_LLONG*); - volatile uint tmp = result.length(); // egcs-2.91.66 gets internal - *n = tmp; // compiler error without volatile - break; - } - default: { - int *n = va_arg(ap, int*); - *n = result.length(); - break; - } - } - ++c; - break; - - default: // bad escape, treat as non-escape text - for (const char *cc = escape_start; cc != c; ++cc) - result.append(*cc); - continue; - } - - if (flags & TQLocalePrivate::LeftAdjusted) - result.append(subst.leftJustify(width)); - else - result.append(subst.rightJustify(width)); - } - - va_end(ap); - *this = result; - - return *this; -} -#endif - -/*! - Fills the string with \a len characters of value \a c, and returns - a reference to the string. - - If \a len is negative (the default), the current string length is - used. - - \code - TQString str; - str.fill( 'g', 5 ); // string == "ggggg" - \endcode -*/ - -TQString& TQString::fill( TQChar c, int len ) -{ - if ( len < 0 ) - len = length(); - if ( len == 0 ) { - *this = ""; - } else { - deref(); - TQChar * nd = TQT_ALLOC_TQCHAR_VEC( len ); - d = new TQStringData(nd,len,len); - while (len--) *nd++ = c; - } - return *this; -} - - -/*! - \fn TQString TQString::copy() const - - \obsolete - - In TQt 2.0 and later, all calls to this function are needless. Just - remove them. -*/ - -/*! - \overload - - Finds the first occurrence of the character \a c, starting at - position \a index. If \a index is -1, the search starts at the - last character; if -2, at the next to last character and so on. - (See findRev() for searching backwards.) - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Returns the position of \a c or -1 if \a c could not be found. -*/ - -int TQString::find( TQChar c, int index, bool cs ) const -{ - const uint l = length(); - if ( index < 0 ) - index += l; - if ( (uint)index >= l ) - return -1; - register const TQChar *uc = tqunicode()+index; - const TQChar *end = tqunicode() + l; - if ( cs ) { - while ( uc < end && *uc != c ) - uc++; - } else { - c = ::lower( c ); - while ( uc < end && ::lower( *uc ) != c ) - uc++; - } - if ( uint(uc - tqunicode()) >= l ) - return -1; - return (int)(uc - tqunicode()); -} - -/* an implementation of the Boyer-Moore search algorithm -*/ - -/* initializes the skiptable to know haw far ahead we can skip on a wrong match -*/ -static void bm_init_skiptable( const TQString &pattern, uint *skiptable, bool cs ) -{ - int i = 0; - register uint *st = skiptable; - int l = pattern.length(); - while ( i++ < 0x100/8 ) { - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - *(st++) = l; - } - const TQChar *uc = pattern.tqunicode(); - if ( cs ) { - while ( l-- ) { - skiptable[ uc->cell() ] = l; - uc++; - } - } else { - while ( l-- ) { - skiptable[ ::lower( *uc ).cell() ] = l; - uc++; - } - } -} - -static int bm_find( const TQString &str, int index, const TQString &pattern, uint *skiptable, bool cs ) -{ - const uint l = str.length(); - if ( pattern.isEmpty() ) - return index > (int)l ? -1 : index; - - const TQChar *uc = str.tqunicode(); - const TQChar *puc = pattern.tqunicode(); - const uint pl = pattern.length(); - const uint pl_minus_one = pl - 1; - - register const TQChar *current = uc + index + pl_minus_one; - const TQChar *end = uc + l; - if ( cs ) { - while ( current < end ) { - uint skip = skiptable[ current->cell() ]; - if ( !skip ) { - // possible match - while ( skip < pl ) { - if ( *(current - skip ) != puc[pl_minus_one-skip] ) - break; - skip++; - } - if ( skip > pl_minus_one ) { // we have a match - return (current - uc) - skip + 1; - } - // in case we don't have a match we are a bit inefficient as we only skip by one - // when we have the non matching char in the string. - if ( skiptable[ (current-skip)->cell() ] == pl ) - skip = pl - skip; - else - skip = 1; - } - current += skip; - } - } else { - while ( current < end ) { - uint skip = skiptable[ ::lower( *current ).cell() ]; - if ( !skip ) { - // possible match - while ( skip < pl ) { - if ( ::lower( *(current - skip) ) != ::lower( puc[pl_minus_one-skip] ) ) - break; - skip++; - } - if ( skip > pl_minus_one ) // we have a match - return (current - uc) - skip + 1; - // in case we don't have a match we are a bit inefficient as we only skip by one - // when we have the non matching char in the string. - if ( skiptable[ ::lower(*(current - skip)).cell() ] == pl ) - skip = pl - skip; - else - skip = 1; - } - current += skip; - } - } - // not found - return -1; -} - - -#define REHASH( a ) \ - if ( sl_minus_1 < sizeof(uint) * CHAR_BIT ) \ - hashHaystack -= (a) << sl_minus_1; \ - hashHaystack <<= 1 - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index. If \a index is -1, the search starts at the - last character, if it is -2, at the next to last character and so - on. (See findRev() for searching backwards.) - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Returns the position of \a str or -1 if \a str could not be found. -*/ - -int TQString::find( const TQString& str, int index, bool cs ) const -{ - const uint l = length(); - const uint sl = str.length(); - if ( index < 0 ) - index += l; - if ( sl + index > l ) - return -1; - if ( !sl ) - return index; - if (!l) - return -1; - -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION >= 0x1020 - if ( sl == 1 ) - return find( *str.tqunicode(), index, cs ); -#endif - - // we use the Boyer-Moore algorithm in cases where the overhead - // for the hash table should pay off, otherwise we use a simple - // hash function - if ( l > 500 && sl > 5 ) { - uint skiptable[0x100]; - bm_init_skiptable( str, skiptable, cs ); - return bm_find( *this, index, str, skiptable, cs ); - } - - /* - We use some hashing for efficiency's sake. Instead of - comparing strings, we compare the hash value of str with that of - a part of this TQString. Only if that matches, we call ucstrncmp - or ucstrnicmp. - */ - const TQChar* needle = str.tqunicode(); - const TQChar* haystack = tqunicode() + index; - const TQChar* end = tqunicode() + (l-sl); - const uint sl_minus_1 = sl-1; - uint hashNeedle = 0, hashHaystack = 0, i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + needle[i].tqunicode() ); - hashHaystack = ((hashHaystack<<1) + haystack[i].tqunicode() ); - } - hashHaystack -= (haystack+sl_minus_1)->tqunicode(); - - while ( haystack <= end ) { - hashHaystack += (haystack+sl_minus_1)->tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrncmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - - REHASH( haystack->tqunicode() ); - ++haystack; - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + - ::lower( needle[i].tqunicode() ).tqunicode() ); - hashHaystack = ((hashHaystack<<1) + - ::lower( haystack[i].tqunicode() ).tqunicode() ); - } - - hashHaystack -= ::lower(*(haystack+sl_minus_1)).tqunicode(); - while ( haystack <= end ) { - hashHaystack += ::lower(*(haystack+sl_minus_1)).tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrnicmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - - REHASH( ::lower(*haystack).tqunicode() ); - ++haystack; - } - } - return -1; -} - -/*! - \fn int TQString::findRev( const char* str, int index ) const - - Equivalent to findRev(TQString(\a str), \a index). -*/ - -/*! - \fn int TQString::find( const char* str, int index ) const - - \overload - - Equivalent to find(TQString(\a str), \a index). -*/ - -/*! - \overload - - Finds the first occurrence of the character \a c, starting at - position \a index and searching backwards. If the index is -1, the - search starts at the last character, if it is -2, at the next to - last character and so on. - - Returns the position of \a c or -1 if \a c could not be found. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string( "bananas" ); - int i = string.findRev( 'a' ); // i == 5 - \endcode -*/ - -int TQString::findRev( TQChar c, int index, bool cs ) const -{ -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION < 0x1020 - return findRev( TQString( c ), index, cs ); -#else - const uint l = length(); - if ( index < 0 ) - index += l; - if ( (uint)index >= l ) - return -1; - const TQChar *end = tqunicode(); - register const TQChar *uc = end + index; - if ( cs ) { - while ( uc >= end && *uc != c ) - uc--; - } else { - c = ::lower( c ); - while ( uc >= end && ::lower( *uc ) != c ) - uc--; - } - return uc - end; -#endif -} - -/*! - \overload - - Finds the first occurrence of the string \a str, starting at - position \a index and searching backwards. If the index is -1, the - search starts at the last character, if it is -2, at the next to - last character and so on. - - Returns the position of \a str or -1 if \a str could not be found. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string("bananas"); - int i = string.findRev( "ana" ); // i == 3 - \endcode -*/ - -int TQString::findRev( const TQString& str, int index, bool cs ) const -{ - /* - See TQString::find() for explanations. - */ - const uint l = length(); - if ( index < 0 ) - index += l; - const uint sl = str.length(); - int delta = l-sl; - if ( index < 0 || index > (int)l || delta < 0 ) - return -1; - if ( index > delta ) - index = delta; - -#if defined(TQ_OS_MACX) && defined(TQT_MACOSX_VERSION) && TQT_MACOSX_VERSION >= 0x1020 - if ( sl == 1 ) - return findRev( *str.tqunicode(), index, cs ); -#endif - - const TQChar* needle = str.tqunicode(); - const TQChar* haystack = tqunicode() + index; - const TQChar* end = tqunicode(); - const uint sl_minus_1 = sl-1; - const TQChar* n = needle+sl_minus_1; - const TQChar* h = haystack+sl_minus_1; - uint hashNeedle = 0, hashHaystack = 0, i; - - if ( cs ) { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) + (n-i)->tqunicode() ); - hashHaystack = ((hashHaystack<<1) + (h-i)->tqunicode() ); - } - hashHaystack -= haystack->tqunicode(); - - while ( haystack >= end ) { - hashHaystack += haystack->tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrncmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - --haystack; - REHASH( (haystack+sl)->tqunicode() ); - } - } else { - for ( i = 0; i < sl; ++i ) { - hashNeedle = ((hashNeedle<<1) - + ::lower( (n-i)->tqunicode() ).tqunicode() ); - hashHaystack = ((hashHaystack<<1) - + ::lower( (h-i)->tqunicode() ).tqunicode() ); - } - hashHaystack -= ::lower(*haystack).tqunicode(); - - while ( haystack >= end ) { - hashHaystack += ::lower(*haystack).tqunicode(); - if ( hashHaystack == hashNeedle - && ucstrnicmp( needle, haystack, sl ) == 0 ) - return haystack-tqunicode(); - --haystack; - REHASH( ::lower(*(haystack+sl)).tqunicode() ); - } - } - return -1; -} - -#undef REHASH - -/*! - \enum TQString::SectionFlags - - \value SectionDefault Empty fields are counted, leading and - trailing separators are not included, and the separator is - compared case sensitively. - - \value SectionSkipEmpty Treat empty fields as if they don't exist, - i.e. they are not considered as far as \e start and \e end are - concerned. - - \value SectionIncludeLeadingSep Include the leading separator (if - any) in the result string. - - \value SectionIncludeTrailingSep Include the trailing separator - (if any) in the result string. - - \value SectionCaseInsensitiveSeps Compare the separator - case-insensitively. - - Any of the last four values can be OR-ed together to form a flag. - - \sa section() -*/ - -/*! - \fn TQString TQString::section( TQChar sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - character, \a sep. The returned string consists of the fields from - position \a start to position \a end inclusive. If \a end is not - specified, all fields from position \a start to the end of the - string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString csv( "forename,middlename,surname,phone" ); - TQString s = csv.section( ',', 2, 2 ); // s == "surname" - - TQString path( "/usr/local/bin/myapp" ); // First field is empty - TQString s = path.section( '/', 3, 4 ); // s == "bin/myapp" - TQString s = path.section( '/', 3, 3, SectionSkipEmpty ); // s == "myapp" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString csv( "forename,middlename,surname,phone" ); - TQString s = csv.section( ',', -3, -2 ); // s == "middlename,surname" - - TQString path( "/usr/local/bin/myapp" ); // First field is empty - TQString s = path.section( '/', -1 ); // s == "myapp" - \endcode - - \sa TQStringList::split() -*/ - -/*! - \overload - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - string, \a sep. The returned string consists of the fields from - position \a start to position \a end inclusive. If \a end is not - specified, all fields from position \a start to the end of the - string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString data( "forename**middlename**surname**phone" ); - TQString s = data.section( "**", 2, 2 ); // s == "surname" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString data( "forename**middlename**surname**phone" ); - TQString s = data.section( "**", -3, -2 ); // s == "middlename**surname" - \endcode - - \sa TQStringList::split() -*/ - -TQString TQString::section( const TQString &sep, int start, int end, int flags ) const -{ - TQStringList sections = TQStringList::split(sep, *this, TRUE); - if(sections.isEmpty()) - return TQString(); - if(!(flags & SectionSkipEmpty)) { - if(start < 0) - start += int(sections.count()); - if(end < 0) - end += int(sections.count()); - } else { - int skip = 0; - for(TQStringList::Iterator it = sections.begin(); it != sections.end(); ++it) { - if((*it).isEmpty()) - skip++; - } - if(start < 0) - start += int(sections.count()) - skip; - if(end < 0) - end += int(sections.count()) - skip; - } - int x = 0, run = 0; - TQString ret; - for(TQStringList::Iterator it = sections.begin(); x <= end && it != sections.end(); ++it) { - if(x >= start) { - if((*it).isEmpty()) { - run++; - } else { - if(!ret.isEmpty() || !(flags & SectionSkipEmpty)) { - int i_end = run; - if(!ret.isEmpty() && !(flags & SectionIncludeTrailingSep)) - i_end++; - if((flags & SectionIncludeLeadingSep) && it != sections.begin() && x == start) - i_end++; - for(int i = 0; i < i_end; i++) - ret += sep; - } else if((flags & SectionIncludeLeadingSep) && it != sections.begin()) { - ret += sep; - } - run = 0; - ret += (*it); - if((flags & SectionIncludeTrailingSep) && it != sections.end()) - ret += sep; - } - } - if(!(*it).isEmpty() || !(flags & SectionSkipEmpty)) - x++; - } - return ret; -} - -#ifndef TQT_NO_REGEXP -class section_chunk { -public: - section_chunk(int l, TQString s) { length = l; string = s; } - int length; - TQString string; -}; -/*! - \overload - - This function returns a section of the string. - - This string is treated as a sequence of fields separated by the - regular expression, \a reg. The returned string consists of the - fields from position \a start to position \a end inclusive. If \a - end is not specified, all fields from position \a start to the end - of the string are included. Fields are numbered 0, 1, 2, etc., counting - from the left, and -1, -2, etc., counting from right to left. - - The \a flags argument can be used to affect some aspects of the - function's behaviour, e.g. whether to be case sensitive, whether - to skip empty fields and how to deal with leading and trailing - separators; see \l{SectionFlags}. - - \code - TQString line( "forename\tmiddlename surname \t \t phone" ); - TQRegExp sep( "\s+" ); - TQString s = line.section( sep, 2, 2 ); // s == "surname" - \endcode - - If \a start or \a end is negative, we count fields from the right - of the string, the right-most field being -1, the one from - right-most field being -2, and so on. - - \code - TQString line( "forename\tmiddlename surname \t \t phone" ); - TQRegExp sep( "\\s+" ); - TQString s = line.section( sep, -3, -2 ); // s == "middlename surname" - \endcode - - \warning Using this TQRegExp version is much more expensive than - the overloaded string and character versions. - - \sa TQStringList::split() simplifyWhiteSpace() -*/ - -TQString TQString::section( const TQRegExp ®, int start, int end, int flags ) const -{ - const TQChar *uc = tqunicode(); - if(!uc) - return TQString(); - - TQRegExp sep(reg); - sep.setCaseSensitive(!(flags & SectionCaseInsensitiveSeps)); - - TQPtrList<section_chunk> l; - l.setAutoDelete(TRUE); - int n = length(), m = 0, last_m = 0, last = 0, last_len = 0; - - while ( ( m = sep.search( *this, m ) ) != -1 ) { - l.append(new section_chunk(last_len, TQString(uc + last_m, m - last_m))); - last_m = m; - last_len = sep.matchedLength(); - if((m += TQMAX(sep.matchedLength(), 1)) >= n) { - last = 1; - break; - } - } - if(!last) - l.append(new section_chunk(last_len, TQString(uc + last_m, n - last_m))); - - if(start < 0) - start = l.count() + start; - if(end == -1) - end = l.count(); - else if(end < 0) - end = l.count() + end; - - int i = 0; - TQString ret; - for ( section_chunk *chk=l.first(); chk; chk=l.next(), i++ ) { - if((flags & SectionSkipEmpty) && chk->length == (int)chk->string.length()) { - if(i <= start) - start++; - end++; - } - if(i == start) { - ret = (flags & SectionIncludeLeadingSep) ? chk->string : chk->string.mid(chk->length); - } else if(i > start) { - ret += chk->string; - } - if(i == end) { - if((chk=l.next()) && flags & SectionIncludeTrailingSep) - ret += chk->string.left(chk->length); - break; - } - } - return ret; -} -#endif - -/*! - \fn TQString TQString::section( char sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - \overload -*/ - -/*! - \fn TQString TQString::section( const char *sep, int start, int end = 0xffffffff, int flags = SectionDefault ) const - - \overload -*/ - - -/*! - Returns the number of times the character \a c occurs in the - string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString string( "Trolltech and TQt" ); - int n = string.contains( 't', FALSE ); - // n == 3 - \endcode -*/ - -int TQString::contains( TQChar c, bool cs ) const -{ - int count = 0; - const TQChar *uc = tqunicode(); - if ( !uc ) - return 0; - int n = length(); - if ( cs ) { - while ( n-- ) { - if ( *uc == c ) - count++; - uc++; - } - } else { - c = ::lower( c ); - while ( n-- ) { - if ( ::lower( *uc ) == c ) - count++; - uc++; - } - } - return count; -} - -/*! - \overload - - Returns the number of times the string \a str occurs in the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ -int TQString::contains( const char* str, bool cs ) const -{ - return contains( TQString(str), cs ); -} - -/*! - \fn int TQString::contains( char c, bool cs ) const - - \overload -*/ - -/*! - \fn int TQString::find( char c, int index, bool cs ) const - - \overload - - Find character \a c starting from position \a index. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! - \fn int TQString::findRev( char c, int index, bool cs ) const - - \overload - - Find character \a c starting from position \a index and working - backwards. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! - \overload - - Returns the number of times \a str occurs in the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - This function counts overlapping strings, so in the example below, - there are two instances of "ana" in "bananas". - - \code - TQString str( "bananas" ); - int i = str.contains( "ana" ); // i == 2 - \endcode - - \sa findRev() -*/ - -int TQString::contains( const TQString &str, bool cs ) const -{ - if ( isNull() ) - return 0; - int count = 0; - uint skiptable[0x100]; - bm_init_skiptable( str, skiptable, cs ); - int i = -1; - // use boyer-moore for the ultimate speed experience - while ( ( i = bm_find( *this, i + 1, str, skiptable, cs ) ) != -1 ) - count++; - return count; -} - -/*! - Returns a substring that contains the \a len leftmost characters - of the string. - - The whole string is returned if \a len exceeds the length of the - string. - - \code - TQString s = "Pineapple"; - TQString t = s.left( 4 ); // t == "Pine" - \endcode - - \sa right(), mid(), isEmpty() -*/ - -TQString TQString::left( uint len ) const -{ - if ( isEmpty() ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else if ( len >= length() ) { - return *this; - } else { - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, d->tqunicode, len * sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string that contains the \a len rightmost characters of - the string. - - If \a len is greater than the length of the string then the whole - string is returned. - - \code - TQString string( "Pineapple" ); - TQString t = string.right( 5 ); // t == "apple" - \endcode - - \sa left(), mid(), isEmpty() -*/ - -TQString TQString::right( uint len ) const -{ - if ( isEmpty() ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else { - uint l = length(); - if ( len >= l ) - return *this; - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, d->tqunicode+(l-len), len*sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string that contains the \a len characters of this - string, starting at position \a index. - - Returns a null string if the string is empty or \a index is out of - range. Returns the whole string from \a index if \a index + \a len - exceeds the length of the string. - - \code - TQString s( "Five pineapples" ); - TQString t = s.mid( 5, 4 ); // t == "pine" - \endcode - - \sa left(), right() -*/ - -TQString TQString::mid( uint index, uint len ) const -{ - uint slen = length(); - if ( isEmpty() || index >= slen ) { - return TQString(); - } else if ( len == 0 ) { // ## just for 1.x compat: - return tqfromLatin1( "" ); - } else { - if ( len > slen-index ) - len = slen - index; - if ( index == 0 && len == slen ) - return *this; - register const TQChar *p = tqunicode()+index; - TQString s( len, TRUE ); - memcpy( s.d->tqunicode, p, len * sizeof(TQChar) ); - s.d->len = len; - return s; - } -} - -/*! - Returns a string of length \a width that contains this string - padded by the \a fill character. - - If \a truncate is FALSE and the length of the string is more than - \a width, then the returned string is a copy of the string. - - If \a truncate is TRUE and the length of the string is more than - \a width, then any characters in a copy of the string after length - \a width are removed, and the copy is returned. - - \code - TQString s( "apple" ); - TQString t = s.leftJustify( 8, '.' ); // t == "apple..." - \endcode - - \sa rightJustify() -*/ - -TQString TQString::leftJustify( uint width, TQChar fill, bool truncate ) const -{ - TQString result; - int len = length(); - int padlen = width - len; - if ( padlen > 0 ) { - result.setLength(len+padlen); - if ( len ) - memcpy( result.d->tqunicode, tqunicode(), sizeof(TQChar)*len ); - TQChar* uc = result.d->tqunicode + len; - while (padlen--) - *uc++ = fill; - } else { - if ( truncate ) - result = left( width ); - else - result = *this; - } - return result; -} - -/*! - Returns a string of length \a width that contains the \a fill - character followed by the string. - - If \a truncate is FALSE and the length of the string is more than - \a width, then the returned string is a copy of the string. - - If \a truncate is TRUE and the length of the string is more than - \a width, then the resulting string is truncated at position \a - width. - - \code - TQString string( "apple" ); - TQString t = string.rightJustify( 8, '.' ); // t == "...apple" - \endcode - - \sa leftJustify() -*/ - -TQString TQString::rightJustify( uint width, TQChar fill, bool truncate ) const -{ - TQString result; - int len = length(); - int padlen = width - len; - if ( padlen > 0 ) { - result.setLength( len+padlen ); - TQChar* uc = result.d->tqunicode; - while (padlen--) - *uc++ = fill; - if ( len ) - memcpy( uc, tqunicode(), sizeof(TQChar)*len ); - } else { - if ( truncate ) - result = left( width ); - else - result = *this; - } - return result; -} - -/*! - Returns a lowercase copy of the string. - - \code - TQString string( "TROlltECH" ); - str = string.lower(); // str == "trolltech" - \endcode - - \sa upper() -*/ - -TQString TQString::lower() const -{ - int l = length(); - register TQChar *p = d->tqunicode; - while ( l ) { - if ( *p != ::lower(*p) ) { - TQString s( *this ); - s.real_detach(); - p = s.d->tqunicode + ( p - d->tqunicode ); - while ( l ) { - *p = ::lower( *p ); - l--; - p++; - } - return s; - } - l--; - p++; - } - return *this; -} - -/*! - Returns an uppercase copy of the string. - - \code - TQString string( "TeXt" ); - str = string.upper(); // t == "TEXT" - \endcode - - \sa lower() -*/ - -TQString TQString::upper() const -{ - int l = length(); - register TQChar *p = d->tqunicode; - while ( l ) { - if ( *p != ::upper(*p) ) { - TQString s( *this ); - s.real_detach(); - p = s.d->tqunicode + ( p - d->tqunicode ); - while ( l ) { - *p = ::upper( *p ); - l--; - p++; - } - return s; - } - l--; - p++; - } - return *this; -} - - -/*! - Returns a string that has whitespace removed from the start and - the end. - - Whitespace means any character for which TQChar::isSpace() returns - TRUE. This includes Unicode characters with decimal values 9 - (TAB), 10 (LF), 11 (VT), 12 (FF), 13 (CR) and 32 (Space), and may - also include other Unicode characters. - - \code - TQString string = " white space "; - TQString s = string.stripWhiteSpace(); // s == "white space" - \endcode - - \sa simplifyWhiteSpace() -*/ - -TQString TQString::stripWhiteSpace() const -{ - if ( isEmpty() ) // nothing to do - return *this; - register const TQChar *s = tqunicode(); - if ( !s->isSpace() && !s[length()-1].isSpace() ) - return *this; - - int start = 0; - int end = length() - 1; - while ( start<=end && s[start].isSpace() ) // skip white space from start - start++; - if ( start <= end ) { // only white space - while ( end && s[end].isSpace() ) // skip white space from end - end--; - } - int l = end - start + 1; - if ( l <= 0 ) - return TQString::tqfromLatin1(""); - - TQString result( l, TRUE ); - memcpy( result.d->tqunicode, &s[start], sizeof(TQChar)*l ); - result.d->len = l; - return result; -} - - -/*! - Returns a string that has whitespace removed from the start and - the end, and which has each sequence of internal whitespace - replaced with a single space. - - Whitespace means any character for which TQChar::isSpace() returns - TRUE. This includes Unicode characters with decimal values 9 - (TAB), 10 (LF), 11 (VT), 12 (FF), 13 (CR), and 32 (Space). - - \code - TQString string = " lots\t of\nwhite space "; - TQString t = string.simplifyWhiteSpace(); - // t == "lots of white space" - \endcode - - \sa stripWhiteSpace() -*/ - -TQString TQString::simplifyWhiteSpace() const -{ - if ( isEmpty() ) - return *this; - TQString result; - result.setLength( length() ); - const TQChar *from = tqunicode(); - const TQChar *fromend = from+length(); - int outc=0; - TQChar *to = result.d->tqunicode; - for (;;) { - while ( from!=fromend && from->isSpace() ) - from++; - while ( from!=fromend && !from->isSpace() ) - to[outc++] = *from++; - if ( from!=fromend ) - to[outc++] = ' '; - else - break; - } - if ( outc > 0 && to[outc-1] == ' ' ) - outc--; - result.truncate( outc ); - return result; -} - - -/*! - Inserts \a s into the string at position \a index. - - If \a index is beyond the end of the string, the string is - extended with spaces to length \a index and \a s is then appended - and returns a reference to the string. - - \code - TQString string( "I like fish" ); - str = string.insert( 2, "don't " ); - // str == "I don't like fish" - \endcode - - \sa remove(), replace() -*/ - -TQString &TQString::insert( uint index, const TQString &s ) -{ - // the sub function takes care of &s == this case. - return insert( index, s.tqunicode(), s.length() ); -} - -/*! \fn TQString &TQString::insert( uint index, const TQByteArray &s ) - \overload - - Inserts \a s into the string at position \a index and returns - a reference to the string. -*/ - -/*! \fn TQString &TQString::insert( uint index, const char *s ) - \overload - - Inserts \a s into the string at position \a index and returns - a reference to the string. -*/ - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::insertHelper( uint index, const char *s, uint len ) -{ - if ( s ) { -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return insert( index, fromAscii( s, len ) ); -#endif - if ( len == UINT_MAX ) - len = int(strlen( s )); - if ( len == 0 ) - return *this; - - uint olen = length(); - int nlen = olen + len; - - if ( index >= olen ) { // insert after end of string - grow( len + index ); - int n = index - olen; - TQChar* uc = d->tqunicode + olen; - while ( n-- ) - *uc++ = ' '; - - uc = d->tqunicode + index; - while ( len-- ) - *uc++ = *s++; - } else { // normal insert - grow( nlen ); - memmove( d->tqunicode + index + len, tqunicode() + index, - sizeof(TQChar) * (olen - index) ); - - TQChar* uc = d->tqunicode + index; - while ( len-- ) - *uc++ = *s++; - } - } - return *this; -} -#endif - -/*! - \overload - - Inserts the first \a len characters in \a s into the string at - position \a index and returns a reference to the string. -*/ - -TQString &TQString::insert( uint index, const TQChar* s, uint len ) -{ - if ( len == 0 ) - return *this; - uint olen = length(); - int nlen = olen + len; - - if ( s >= d->tqunicode && (uint)(s - d->tqunicode) < d->maxl ) { - // Part of me - take a copy. - TQChar *tmp = TQT_ALLOC_TQCHAR_VEC( len ); - memcpy(tmp,s,len*sizeof(TQChar)); - insert(index,tmp,len); - TQT_DELETE_TQCHAR_VEC( tmp ); - return *this; - } - - if ( index >= olen ) { // insert after end of string - grow( len + index ); - int n = index - olen; - TQChar* uc = d->tqunicode+olen; - while (n--) - *uc++ = ' '; - memcpy( d->tqunicode+index, s, sizeof(TQChar)*len ); - } else { // normal insert - grow( nlen ); - memmove( d->tqunicode + index + len, tqunicode() + index, - sizeof(TQChar) * (olen - index) ); - memcpy( d->tqunicode + index, s, sizeof(TQChar) * len ); - } - return *this; -} - -/*! - \overload - - Insert \a c into the string at position \a index and returns a - reference to the string. - - If \a index is beyond the end of the string, the string is - extended with spaces (ASCII 32) to length \a index and \a c is - then appended. -*/ - -TQString &TQString::insert( uint index, TQChar c ) // insert char -{ - TQString s( c ); - return insert( index, s ); -} - -/*! - \fn TQString& TQString::insert( uint index, char c ) - - \overload - - Insert character \a c at position \a index. -*/ - -/*! - \fn TQString &TQString::prepend( const TQString &s ) - - Inserts \a s at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a s). - - \code - TQString string = "42"; - string.prepend( "The answer is " ); - // string == "The answer is 42" - \endcode - - \sa insert() -*/ - -/*! - \fn TQString& TQString::prepend( char ch ) - - \overload - - Inserts \a ch at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a ch). - - \sa insert() -*/ - -/*! - \fn TQString& TQString::prepend( TQChar ch ) - - \overload - - Inserts \a ch at the beginning of the string and returns a - reference to the string. - - Equivalent to insert(0, \a ch). - - \sa insert() -*/ - -/*! \fn TQString& TQString::prepend( const TQByteArray &s ) - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() - */ - -/*! \fn TQString& TQString::prepend( const std::string &s ) - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() -*/ - -/*! - \overload - - Inserts \a s at the beginning of the string and returns a reference to the string. - - Equivalent to insert(0, \a s). - - \sa insert() - */ -TQString &TQString::prepend( const char *s ) -{ - return insert( 0, TQString(s) ); -} - -/*! - Removes \a len characters from the string starting at position \a - index, and returns a reference to the string. - - If \a index is beyond the length of the string, nothing happens. - If \a index is within the string, but \a index + \a len is beyond - the end of the string, the string is truncated at position \a - index. - - \code - TQString string( "Montreal" ); - string.remove( 1, 4 ); // string == "Meal" - \endcode - - \sa insert(), replace() -*/ - -TQString &TQString::remove( uint index, uint len ) -{ - uint olen = length(); - if ( index >= olen ) { - // range problems - } else if ( index + len >= olen ) { // index ok - setLength( index ); - } else if ( len != 0 ) { - real_detach(); - memmove( d->tqunicode+index, d->tqunicode+index+len, - sizeof(TQChar)*(olen-index-len) ); - setLength( olen-len ); - } - return *this; -} - -/*! \overload - - Removes every occurrence of the character \a c in the string. - Returns a reference to the string. - - This is the same as replace(\a c, ""). -*/ -TQString &TQString::remove( TQChar c ) -{ - int i = 0; - while ( i < (int) length() ) { - if ( constref(i) == c ) { - remove( i, 1 ); - } else { - i++; - } - } - return *this; -} - -/*! \overload - - \fn TQString &TQString::remove( char c ) - - Removes every occurrence of the character \a c in the string. - Returns a reference to the string. - - This is the same as replace(\a c, ""). -*/ - -/*! \overload - - Removes every occurrence of \a str in the string. Returns a - reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - This is the same as replace(\a str, "", \a cs). -*/ -TQString &TQString::remove( const TQString & str, bool cs ) -{ - if ( str.isEmpty() ) { - if ( isNull() ) - real_detach(); - } else { - int index = 0; - while ( (index = find(str, index, cs)) != -1 ) - remove( index, str.length() ); - } - return *this; -} - -TQString &TQString::remove( const TQString & str ) -{ - return remove( str, TRUE ); -} - -/*! \overload - - Replaces every occurrence of \a c1 with the char \a c2. Returns a - reference to the string. -*/ -TQString &TQString::replace( TQChar c1, TQChar c2 ) -{ - if ( isEmpty() ) - return *this; - - real_detach(); - uint i = 0; - while ( i < d->len ) { - if ( d->tqunicode[i] == c1 ) - d->tqunicode[i] = c2; - i++; - } - return *this; -} - -#ifndef TQT_NO_REGEXP_CAPTURE - -/*! \overload - - Removes every occurrence of the regular expression \a rx in the - string. Returns a reference to the string. - - This is the same as replace(\a rx, ""). -*/ - -TQString &TQString::remove( const TQRegExp & rx ) -{ - return replace( rx, TQString::null ); -} - -#endif - -/*! - \overload - - Removes every occurrence of \a str in the string. Returns a - reference to the string. -*/ -TQString &TQString::remove( const char *str ) -{ - return remove( TQString::fromAscii(str), TRUE ); -} - -/*! - Replaces \a len characters from the string with \a s, starting at - position \a index, and returns a reference to the string. - - If \a index is beyond the length of the string, nothing is deleted - and \a s is appended at the end of the string. If \a index is - valid, but \a index + \a len is beyond the end of the string, - the string is truncated at position \a index, then \a s is - appended at the end. - - \code - TQString string( "Say yes!" ); - string = string.replace( 4, 3, "NO" ); - // string == "Say NO!" - \endcode - - \warning TQt 3.3.3 and earlier had different semantics for the - case \a index >= length(), which contradicted the documentation. - To avoid portability problems between TQt 3 versions and with TQt - 4, we recommend that you never call the function with \a index >= - length(). - - \sa insert(), remove() -*/ - -TQString &TQString::replace( uint index, uint len, const TQString &s ) -{ - return replace( index, len, s.tqunicode(), s.length() ); -} - -/*! \overload - - This is the same as replace(\a index, \a len, TQString(\a c)). -*/ -TQString &TQString::replace( uint index, uint len, TQChar c ) -{ - return replace( index, len, &c, 1 ); -} - -/*! \overload - \fn TQString &TQString::replace( uint index, uint len, char c ) - - This is the same as replace(\a index, \a len, TQChar(\a c)). -*/ - -/*! - \overload - - Replaces \a len characters with \a slen characters of TQChar data - from \a s, starting at position \a index, and returns a reference - to the string. - - \sa insert(), remove() -*/ - -TQString &TQString::replace( uint index, uint len, const TQChar* s, uint slen ) -{ - if (index > length()) - index = length(); - real_detach(); - if ( len == slen && index + len <= length() ) { - // Optimized common case: replace without size change - memcpy( d->tqunicode+index, s, len * sizeof(TQChar) ); - } else if ( s >= d->tqunicode && (uint)(s - d->tqunicode) < d->maxl ) { - // Part of me - take a copy. - TQChar *tmp = TQT_ALLOC_TQCHAR_VEC( slen ); - memcpy( tmp, s, slen * sizeof(TQChar) ); - replace( index, len, tmp, slen ); - TQT_DELETE_TQCHAR_VEC( tmp ); - } else { - remove( index, len ); - insert( index, s, slen ); - } - return *this; -} - -/*! \overload - - Replaces every occurrence of the character \a c in the string - with \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Example: - \code - TQString s = "a,b,c"; - s.replace( TQChar(','), " or " ); - // s == "a or b or c" - \endcode -*/ -TQString &TQString::replace( TQChar c, const TQString & after, bool cs ) -{ - return replace( TQString( c ), after, cs ); -} - -TQString &TQString::replace( TQChar c, const TQString & after ) -{ - return replace( TQString( c ), after, TRUE ); -} - -/*! \overload - \fn TQString &TQString::replace( char c, const TQString & after, bool cs ) - - Replaces every occurrence of the character \a c in the string - with \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. -*/ - -/*! \overload - - Replaces every occurrence of the string \a before in the string - with the string \a after. Returns a reference to the string. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - Example: - \code - TQString s = "Greek is Greek"; - s.replace( "Greek", "English" ); - // s == "English is English" - \endcode -*/ -TQString &TQString::replace( const TQString & before, const TQString & after, - bool cs ) -{ - if ( isEmpty() ) { - if ( !before.isEmpty() ) - return *this; - } else { - if ( cs && before == after ) - return *this; - } - - real_detach(); - - int index = 0; - uint skiptable[256]; - bm_init_skiptable( before, skiptable, cs ); - const int bl = before.length(); - const int al = after.length(); - - if ( bl == al ) { - if ( bl ) { - const TQChar *auc = after.tqunicode(); - while ( (index = bm_find(*this, index, before, skiptable, cs) ) != -1 ) { - memcpy( d->tqunicode + index, auc, al * sizeof(TQChar) ); - index += bl; - } - } - } else if ( al < bl ) { - const TQChar *auc = after.tqunicode(); - uint to = 0; - uint movestart = 0; - uint num = 0; - while ( (index = bm_find(*this, index, before, skiptable, cs)) != -1 ) { - if ( num ) { - int msize = index - movestart; - if ( msize > 0 ) { - memmove( d->tqunicode + to, d->tqunicode + movestart, msize*sizeof(TQChar) ); - to += msize; - } - } else { - to = index; - } - if ( al ) { - memcpy( d->tqunicode+to, auc, al*sizeof(TQChar) ); - to += al; - } - index += bl; - movestart = index; - num++; - } - if ( num ) { - int msize = d->len - movestart; - if ( msize > 0 ) - memmove( d->tqunicode + to, d->tqunicode + movestart, msize*sizeof(TQChar) ); - setLength( d->len - num*(bl-al) ); - } - } else { - // the most complex case. We don't want to loose performance by doing repeated - // copies and reallocs of the string. - while ( index != -1 ) { - uint indices[4096]; - uint pos = 0; - while ( pos < 4095 ) { - index = bm_find( *this, index, before, skiptable, cs ); - if ( index == -1 ) - break; - indices[pos++] = index; - index += bl; - // avoid infinite loop - if ( !bl ) - index++; - } - if ( !pos ) - break; - - // we have a table of replacement positions, use them for fast replacing - int adjust = pos*(al-bl); - // index has to be adjusted in case we get back into the loop above. - if ( index != -1 ) - index += adjust; - uint newlen = d->len + adjust; - int moveend = d->len; - if ( newlen > d->len ) - setLength( newlen ); - - while ( pos ) { - pos--; - int movestart = indices[pos] + bl; - int insertstart = indices[pos] + pos*(al-bl); - int moveto = insertstart + al; - memmove( d->tqunicode + moveto, d->tqunicode + movestart, (moveend - movestart)*sizeof(TQChar) ); - memcpy( d->tqunicode + insertstart, after.tqunicode(), al*sizeof(TQChar) ); - moveend = movestart-bl; - } - } - } - return *this; -} - -TQString &TQString::replace( const TQString & before, const TQString & after ) -{ - return replace( before, after, TRUE ); -} - -#ifndef TQT_NO_REGEXP_CAPTURE -/*! \overload - - Replaces every occurrence of the regexp \a rx in the string with - \a after. Returns a reference to the string. For example: - \code - TQString s = "banana"; - s.replace( TQRegExp("an"), "" ); - // s == "ba" - \endcode - - For regexps containing \link tqregexp.html#capturing-text capturing - parentheses \endlink, occurrences of <b>\\1</b>, <b>\\2</b>, ..., - in \a after are replaced with \a{rx}.cap(1), cap(2), ... - - \code - TQString t = "A <i>bon mot</i>."; - t.replace( TQRegExp("<i>([^<]*)</i>"), "\\emph{\\1}" ); - // t == "A \\emph{bon mot}." - \endcode - - \sa find(), findRev(), TQRegExp::cap() -*/ - -TQString &TQString::replace( const TQRegExp &rx, const TQString &after ) -{ - TQRegExp rx2 = rx; - - if ( isEmpty() && rx2.search(*this) == -1 ) - return *this; - - real_detach(); - - int index = 0; - int numCaptures = rx2.numCaptures(); - int al = after.length(); - TQRegExp::CaretMode caretMode = TQRegExp::CaretAtZero; - - if ( numCaptures > 0 ) { - if ( numCaptures > 9 ) - numCaptures = 9; - - const TQChar *uc = after.tqunicode(); - int numBackRefs = 0; - - for ( int i = 0; i < al - 1; i++ ) { - if ( uc[i] == '\\' ) { - int no = uc[i + 1].digitValue(); - if ( no > 0 && no <= numCaptures ) - numBackRefs++; - } - } - - /* - This is the harder case where we have back-references. - We don't try to optimize it. - */ - if ( numBackRefs > 0 ) { - int *capturePositions = new int[numBackRefs]; - int *captureNumbers = new int[numBackRefs]; - int j = 0; - - for ( int i = 0; i < al - 1; i++ ) { - if ( uc[i] == '\\' ) { - int no = uc[i + 1].digitValue(); - if ( no > 0 && no <= numCaptures ) { - capturePositions[j] = i; - captureNumbers[j] = no; - j++; - } - } - } - - while ( index <= (int)length() ) { - index = rx2.search( *this, index, caretMode ); - if ( index == -1 ) - break; - - TQString after2 = after; - for ( j = numBackRefs - 1; j >= 0; j-- ) - after2.replace( capturePositions[j], 2, - rx2.cap(captureNumbers[j]) ); - - replace( index, rx2.matchedLength(), after2 ); - index += after2.length(); - - if ( rx2.matchedLength() == 0 ) { - // avoid infinite loop on 0-length matches (e.g., [a-z]*) - index++; - } - caretMode = TQRegExp::CaretWontMatch; - } - delete[] capturePositions; - delete[] captureNumbers; - return *this; - } - } - - /* - This is the simple and optimized case where we don't have - back-references. - */ - while ( index != -1 ) { - struct { - int pos; - int length; - } replacements[2048]; - - uint pos = 0; - int adjust = 0; - while ( pos < 2047 ) { - index = rx2.search( *this, index, caretMode ); - if ( index == -1 ) - break; - int ml = rx2.matchedLength(); - replacements[pos].pos = index; - replacements[pos++].length = ml; - index += ml; - adjust += al - ml; - // avoid infinite loop - if ( !ml ) - index++; - } - if ( !pos ) - break; - replacements[pos].pos = d->len; - uint newlen = d->len + adjust; - - // to continue searching at the right position after we did - // the first round of replacements - if ( index != -1 ) - index += adjust; - TQChar *newuc = TQT_ALLOC_TQCHAR_VEC( newlen + 1 ); - TQChar *uc = newuc; - int copystart = 0; - uint i = 0; - while ( i < pos ) { - int copyend = replacements[i].pos; - int size = copyend - copystart; - memcpy( uc, d->tqunicode + copystart, size * sizeof(TQChar) ); - uc += size; - memcpy( uc, after.tqunicode(), al * sizeof(TQChar) ); - uc += al; - copystart = copyend + replacements[i].length; - i++; - } - memcpy( uc, d->tqunicode + copystart, - (d->len - copystart) * sizeof(TQChar) ); - TQT_DELETE_TQCHAR_VEC( d->tqunicode ); - d->tqunicode = newuc; - d->len = newlen; - d->maxl = newlen + 1; - d->setDirty(); - caretMode = TQRegExp::CaretWontMatch; - } - return *this; -} -#endif - -#ifndef TQT_NO_REGEXP -/*! - Finds the first match of the regular expression \a rx, starting - from position \a index. If \a index is -1, the search starts at - the last character; if -2, at the next to last character and so - on. (See findRev() for searching backwards.) - - Returns the position of the first match of \a rx or -1 if no match - was found. - - \code - TQString string( "bananas" ); - int i = string.find( TQRegExp("an"), 0 ); // i == 1 - \endcode - - \sa findRev() replace() contains() -*/ - -int TQString::find( const TQRegExp &rx, int index ) const -{ - return rx.search( *this, index ); -} - -/*! - \overload - - Finds the first match of the regexp \a rx, starting at position \a - index and searching backwards. If the index is -1, the search - starts at the last character, if it is -2, at the next to last - character and so on. (See findRev() for searching backwards.) - - Returns the position of the match or -1 if no match was found. - - \code - TQString string( "bananas" ); - int i = string.findRev( TQRegExp("an") ); // i == 3 - \endcode - - \sa find() -*/ - -int TQString::findRev( const TQRegExp &rx, int index ) const -{ - return rx.searchRev( *this, index ); -} - -/*! - \overload - - Returns the number of times the regexp, \a rx, matches in the - string. - - This function counts overlapping matches, so in the example below, - there are four instances of "ana" or "ama". - - \code - TQString str = "banana and panama"; - TQRegExp rxp = TQRegExp( "a[nm]a", TRUE, FALSE ); - int i = str.contains( rxp ); // i == 4 - \endcode - - \sa find() findRev() -*/ - -int TQString::contains( const TQRegExp &rx ) const -{ - int count = 0; - int index = -1; - int len = length(); - while ( index < len - 1 ) { // count overlapping matches - index = rx.search( *this, index + 1 ); - if ( index == -1 ) - break; - count++; - } - return count; -} - -#endif //TQT_NO_REGEXP - -/*! - Returns the string converted to a \c long using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -long TQString::toLong( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < LONG_MIN || v > LONG_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return long(v); -} - -/*! - Returns the string converted to a \c {long long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -TQ_LLONG TQString::toLongLong( bool *ok, int base ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( base != 0 && (base < 2 || base > 36) ) { - qWarning( "TQString::toLongLong: Invalid base (%d)", base ); - base = 10; - } -#endif - - bool my_ok; - TQLocale def_locale; - TQ_LLONG result = def_locale.d->stringToLongLong(*this, base, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToLongLong(*this, base, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to an \c {unsigned long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -ulong TQString::toULong( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > ULONG_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return ulong(v); -} - -/*! - Returns the string converted to an \c {unsigned long long} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -TQ_ULLONG TQString::toULongLong( bool *ok, int base ) const -{ -#if defined(TQT_CHECK_RANGE) - if ( base != 0 && (base < 2 || base > 36) ) { - qWarning( "TQString::toULongLong: Invalid base %d", base ); - base = 10; - } -#endif - - bool my_ok; - TQLocale def_locale; - TQ_ULLONG result = def_locale.d->stringToUnsLongLong(*this, base, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToUnsLongLong(*this, base, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c short using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - - -short TQString::toShort( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < SHRT_MIN || v > SHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (short)v; -} - -/*! - Returns the string converted to an \c {unsigned short} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -ushort TQString::toUShort( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > USHRT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (ushort)v; -} - - -/*! - Returns the string converted to an \c int using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString str( "FF" ); - bool ok; - int hex = str.toInt( &ok, 16 ); // hex == 255, ok == TRUE - int dec = str.toInt( &ok, 10 ); // dec == 0, ok == FALSE - \endcode - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -int TQString::toInt( bool *ok, int base ) const -{ - TQ_LLONG v = toLongLong( ok, base ); - if ( v < INT_MIN || v > INT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (int)v; -} - -/*! - Returns the string converted to an \c {unsigned int} using base \a - base, which is 10 by default and must be between 2 and 36 or 0. If - \a base is 0, the base is determined automatically using the - following rules: - <ul> - <li>If the string begins with "0x", it is assumed to - be hexadecimal; - <li>If it begins with "0", it is assumed to be octal; - <li>Otherwise it is assumed to be decimal. - </ul> - - Returns 0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - Leading and trailing whitespace is ignored by this function. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \sa number() -*/ - -uint TQString::toUInt( bool *ok, int base ) const -{ - TQ_ULLONG v = toULongLong( ok, base ); - if ( v > UINT_MAX ) { - if ( ok ) - *ok = FALSE; - v = 0; - } - return (uint)v; -} - -/*! - Returns the string converted to a \c double value. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - \code - TQString string( "1234.56" ); - double a = string.toDouble(); // a == 1234.56 - \endcode - - The string-to-number functions: - \list - \i toShort() - \i toUShort() - \i toInt() - \i toUInt() - \i toLong() - \i toULong() - \i toLongLong() - \i toULongLong() - \i toFloat() - \i toDouble() - \endlist - can handle numbers - represented in various locales. These representations may use different - characters for the decimal point, thousands group sepearator - and even individual digits. TQString's functions try to interpret - the string according to the current locale. The current locale is - determined from the system at application startup and can be changed - by calling TQLocale::setDefault(). If the string cannot be interpreted - according to the current locale, this function falls back - on the "C" locale. - - \code - bool ok; - double d; - - TQLocale::setDefault(TQLocale::C); - d = TQString( "1234,56" ).toDouble(&ok); // ok == false - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - - TQLocale::setDefault(TQLocale::German); - d = TQString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56 - d = TQString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56 - \endcode - - Due to the ambiguity between the decimal point and thousands group - separator in various locales, these functions do not handle - thousands group separators. If you need to convert such numbers, - use the corresponding function in TQLocale. - - \code - bool ok; - TQLocale::setDefault(TQLocale::C); - double d = TQString( "1,234,567.89" ).toDouble(&ok); // ok == false - \endcode - - \warning If the string contains trailing whitespace this function - will fail, and set \a *ok to false if \a ok is not 0. Leading - whitespace is ignored. - - \sa number() TQLocale::setDefault() TQLocale::toDouble() stripWhiteSpace() -*/ - -double TQString::toDouble( bool *ok ) const -{ - // If there is trailing whitespace, set ok to false but return the correct - // result anyway to preserve behavour of pervious versions of TQt - if (length() > 0 && tqunicode()[length() - 1].isSpace()) { - TQString tmp = stripWhiteSpace(); - if (ok != 0) - *ok = FALSE; - return tmp.toDouble(); - } - - // Try the default locale - bool my_ok; - TQLocale def_locale; - double result = def_locale.d->stringToDouble(*this, &my_ok, TQLocalePrivate::FailOnGroupSeparators); - if (my_ok) { - if (ok != 0) - *ok = TRUE; - return result; - } - - // If the default was not "C", try the "C" locale - if (def_locale.language() == TQLocale::C) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - - TQLocale c_locale(TQLocale::C); - return c_locale.d->stringToDouble(*this, ok, TQLocalePrivate::FailOnGroupSeparators); -} - -/*! - Returns the string converted to a \c float value. - - Returns 0.0 if the conversion fails. - - If \a ok is not 0: if a conversion error occurs, \a *ok is set to - FALSE; otherwise \a *ok is set to TRUE. - - For information on how string-to-number functions in TQString handle - localized input, see toDouble(). - - \warning If the string contains trailing whitespace this function - will fail, settings \a *ok to false if \a ok is not 0. - Leading whitespace is ignored. - - \sa number() -*/ - -#define TQT_MAX_FLOAT 3.4028234663852886e+38 - -float TQString::toFloat( bool *ok ) const -{ - bool myOk; - double d = toDouble(&myOk); - if (!myOk || d > TQT_MAX_FLOAT || d < -TQT_MAX_FLOAT) { - if (ok != 0) - *ok = FALSE; - return 0.0; - } - if (ok != 0) - *ok = TRUE; - return (float) d; -} - -/*! - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. The returned string is in "C" locale. - - The base is 10 by default and must be between 2 and 36. - - \code - TQString string; - string = string.setNum( 1234 ); // string == "1234" - \endcode -*/ - -TQString &TQString::setNum( TQ_LLONG n, int base ) -{ -#if defined(TQT_CHECK_RANGE) - if ( base < 2 || base > 36 ) { - qWarning( "TQString::setNum: Invalid base %d", base ); - base = 10; - } -#endif - TQLocale locale(TQLocale::C); - *this = locale.d->longLongToString(n, -1, base); - return *this; -} - -/*! - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -TQString &TQString::setNum( TQ_ULLONG n, int base ) -{ -#if defined(TQT_CHECK_RANGE) - if ( base < 2 || base > 36 ) { - qWarning( "TQString::setNum: Invalid base %d", base ); - base = 10; - } -#endif - TQLocale locale(TQLocale::C); - *this = locale.d->unsLongLongToString(n, -1, base); - return *this; -} - -/*! - \fn TQString &TQString::setNum( long n, int base ) - - \overload -*/ -// ### 4.0: inline -TQString &TQString::setNum( long n, int base ) -{ - return setNum( (TQ_LLONG)n, base ); -} - -/*! - \fn TQString &TQString::setNum( ulong n, int base ) - - \overload -*/ -// ### 4.0: inline -TQString &TQString::setNum( ulong n, int base ) -{ - return setNum( (TQ_ULLONG)n, base ); -} - -/*! - \fn TQString &TQString::setNum( int n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( uint n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( short n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \fn TQString &TQString::setNum( ushort n, int base ) - - \overload - - Sets the string to the printed value of \a n in base \a base and - returns a reference to the string. - - The base is 10 by default and must be between 2 and 36. -*/ - -/*! - \overload - - Sets the string to the printed value of \a n, formatted in format - \a f with precision \a prec, and returns a reference to the - string. - - The format \a f can be 'f', 'F', 'e', 'E', 'g' or 'G'. See \link - #arg-formats arg \endlink() for an explanation of the formats. -*/ - -TQString &TQString::setNum( double n, char f, int prec ) -{ - TQLocalePrivate::DoubleForm form = TQLocalePrivate::DFDecimal; - uint flags = 0; - - if (qIsUpper(f)) - flags = TQLocalePrivate::CapitalEorX; - f = qToLower(f); - - switch (f) { - case 'f': - form = TQLocalePrivate::DFDecimal; - break; - case 'e': - form = TQLocalePrivate::DFExponent; - break; - case 'g': - form = TQLocalePrivate::DFSignificantDigits; - break; - default: -#if defined(TQT_CHECK_RANGE) - qWarning( "TQString::setNum: Invalid format char '%c'", f ); -#endif - break; - } - - TQLocale locale(TQLocale::C); - *this = locale.d->doubleToString(n, prec, form, -1, flags); - return *this; -} - -/*! - \fn TQString &TQString::setNum( float n, char f, int prec ) - - \overload - - Sets the string to the printed value of \a n, formatted in format - \a f with precision \a prec, and returns a reference to the - string. - - The format \a f can be 'f', 'F', 'e', 'E', 'g' or 'G'. See \link - #arg-formats arg \endlink() for an explanation of the formats. -*/ - - -/*! - A convenience function that returns a string equivalent of the - number \a n to base \a base, which is 10 by default and must be - between 2 and 36. The returned string is in "C" locale. - - \code - long a = 63; - TQString str = TQString::number( a, 16 ); // str == "3f" - TQString str = TQString::number( a, 16 ).upper(); // str == "3F" - \endcode - - \sa setNum() -*/ -TQString TQString::number( long n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( ulong n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( TQ_LLONG n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( TQ_ULLONG n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - \sa setNum() -*/ -TQString TQString::number( int n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - A convenience factory function that returns a string - representation of the number \a n to the base \a base, which is 10 - by default and must be between 2 and 36. - - \sa setNum() -*/ -TQString TQString::number( uint n, int base ) -{ - TQString s; - s.setNum( n, base ); - return s; -} - -/*! - \overload - - Argument \a n is formatted according to the \a f format specified, - which is \c g by default, and can be any of the following: - - \table - \header \i Format \i Meaning - \row \i \c e \i format as [-]9.9e[+|-]999 - \row \i \c E \i format as [-]9.9E[+|-]999 - \row \i \c f \i format as [-]9.9 - \row \i \c g \i use \c e or \c f format, whichever is the most concise - \row \i \c G \i use \c E or \c f format, whichever is the most concise - \endtable - - With 'e', 'E', and 'f', \a prec is the number of digits after the - decimal point. With 'g' and 'G', \a prec is the maximum number of - significant digits (trailing zeroes are omitted). - - \code - double d = 12.34; - TQString ds = TQString( "'E' format, precision 3, gives %1" ) - .arg( d, 0, 'E', 3 ); - // ds == "1.234E+001" - \endcode - - \sa setNum() - */ -TQString TQString::number( double n, char f, int prec ) -{ - TQString s; - s.setNum( n, f, prec ); - return s; -} - - -/*! \obsolete - - Sets the character at position \a index to \a c and expands the - string if necessary, filling with spaces. - - This method is redundant in TQt 3.x, because operator[] will expand - the string as necessary. -*/ - -void TQString::setExpand( uint index, TQChar c ) -{ - int spaces = index - d->len; - at(index) = c; - while (spaces-->0) - d->tqunicode[--index]=' '; -} - - -/*! - \fn const char* TQString::data() const - - \obsolete - - Returns a pointer to a '\0'-terminated classic C string. - - In TQt 1.x, this returned a char* allowing direct manipulation of the - string as a sequence of bytes. In TQt 2.x where TQString is a Unicode - string, char* conversion constructs a temporary string, and hence - direct character operations are meaningless. -*/ - -/*! - \fn bool TQString::operator!() const - - Returns TRUE if this is a null string; otherwise returns FALSE. - - \code - TQString name = getName(); - if ( !name ) - name = "Rodney"; - \endcode - - Note that if you say - - \code - TQString name = getName(); - if ( name ) - doSomethingWith(name); - \endcode - - It will call "operator const char*()", which is inefficent; you - may wish to define the macro \c TQT_NO_ASCII_CAST when writing code - which you wish to remain Unicode-clean. - - When you want the above semantics, use: - - \code - TQString name = getName(); - if ( !name.isNull() ) - doSomethingWith(name); - \endcode - - \sa isEmpty() -*/ - - -/*! - \fn TQString& TQString::append( const TQString& str ) - - Appends \a str to the string and returns a reference to the - result. - - \code - string = "Test"; - string.append( "ing" ); // string == "Testing" - \endcode - - Equivalent to operator+=(). -*/ - -/*! - \fn TQString& TQString::append( char ch ) - - \overload - - Appends character \a ch to the string and returns a reference to - the result. - - Equivalent to operator+=(). -*/ - -/*! - \fn TQString& TQString::append( TQChar ch ) - - \overload - - Appends character \a ch to the string and returns a reference to - the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const TQByteArray &str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const std::string &str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! \fn TQString& TQString::append( const char *str ) - \overload - - Appends \a str to the string and returns a reference to the result. - - Equivalent to operator+=(). -*/ - -/*! - Appends \a str to the string and returns a reference to the string. -*/ -TQString& TQString::operator+=( const TQString &str ) -{ - uint len1 = length(); - uint len2 = str.length(); - if ( len2 ) { - if ( isEmpty() ) { - operator=( str ); - } else { - grow( len1+len2 ); - memcpy( d->tqunicode+len1, str.tqunicode(), sizeof(TQChar)*len2 ); - } - } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat: - *this = tqfromLatin1( "" ); - } - return *this; -} - -#ifndef TQT_NO_CAST_ASCII -TQString &TQString::operatorPlusEqHelper( const char *s, uint len2 ) -{ - if ( s ) { -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return operator+=( fromAscii( s, len2 ) ); -#endif - - uint len1 = length(); - if ( len2 == UINT_MAX ) - len2 = int(strlen( s )); - if ( len2 ) { - grow( len1 + len2 ); - TQChar* uc = d->tqunicode + len1; - while ( len2-- ) - *uc++ = *s++; - } else if ( isNull() ) { // ## just for 1.x compat: - *this = tqfromLatin1( "" ); - } - } - return *this; -} -#endif - -/*! - \overload - - Appends \a str to the string and returns a reference to the string. -*/ -#ifndef TQT_NO_CAST_ASCII -TQString& TQString::operator+=( const char *str ) -{ - // ### TQt 4: make this function inline - return operatorPlusEqHelper( str ); -} -#endif - -/*! \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( TQChar c ) -{ - grow( length()+1 ); - d->tqunicode[length()-1] = c; - return *this; -} - -/*! - \overload - - Appends \a c to the string and returns a reference to the string. -*/ - -TQString &TQString::operator+=( char c ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) - return operator+=( fromAscii( &c, 1 ) ); -#endif - grow( length()+1 ); - d->tqunicode[length()-1] = c; - return *this; -} - -/*! - \fn TQString &TQString::operator+=( const TQByteArray &str ) - \overload - - Appends \a str to the string and returns a reference to the string. -*/ - -/*! - \fn TQString &TQString::operator+=( const std::string &str ) - \overload - - Appends \a str to the string and returns a reference to the string. -*/ - -/*! - \fn char TQChar::latin1() const - - Returns the Latin-1 value of this character, or 0 if it - cannot be represented in Latin-1. -*/ - - -/*! - Returns a Latin-1 representation of the string. The - returned value is undefined if the string contains non-Latin-1 - characters. If you want to convert strings into formats other than - Unicode, see the TQTextCodec classes. - - This function is mainly useful for boot-strapping legacy code to - use Unicode. - - The result remains valid so long as one unmodified copy of the - source string exists. - - \sa tqfromLatin1(), ascii(), utf8(), local8Bit() -*/ -const char* TQString::latin1() const -{ - if ( !d->ascii || !d->islatin1 ) { - delete [] d->ascii; - d->ascii = tqunicodeToLatin1( d->tqunicode, d->len ); - d->islatin1 = TRUE; - } - return d->ascii; -} - -/*! - Returns an 8-bit ASCII representation of the string. - - If a codec has been set using TQTextCodec::codecForCStrings(), - it is used to convert Unicode to 8-bit char. Otherwise, this function - does the same as latin1(). - - \sa fromAscii(), latin1(), utf8(), local8Bit() -*/ -const char* TQString::ascii() const -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - if ( !d->ascii || d->islatin1 ) { - delete [] d->ascii; - if (d->tqunicode) { - TQCString s = TQTextCodec::codecForCStrings()->fromUnicode( *this ); - d->ascii = new char[s.length() + 1]; - memcpy(d->ascii, s.data(), s.length() + 1); - } else { - d->ascii = 0; - } - d->islatin1 = FALSE; - } - return d->ascii; - } -#endif // TQT_NO_TEXTCODEC - return latin1(); -} - -/*! - Returns the string encoded in UTF-8 format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. - - \sa fromUtf8(), ascii(), latin1(), local8Bit() -*/ -TQCString TQString::utf8() const -{ - int l = length(); - int rlen = l*3+1; - TQCString rstr(rlen); - uchar* cursor = (uchar*)rstr.data(); - const TQChar *ch = d->tqunicode; - for (int i=0; i < l; i++) { - uint u = ch->tqunicode(); - if ( u < 0x80 ) { - *cursor++ = (uchar)u; - } else { - if ( u < 0x0800 ) { - *cursor++ = 0xc0 | ((uchar) (u >> 6)); - } else { - if (u >= 0xd800 && u < 0xdc00 && i < l-1) { - unsigned short low = ch[1].tqunicode(); - if (low >= 0xdc00 && low < 0xe000) { - ++ch; - ++i; - u = (u - 0xd800)*0x400 + (low - 0xdc00) + 0x10000; - } - } - if (u > 0xffff) { - // if people are working in utf8, but strings are encoded in eg. latin1, the resulting - // name might be invalid utf8. This and the corresponding code in fromUtf8 takes care - // we can handle this without loosing information. This can happen with latin filenames - // and a utf8 locale under Unix. - if (u > 0x10fe00 && u < 0x10ff00) { - *cursor++ = (u - 0x10fe00); - ++ch; - continue; - } else { - *cursor++ = 0xf0 | ((uchar) (u >> 18)); - *cursor++ = 0x80 | ( ((uchar) (u >> 12)) & 0x3f); - } - } else { - *cursor++ = 0xe0 | ((uchar) (u >> 12)); - } - *cursor++ = 0x80 | ( ((uchar) (u >> 6)) & 0x3f); - } - *cursor++ = 0x80 | ((uchar) (u&0x3f)); - } - ++ch; - } - rstr.truncate( cursor - (uchar*)rstr.data() ); - return rstr; -} - -static TQChar *addOne(TQChar *qch, TQString &str) -{ - long sidx = qch - str.tqunicode(); - str.setLength(str.length()+1); - return (TQChar *)str.tqunicode() + sidx; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a utf8, ignoring the rest of \a utf8. If \a len is - -1 then the length of \a utf8 is used. If \a len is bigger than - the length of \a utf8 then it will use the length of \a utf8. - - \code - TQString str = TQString::fromUtf8( "123456789", 5 ); - // str == "12345" - \endcode - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromUtf8( const char* utf8, int len ) -{ - if ( !utf8 ) - return TQString::null; - - int slen = 0; - if (len >= 0) { - while (slen < len && utf8[slen]) - slen++; - } else { - slen = int(strlen(utf8)); - } - len = len < 0 ? slen : TQMIN(slen, len); - TQString result; - result.setLength( len ); // worst case - TQChar *qch = (TQChar *)result.tqunicode(); - uint uc = 0; - uint min_uc = 0; - int need = 0; - int error = -1; - uchar ch; - for (int i=0; i<len; i++) { - ch = utf8[i]; - if (need) { - if ( (ch&0xc0) == 0x80 ) { - uc = (uc << 6) | (ch & 0x3f); - need--; - if ( !need ) { - if (uc > 0xffff) { - // surrogate pair - uc -= 0x10000; - unsigned short high = uc/0x400 + 0xd800; - unsigned short low = uc%0x400 + 0xdc00; - *qch++ = TQChar(high); - *qch++ = TQChar(low); - } else if (uc < min_uc || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) { - // overlong seqence, UTF16 surrogate or BOM - i = error; - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } else { - *qch++ = uc; - } - } - } else { - // See TQString::utf8() for explanation. - // - // The surrogate below corresponds to a Unicode value of (0x10fe00+ch) which - // is in one of the private use areas of Unicode. - i = error; - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - need = 0; - } - } else { - if ( ch < 128 ) { - *qch++ = ch; - } else if ((ch & 0xe0) == 0xc0) { - uc = ch & 0x1f; - need = 1; - error = i; - min_uc = 0x80; - } else if ((ch & 0xf0) == 0xe0) { - uc = ch & 0x0f; - need = 2; - error = i; - min_uc = 0x800; - } else if ((ch&0xf8) == 0xf0) { - uc = ch & 0x07; - need = 3; - error = i; - min_uc = 0x10000; - } else { - // Error - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } - } - } - if (need) { - // we have some invalid characters remaining we need to add to the string - for (int i = error; i < len; ++i) { - qch = addOne(qch, result); - *qch++ = TQChar(0xdbff); - *qch++ = TQChar(0xde00+((uchar)utf8[i])); - } - } - - result.truncate( qch - result.tqunicode() ); - return result; -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a ascii, ignoring the rest of \a ascii. If \a len - is -1 then the length of \a ascii is used. If \a len is bigger - than the length of \a ascii then it will use the length of \a - ascii. - - If a codec has been set using TQTextCodec::codecForCStrings(), - it is used to convert the string from 8-bit characters to Unicode. - Otherwise, this function does the same as tqfromLatin1(). - - This is the same as the TQString(const char*) constructor, but you - can make that constructor invisible if you compile with the define - \c TQT_NO_CAST_ASCII, in which case you can explicitly create a - TQString from 8-bit ASCII text using this function. - - \code - TQString str = TQString::fromAscii( "123456789", 5 ); - // str == "12345" - \endcode - */ -TQString TQString::fromAscii( const char* ascii, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - if ( !ascii ) - return TQString::null; - if ( len < 0 ) - len = (int)strlen( ascii ); - if ( len == 0 || *ascii == '\0' ) - return TQString::tqfromLatin1( "" ); - return TQTextCodec::codecForCStrings()->toUnicode( ascii, len ); - } -#endif - return tqfromLatin1( ascii, len ); -} - - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a chars, ignoring the rest of \a chars. If \a len - is -1 then the length of \a chars is used. If \a len is bigger - than the length of \a chars then it will use the length of \a - chars. - - \sa fromAscii() -*/ -TQString TQString::tqfromLatin1( const char* chars, int len ) -{ - uint l; - TQChar *uc; - if ( len < 0 ) - len = -1; - uc = internalLatin1ToUnicode( chars, &l, len ); - return TQString( new TQStringData(uc, l, l), TRUE ); -} - -/*! - \fn const TQChar* TQString::tqunicode() const - - Returns the Unicode representation of the string. The result - remains valid until the string is modified. -*/ - -/*! - Returns the string encoded in a locale-specific format. On X11, - this is the TQTextCodec::codecForLocale(). On Windows, it is a - system-defined encoding. On Mac OS X, this always uses UTF-8 as - the encoding. - - See TQTextCodec for more diverse coding/decoding of Unicode - strings. - - \sa fromLocal8Bit(), ascii(), latin1(), utf8() -*/ - -TQCString TQString::local8Bit() const -{ -#ifdef TQT_NO_TEXTCODEC - return latin1(); -#else -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : TQCString(latin1()); -#endif -#if defined( TQ_WS_MACX ) - return utf8(); -#endif -#if defined( TQ_WS_MAC9 ) - return TQCString(latin1()); //I'm evil.. -#endif -#ifdef TQ_WS_WIN - return isNull() ? TQCString("") : qt_winTQString2MB( *this ); -#endif -#ifdef TQ_WS_TQWS - return utf8(); // ### if there is any 8 bit format supported? -#endif -#endif -} - -/*! - Returns the Unicode string decoded from the first \a len - bytes of \a local8Bit, ignoring the rest of \a local8Bit. If - \a len is -1 then the length of \a local8Bit is used. If \a len is - bigger than the length of \a local8Bit then it will use the length - of \a local8Bit. - - \code - TQString str = TQString::fromLocal8Bit( "123456789", 5 ); - // str == "12345" - \endcode - - \a local8Bit is assumed to be encoded in a locale-specific format. - - See TQTextCodec for more diverse coding/decoding of Unicode strings. -*/ -TQString TQString::fromLocal8Bit( const char* local8Bit, int len ) -{ -#ifdef TQT_NO_TEXTCODEC - return tqfromLatin1( local8Bit, len ); -#else - - if ( !local8Bit ) - return TQString::null; -#ifdef TQ_WS_X11 - TQTextCodec* codec = TQTextCodec::codecForLocale(); - if ( len < 0 ) - len = strlen( local8Bit ); - return codec - ? codec->toUnicode( local8Bit, len ) - : tqfromLatin1( local8Bit, len ); -#endif -#if defined( TQ_WS_MAC ) - return fromUtf8(local8Bit,len); -#endif -// Should this be OS_WIN32? -#ifdef TQ_WS_WIN - if ( len >= 0 ) { - TQCString s(local8Bit,len+1); - return qt_winMB2TQString(s); - } - return qt_winMB2TQString( local8Bit ); -#endif -#ifdef TQ_WS_TQWS - return fromUtf8(local8Bit,len); -#endif -#endif // TQT_NO_TEXTCODEC -} - -/*! - \fn TQString::operator const char *() const - - Returns ascii(). Be sure to see the warnings documented in the - ascii() function. Note that for new code which you wish to be - strictly Unicode-clean, you can define the macro \c - TQT_NO_ASCII_CAST when compiling your code to hide this function so - that automatic casts are not done. This has the added advantage - that you catch the programming error described in operator!(). -*/ - -/*! - \fn TQString::operator std::string() const - - Returns ascii() as a std::string. - - \warning The function may cause an application to crash if a static C run-time is in use. - This can happen in Microsoft Visual C++ if TQt is configured as single-threaded. A safe - alternative is to call ascii() directly and construct a std::string manually. -*/ - -/*! - Returns the TQString as a zero terminated array of unsigned shorts - if the string is not null; otherwise returns zero. - - The result remains valid so long as one unmodified - copy of the source string exists. -*/ -const unsigned short *TQString::ucs2() const -{ - if ( ! d->tqunicode ) - return 0; - unsigned int len = d->len; - if ( d->maxl < len + 1 ) { - // detach, grow or shrink - uint newMax = computeNewMax( len + 1 ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( nd ) { - if ( d->tqunicode ) - memcpy( nd, d->tqunicode, sizeof(TQChar)*len ); - ((TQString *)this)->deref(); - ((TQString *)this)->d = new TQStringData( nd, len, newMax ); - } - } - d->tqunicode[len] = 0; - return (unsigned short *) d->tqunicode; -} - -/*! - Constructs a string that is a deep copy of \a str, interpreted as a - UCS2 encoded, zero terminated, Unicode string. - - If \a str is 0, then a null string is created. - - \sa isNull() -*/ -TQString TQString::fromUcs2( const unsigned short *str ) -{ - if ( !str ) { - return TQString::null; - } else { - int length = 0; - while ( str[length] != 0 ) - length++; - TQChar* uc = TQT_ALLOC_TQCHAR_VEC( length ); - memcpy( uc, str, length*sizeof(TQChar) ); - return TQString( new TQStringData( uc, length, length ), TRUE ); - } -} - -/*! - \fn TQChar TQString::at( uint ) const - - Returns the character at index \a i, or 0 if \a i is beyond the - length of the string. - - \code - const TQString string( "abcdefgh" ); - TQChar ch = string.at( 4 ); - // ch == 'e' - \endcode - - If the TQString is not const (i.e. const TQString) or const& (i.e. - const TQString &), then the non-const overload of at() will be used - instead. -*/ - -/*! - \fn TQChar TQString::constref(uint i) const - - Returns the TQChar at index \a i by value. - - Equivalent to at(\a i). - - \sa ref() -*/ - -/*! - \fn TQChar& TQString::ref(uint i) - - Returns the TQChar at index \a i by reference, expanding the string - with TQChar::null if necessary. The resulting reference can be - assigned to, or otherwise used immediately, but becomes invalid - once furher modifications are made to the string. - - \code - TQString string("ABCDEF"); - TQChar ch = string.ref( 3 ); // ch == 'D' - \endcode - - \sa constref() -*/ - -/*! - \fn TQChar TQString::operator[]( int ) const - - Returns the character at index \a i, or TQChar::null if \a i is - beyond the length of the string. - - If the TQString is not const (i.e., const TQString) or const\& - (i.e., const TQString\&), then the non-const overload of operator[] - will be used instead. -*/ - -/*! - \fn TQCharRef TQString::operator[]( int ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::nulls, so that the TQCharRef references a - valid (null) character in the string. - - The TQCharRef internal class can be used much like a constant - TQChar, but if you assign to it, you change the original string - (which will detach itself because of TQString's copy-on-write - semantics). You will get compilation errors if you try to use the - result as anything but a TQChar. -*/ - -/*! - \fn TQCharRef TQString::at( uint i ) - - \overload - - The function returns a reference to the character at index \a i. - The resulting reference can then be assigned to, or used - immediately, but it will become invalid once further modifications - are made to the original string. - - If \a i is beyond the length of the string then the string is - expanded with TQChar::null. -*/ - -/* - Internal chunk of code to handle the - uncommon cases of at() above. -*/ -void TQString::subat( uint i ) -{ - uint olen = d->len; - if ( i >= olen ) { - setLength( i+1 ); // i is index; i+1 is needed length - for ( uint j=olen; j<=i; j++ ) - d->tqunicode[j] = TQChar::null; - } else { - // Just be sure to detach - real_detach(); - } -} - - -/*! - Resizes the string to \a len characters and copies \a tqunicode into - the string. If \a tqunicode is 0, nothing is copied, but the - string is still resized to \a len. If \a len is zero, then the - string becomes a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ - -TQString& TQString::setUnicode( const TQChar *tqunicode, uint len ) -{ - if ( len == 0 ) { // set to null string - if ( d != shared_null ) { // beware of nullstring being set to nullstring - deref(); - d = shared_null ? shared_null : makeSharedNull(); - d->ref(); - } - } else if ( d->count != 1 || len > d->maxl || - ( len * 4 < d->maxl && d->maxl > 4 ) ) { - // detach, grown or shrink - uint newMax = computeNewMax( len ); - TQChar* nd = TQT_ALLOC_TQCHAR_VEC( newMax ); - if ( tqunicode ) - memcpy( nd, tqunicode, sizeof(TQChar)*len ); - deref(); - d = new TQStringData( nd, len, newMax ); - } else { - d->len = len; - d->setDirty(); - if ( tqunicode ) - memcpy( d->tqunicode, tqunicode, sizeof(TQChar)*len ); - } - return *this; -} - -/*! - Resizes the string to \a len characters and copies \a - tqunicode_as_ushorts into the string (on some X11 client platforms - this will involve a byte-swapping pass). - - If \a tqunicode_as_ushorts is 0, nothing is copied, but the string - is still resized to \a len. If \a len is zero, the string becomes - a \link isNull() null\endlink string. - - \sa setLatin1(), isNull() -*/ -TQString& TQString::setUnicodeCodes( const ushort* tqunicode_as_ushorts, uint len ) -{ - return setUnicode((const TQChar*)tqunicode_as_ushorts, len); -} - - -/*! - Sets this string to \a str, interpreted as a classic 8-bit ASCII C - string. If \a len is -1 (the default), then it is set to - strlen(str). - - If \a str is 0 a null string is created. If \a str is "", an empty - string is created. - - \sa isNull(), isEmpty() -*/ - -TQString &TQString::setAscii( const char *str, int len ) -{ -#ifndef TQT_NO_TEXTCODEC - if ( TQTextCodec::codecForCStrings() ) { - *this = TQString::fromAscii( str, len ); - return *this; - } -#endif // TQT_NO_TEXTCODEC - return setLatin1( str, len ); -} - -/*! - Sets this string to \a str, interpreted as a classic Latin-1 C - string. If \a len is -1 (the default), then it is set to - strlen(str). - - If \a str is 0 a null string is created. If \a str is "", an empty - string is created. - - \sa isNull(), isEmpty() -*/ - -TQString &TQString::setLatin1( const char *str, int len ) -{ - if ( str == 0 ) - return setUnicode(0,0); - if ( len < 0 ) - len = int(strlen( str )); - if ( len == 0 ) { // won't make a null string - *this = TQString::tqfromLatin1( "" ); - } else { - setUnicode( 0, len ); // resize but not copy - TQChar *p = d->tqunicode; - while ( len-- ) - *p++ = *str++; - } - return *this; -} - -/*! \internal - */ -void TQString::checkSimpleText() const -{ - TQChar *p = d->tqunicode; - TQChar *end = p + d->len; - while ( p < end ) { - ushort uc = p->tqunicode(); - // sort out regions of complex text formatting - if ( uc > 0x058f && ( uc < 0x1100 || uc > 0xfb0f ) ) { - d->issimpletext = FALSE; - return; - } - p++; - } - d->issimpletext = TRUE; -} - -/*! \fn bool TQString::simpleText() const - \internal -*/ - -/*! \internal - */ -bool TQString::isRightToLeft() const -{ - int len = length(); - TQChar *p = d->tqunicode; - while ( len-- ) { - switch( ::direction( *p ) ) - { - case TQChar::DirL: - case TQChar::DirLRO: - case TQChar::DirLRE: - return FALSE; - case TQChar::DirR: - case TQChar::DirAL: - case TQChar::DirRLO: - case TQChar::DirRLE: - return TRUE; - default: - break; - } - ++p; - } - return FALSE; -} - - -/*! - \fn int TQString::compare( const TQString & s1, const TQString & s2 ) - - Lexically compares \a s1 with \a s2 and returns an integer less - than, equal to, or greater than zero if \a s1 is less than, equal - to, or greater than \a s2. - - The comparison is based exclusively on the numeric Unicode values - of the characters and is very fast, but is not what a human would - expect. Consider sorting user-interface strings with - TQString::localeAwareCompare(). - - \code - int a = TQString::compare( "def", "abc" ); // a > 0 - int b = TQString::compare( "abc", "def" ); // b < 0 - int c = TQString::compare( "abc", "abc" ); // c == 0 - \endcode -*/ - -/*! - \overload - - Lexically compares this string with \a s and returns an integer - less than, equal to, or greater than zero if it is less than, equal - to, or greater than \a s. -*/ -int TQString::compare( const TQString& s ) const -{ - return ucstrcmp( *this, s ); -} - -/*! - \fn int TQString::localeAwareCompare( const TQString & s1, const TQString & s2 ) - - Compares \a s1 with \a s2 and returns an integer less than, equal - to, or greater than zero if \a s1 is less than, equal to, or - greater than \a s2. - - The comparison is performed in a locale- and also - platform-dependent manner. Use this function to present sorted - lists of strings to the user. - - \sa TQString::compare() TQTextCodec::locale() -*/ - -/*! - \overload - - Compares this string with \a s. -*/ - -#if !defined(CSTR_LESS_THAN) -#define CSTR_LESS_THAN 1 -#define CSTR_ETQUAL 2 -#define CSTR_GREATER_THAN 3 -#endif - -int TQString::localeAwareCompare( const TQString& s ) const -{ - // do the right thing for null and empty - if ( isEmpty() || s.isEmpty() ) - return compare( s ); - -#if defined(TQ_WS_WIN) - int res; - TQT_WA( { - const TCHAR* s1 = (TCHAR*)ucs2(); - const TCHAR* s2 = (TCHAR*)s.ucs2(); - res = CompareStringW( LOCALE_USER_DEFAULT, 0, s1, length(), s2, s.length() ); - } , { - TQCString s1 = local8Bit(); - TQCString s2 = s.local8Bit(); - res = CompareStringA( LOCALE_USER_DEFAULT, 0, s1.data(), s1.length(), s2.data(), s2.length() ); - } ); - - switch ( res ) { - case CSTR_LESS_THAN: - return -1; - case CSTR_GREATER_THAN: - return 1; - default: - return 0; - } -#elif defined(TQ_WS_MACX) - int delta = 0; -#if !defined(TQT_NO_TEXTCODEC) - TQTextCodec *codec = TQTextCodec::codecForLocale(); - if (codec) - delta = strcoll(codec->fromUnicode(*this), codec->fromUnicode(s)); - if (delta == 0) -#endif - delta = ucstrcmp(*this, s); - return delta; -#elif defined(TQ_WS_X11) - // declared in <string.h> - int delta = strcoll( local8Bit(), s.local8Bit() ); - if ( delta == 0 ) - delta = ucstrcmp( *this, s ); - return delta; -#else - return ucstrcmp( *this, s ); -#endif -} - -bool operator==( const TQString &s1, const TQString &s2 ) -{ - if ( s1.tqunicode() == s2.tqunicode() ) - return TRUE; - return (s1.length() == s2.length()) && s1.isNull() == s2.isNull() && - (memcmp((char*)s1.tqunicode(),(char*)s2.tqunicode(), - s1.length()*sizeof(TQChar)) == 0 ); -} - -bool operator!=( const TQString &s1, const TQString &s2 ) -{ return !(s1==s2); } - -bool operator<( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<=( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator>( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>=( const TQString &s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - - -bool operator==( const TQString &s1, const char *s2 ) -{ - if ( !s2 ) - return s1.isNull(); - - int len = s1.length(); - const TQChar *uc = s1.tqunicode(); - while ( len ) { - if ( !(*s2) || uc->tqunicode() != (uchar) *s2 ) - return FALSE; - ++uc; - ++s2; - --len; - } - return !*s2; -} - -bool operator==( const char *s1, const TQString &s2 ) -{ return (s2 == s1); } - -bool operator!=( const TQString &s1, const char *s2 ) -{ return !(s1==s2); } - -bool operator!=( const char *s1, const TQString &s2 ) -{ return !(s1==s2); } - -bool operator<( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) < 0; } - -bool operator<=( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator<=( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) <= 0; } - -bool operator>( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) > 0; } - -bool operator>=( const TQString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - -bool operator>=( const char *s1, const TQString &s2 ) -{ return ucstrcmp(s1,s2) >= 0; } - - -/***************************************************************************** - Documentation for TQString related functions - *****************************************************************************/ - -/*! - \fn bool operator==( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator==( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator==( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) == 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator!=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is not equal to \a s2; otherwise returns FALSE. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) != 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator<( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically less than \a s2; otherwise returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically less than \a s2; otherwise returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \< 0. -*/ - -/*! - \fn bool operator<=( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically less than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1,\a s2) \<= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator<=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically less than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \<= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator>( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically greater than \a s2; otherwise - returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically greater than \a s2; otherwise - returns FALSE. - The comparison is case sensitive. - - Equivalent to compare(\a s1, \a s2) \> 0. -*/ - -/*! - \fn bool operator>=( const TQString &s1, const char *s2 ) - - \relates TQString - - Returns TRUE if \a s1 is lexically greater than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \>= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn bool operator>=( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns TRUE if \a s1 is lexically greater than or equal to \a s2; - otherwise returns FALSE. - The comparison is case sensitive. - Note that a null string is not equal to a not-null empty string. - - Equivalent to compare(\a s1, \a s2) \>= 0. - - \sa isNull(), isEmpty() -*/ - -/*! - \fn const TQString operator+( const TQString &s1, const TQString &s2 ) - - \relates TQString - - Returns a string which is the result of concatenating the string - \a s1 and the string \a s2. - - Equivalent to \a {s1}.append(\a s2). -*/ - -/*! - \fn const TQString operator+( const TQString &s1, const char *s2 ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the string - \a s1 and character \a s2. - - Equivalent to \a {s1}.append(\a s2). -*/ - -/*! - \fn const TQString operator+( const char *s1, const TQString &s2 ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the - character \a s1 and string \a s2. -*/ - -/*! - \fn const TQString operator+( const TQString &s, char c ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the string - \a s and character \a c. - - Equivalent to \a {s}.append(\a c). -*/ - -/*! - \fn const TQString operator+( char c, const TQString &s ) - - \overload - \relates TQString - - Returns a string which is the result of concatenating the - character \a c and string \a s. - - Equivalent to \a {s}.prepend(\a c). -*/ - - -/***************************************************************************** - TQString stream functions - *****************************************************************************/ -#ifndef TQT_NO_DATASTREAM -/*! - \relates TQString - - Writes the string \a str to the stream \a s. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator<<( TQDataStream &s, const TQString &str ) -{ - if ( s.version() == 1 ) { - TQCString l( str.latin1() ); - s << l; - } - else { - int byteOrder = s.byteOrder(); - const TQChar* ub = str.tqunicode(); - if ( ub || s.version() < 3 ) { - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( str.length()*sizeof(TQChar) > auto_size ) { - b = new char[str.length()*sizeof(TQChar)]; - } else { - b = t; - } - int l = str.length(); - char *c=b; - while ( l-- ) { - if ( byteOrder == TQDataStream::BigEndian ) { - *c++ = (char)ub->row(); - *c++ = (char)ub->cell(); - } else { - *c++ = (char)ub->cell(); - *c++ = (char)ub->row(); - } - ub++; - } - s.writeBytes( b, sizeof(TQChar)*str.length() ); - if ( str.length()*sizeof(TQChar) > auto_size ) - delete [] b; - } else { - // write null marker - s << (TQ_UINT32)0xffffffff; - } - } - return s; -} - -/*! - \relates TQString - - Reads a string from the stream \a s into string \a str. - - See also \link datastreamformat.html Format of the TQDataStream operators \endlink -*/ - -TQDataStream &operator>>( TQDataStream &s, TQString &str ) -{ -#ifdef TQT_TQSTRING_UCS_4 -#if defined(TQ_CC_GNU) -#warning "operator>> not working properly" -#endif -#endif - if ( s.version() == 1 ) { - TQCString l; - s >> l; - str = TQString( l ); - } - else { - TQ_UINT32 bytes = 0; - s >> bytes; // read size of string - if ( bytes == 0xffffffff ) { // null string - str = TQString::null; - } else if ( bytes > 0 ) { // not empty - int byteOrder = s.byteOrder(); - str.setLength( bytes/2 ); - TQChar* ch = str.d->tqunicode; - static const uint auto_size = 1024; - char t[auto_size]; - char *b; - if ( bytes > auto_size ) { - b = new char[bytes]; - } else { - b = t; - } - s.readRawBytes( b, bytes ); - int bt = bytes/2; - char *oldb = b; - while ( bt-- ) { - if ( byteOrder == TQDataStream::BigEndian ) - *ch++ = (ushort) (((ushort)b[0])<<8) | (uchar)b[1]; - else - *ch++ = (ushort) (((ushort)b[1])<<8) | (uchar)b[0]; - b += 2; - } - if ( bytes > auto_size ) - delete [] oldb; - } else { - str = ""; - } - } - return s; -} -#endif // TQT_NO_DATASTREAM - -/***************************************************************************** - TQConstString member functions - *****************************************************************************/ - -/*! - \class TQConstString tqstring.h - \reentrant - \ingroup text - \brief The TQConstString class provides string objects using constant Unicode data. - - In order to minimize copying, highly optimized applications can - use TQConstString to provide a TQString-compatible object from - existing Unicode data. It is then the programmer's responsibility - to ensure that the Unicode data exists for the entire lifetime of - the TQConstString object. - - A TQConstString is created with the TQConstString constructor. The - string held by the object can be obtained by calling string(). -*/ - -/*! - Constructs a TQConstString that uses the first \a length Unicode - characters in the array \a tqunicode. Any attempt to modify copies - of the string will cause it to create a copy of the data, thus it - remains forever unmodified. - - The data in \a tqunicode is not copied. The caller must be able to - guarantee that \a tqunicode will not be deleted or modified. -*/ -TQConstString::TQConstString( const TQChar* tqunicode, uint length ) : - TQString( new TQStringData( (TQChar*)tqunicode, length, length ), TRUE ) -{ -} - -/*! - Destroys the TQConstString, creating a copy of the data if other - strings are still using it. -*/ -TQConstString::~TQConstString() -{ - if ( d->count > 1 ) { - TQChar* cp = TQT_ALLOC_TQCHAR_VEC( d->len ); - memcpy( cp, d->tqunicode, d->len*sizeof(TQChar) ); - d->tqunicode = cp; - } else { - d->tqunicode = 0; - } - - // The original d->tqunicode is now unlinked. -} - -/*! - \fn const TQString& TQConstString::string() const - - Returns a constant string referencing the data passed during - construction. -*/ - -/*! - Returns TRUE if the string starts with \a s; otherwise returns - FALSE. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString str( "Bananas" ); - str.startsWith( "Ban" ); // returns TRUE - str.startsWith( "Car" ); // returns FALSE - \endcode - - \sa endsWith() -*/ -bool TQString::startsWith( const TQString& s, bool cs ) const -{ - if ( isNull() ) - return s.isNull(); - if ( s.length() > length() ) - return FALSE; - if ( cs ) { - return memcmp((char*)d->tqunicode, (char*)s.d->tqunicode, s.length()*sizeof(TQChar)) == 0; - } else { - for ( int i = 0; i < (int) s.length(); i++ ) { - if ( ::lower(d->tqunicode[i]) != ::lower(s.d->tqunicode[i]) ) - return FALSE; - } - } - return TRUE; -} - -bool TQString::startsWith( const TQString& s ) const -{ - return startsWith( s, TRUE ); -} - -/*! - Returns TRUE if the string ends with \a s; otherwise returns - FALSE. - - If \a cs is TRUE (the default), the search is case sensitive; - otherwise the search is case insensitive. - - \code - TQString str( "Bananas" ); - str.endsWith( "anas" ); // returns TRUE - str.endsWith( "pple" ); // returns FALSE - \endcode - - \sa startsWith() -*/ -bool TQString::endsWith( const TQString& s, bool cs ) const -{ - if ( isNull() ) - return s.isNull(); - int pos = length() - s.length(); - if ( pos < 0 ) - return FALSE; - if ( cs ) { - return memcmp((char*)&d->tqunicode[pos], (char*)s.d->tqunicode, s.length()*sizeof(TQChar)) == 0; - } else { - for ( int i = 0; i < (int) s.length(); i++ ) { - if ( ::lower(d->tqunicode[pos + i]) != ::lower(s.d->tqunicode[i]) ) - return FALSE; - } - } - return TRUE; -} - -bool TQString::endsWith( const TQString& s ) const -{ - return endsWith( s, TRUE ); -} - -/*! \fn void TQString::detach() - If the string does not share its data with another TQString instance, - nothing happens; otherwise the function creates a new, unique copy of - this string. This function is called whenever the string is modified. The - implicit sharing mechanism is implemented this way. -*/ - -#if defined(TQ_OS_WIN32) - -#include <windows.h> - -/*! - \obsolete - - Returns a static Windows TCHAR* from a TQString, adding NUL if \a - addnul is TRUE. - - The lifetime of the return value is until the next call to this function, - or until the last copy of str is deleted, whatever comes first. - - Use ucs2() instead. -*/ -const void* qt_winTchar(const TQString& str, bool) -{ - // So that the return value lives long enough. - static TQString str_cache; - str_cache = str; -#ifdef UNICODE - return str_cache.ucs2(); -#else - return str_cache.latin1(); -#endif -} - -/*! - Makes a new '\0'-terminated Windows TCHAR* from a TQString. -*/ -void* qt_winTchar_new(const TQString& str) -{ - if ( str.isNull() ) - return 0; - int l = str.length()+1; - TCHAR *tc = new TCHAR[ l ]; -#ifdef UNICODE - memcpy( tc, str.ucs2(), sizeof(TCHAR)*l ); -#else - memcpy( tc, str.latin1(), sizeof(TCHAR)*l ); -#endif - return tc; -} - -/*! - Makes a TQString from a Windows TCHAR*. -*/ -TQString qt_winTQString(void* tc) -{ -#ifdef UNICODE - return TQString::fromUcs2( (ushort*)tc ); -#else - return TQString::tqfromLatin1( (TCHAR *)tc ); -#endif -} - -TQCString qt_winTQString2MB( const TQString& s, int uclen ) -{ - if ( uclen < 0 ) - uclen = s.length(); - if ( s.isNull() ) - return TQCString(); - if ( uclen == 0 ) - return TQCString(""); - BOOL used_def; - TQCString mb(4096); - int len; - while ( !(len=WideCharToMultiByte(CP_ACP, 0, (const WCHAR*)s.tqunicode(), uclen, - mb.data(), mb.size()-1, 0, &used_def)) ) - { - int r = GetLastError(); - if ( r == ERROR_INSUFFICIENT_BUFFER ) { - mb.resize(1+WideCharToMultiByte( CP_ACP, 0, - (const WCHAR*)s.tqunicode(), uclen, - 0, 0, 0, &used_def)); - // and try again... - } else { -#ifndef TQT_NO_DEBUG - // Fail. - qWarning("WideCharToMultiByte cannot convert multibyte text (error %d): %s (UTF8)", - r, s.utf8().data()); -#endif - break; - } - } - mb[len]='\0'; - return mb; -} - -// WATCH OUT: mblen must include the NUL (or just use -1) -TQString qt_winMB2TQString( const char* mb, int mblen ) -{ - if ( !mb || !mblen ) - return TQString::null; - const int wclen_auto = 4096; - WCHAR wc_auto[wclen_auto]; - int wclen = wclen_auto; - WCHAR *wc = wc_auto; - int len; - while ( !(len=MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, - mb, mblen, wc, wclen )) ) - { - int r = GetLastError(); - if ( r == ERROR_INSUFFICIENT_BUFFER ) { - if ( wc != wc_auto ) { - qWarning("Size changed in MultiByteToWideChar"); - break; - } else { - wclen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, - mb, mblen, 0, 0 ); - wc = new WCHAR[wclen]; - // and try again... - } - } else { - // Fail. - qWarning("MultiByteToWideChar cannot convert multibyte text"); - break; - } - } - if ( len <= 0 ) - return TQString::null; - TQString s( (TQChar*)wc, len - 1 ); // len - 1: we don't want terminator - if ( wc != wc_auto ) - delete [] wc; - return s; -} - -#endif // TQ_OS_WIN32 - -#endif // USE_QT4 |