From: "Сукиязов Сергей Александрович" <corwin@micom.don.ru> To: kde-russian@lists.kde.ru Subject: [kde-russian] Патчи для qt3. Проблемы с преобразованием Date: Fri, 15 Mar 2002 13:00:09 +0300 Message-ID: <200203150959.g2F9xIY07465@ns.micom.don.ru> (raw) [-- Attachment #1: Type: text/plain, Size: 2980 bytes --] Привет Я сделал патчи которые меняют поведение класса QString при преобразовании из char * <--> QString. Проблемы возникают когда используется преобразование по умолчанию, т.е. конструктор QString(const char *) и т.п. О всех нюансах я писал в своей статье "Использование Qt-2.2.x в русскоязычных программах " (http://www.kde.ru/docs.php?action=show&id=qt_russian). К сожалению избежать бинарной несовмесимости не удалось :((( Несовместимость возникает из-за того что некоторые изменяемые методы реализованны как inline. Сейчас Тролли согласились рассмотреть эти замечания, и я надеюсь поведение конструкторов QString всё-таки изменится (наверное в версии 3.1 или 4.0). Если у кого есть желание и время потестируйте эти патчи. Я договорился с Троллями что на следующей неделе (где-то во вторник - среду) отправлю им патчи. Так что, если у кого есть какие-нибудь замечания или дополнения я жду :))))) Патчи накладываются в порядке указанном как 'step.x'. Краткое описание: qt-x11-free-3.0.2-0004-step.0.diff ---------------------------------------------- Этот патч убирает зависимость между классами QTextCodec и конструкторами QString изпользуемыми для преобазования char * <--> QString. В противном случае, т.к. мы в конструкторах будем использовать QTextCodec, будут возникать "мертвые циклы" (death loops) [Конструктор QString] -> [Метод QTextCodec] -> [Конструктор QString] -> .... qt-x11-free-3.0.2-0004-step.1.diff ---------------------------------------------- Этот патч приводит в соответствие поведение метода QTextCodec::toUnicode в соответствие с поведением конструкторов QString отвечающих за преобразование char * <--> QString. Дело в том что оригинальное поведение выглядит след. образом: - QString str(0) или QString str - создают строку str для которой выполняют- ся условия: str.isNull() == TRUE и str.isEmpty() == TRUE. - str = QTextCodec::toUnicode(0,...) - создают строку str для которой выпол- няются условия: str.isNull() == TRUE и str.isEmpty() == TRUE. В этой части поведение совпадает. - QString str("") - создают строку str для которой выполняются условия: str.isNull() == FALSE и str.isEmpty() == TRUE. - str = QTextCodec::toUnicode("",...) - создают строку str для которой выпол- няются условия: str.isNull() == TRUE и str.isEmpty() == TRUE. В этой части поведение не совпадает. qt-x11-free-3.0.2-0004-step.2.diff ---------------------------------------------- Этот патч изменяет поведение конструкторов класса QString. После применения этого патча преобразование char * <--> QString выполняется с помощью колека для установок локали. qt-x11-free-3.0.2-0004-step.3.diff ---------------------------------------------- Этот патч испавляет все остальные методы и конструкторы, в т.ч. и для класса QChar. Этот патч вносит бинарную несовместимость, из-за того что некоторые методы сделаны как inline. -- С Уважением Сукиязов Сергей [-- Attachment #2: qt-x11-free-3.0.2-0004-step.3.diff --] [-- Type: text/x-diff, Size: 11367 bytes --] diff -Naur qt-x11-free-3.0.2.orig/src/tools/qstring.cpp qt-x11-free-3.0.2/src/tools/qstring.cpp --- qt-x11-free-3.0.2.orig/src/tools/qstring.cpp Tue Mar 12 20:11:56 2002 +++ qt-x11-free-3.0.2/src/tools/qstring.cpp Tue Mar 12 20:18:00 2002 @@ -11521,12 +11521,42 @@ Constructs a QChar corresponding to ASCII/Latin1 character \a c. */ +QChar::QChar( char c ) +{ +#ifdef QT_NO_TEXTCODEC + ucs = (uchar)c; +#else + if ( (uchar)c > 127 ) { // Not US-ASCII character we should use TextCodec + ucs = QString::fromLocal8Bit( (const char *) & c, 1 ).at(0).unicode(); + } + else + ucs = (uchar)c; // For US-ASCII character simple assignment +#endif // QT_NO_TEXTCODEC +#ifdef QT_QSTRING_UCS_4 + grp = 0; +#endif +} /*! \fn QChar::QChar( uchar c ) Constructs a QChar corresponding to ASCII/Latin1 character \a c. */ +QChar::QChar( uchar c ) +{ +#ifdef QT_NO_TEXTCODEC + ucs = c; +#else + if ( c > 127 ) { // Not US-ASCII character we should use TextCodec + ucs = QString::fromLocal8Bit( (const char *) & c, 1 ).at(0).unicode(); + } + else + ucs = c; // For US-ASCII character simple assignment +#endif // QT_NO_TEXTCODEC +#ifdef QT_QSTRING_UCS_4 + grp = 0; +#endif +} /*! \fn QChar::QChar( uchar c, uchar r ) @@ -12277,8 +12307,11 @@ QChar *result = uc; if ( len ) *len = l; - while (l--) - *uc++ = *str++; + while (l--) { + uc->setCell( *str++ ); + uc->setRow( 0 ); + *uc++; + } return result; } @@ -12296,8 +12329,11 @@ QChar *result = uc; if ( len ) *len = l; - while (l--) - *uc++ = *str++; + while (l--) { + uc->setCell( *str++ ); + uc->setRow( 0 ); + *uc++; + } return result; } @@ -12325,8 +12361,11 @@ QChar *uc = new QChar[ l ]; // Can't use macro since function is public result = uc; uint i = l; - while ( i-- ) - *uc++ = *str++; + while (i--) { + uc->setCell( *str++ ); + uc->setRow( 0 ); + *uc++; + } } if ( len ) *len = l; @@ -12349,8 +12388,11 @@ QChar *uc = QT_ALLOC_QCHAR_VEC( l ); result = uc; uint i = l; - while ( i-- ) - *uc++ = *str++; + while (i--) { + uc->setCell( *str++ ); + uc->setRow( 0 ); + *uc++; + } } if ( len ) *len = l; @@ -12368,6 +12410,7 @@ if (!uc) { return 0; } +#ifdef QT_NO_TEXTCODEC char *a = new char[l+1]; char *result = a; while (l--) { @@ -12377,6 +12420,9 @@ } *a = '\0'; return result; +#else + return qstrdup(QString(uc,l).local8Bit().data()); +#endif // QT_NO_TEXTCODEC } /***************************************************************************** @@ -12704,7 +12750,7 @@ void QString::deref() { - if ( d->deref() ) { + if ( d && d->deref() ) { if ( d == shared_null ) shared_null = 0; delete d; @@ -12750,7 +12796,7 @@ */ QString &QString::operator=( const QCString& cs ) { - return setLatin1(cs); + return setLatin1(cs.data()); } @@ -15271,6 +15317,17 @@ Returns a latin-1 copy of this character, if this character is in the latin-1 character set. If not, this function returns 0. */ +char QChar::latin1() const +{ +#ifdef QT_NO_TEXTCODEC + return ucs > 0xff ? 0 : (char) ucs; +#else + if ( ucs > 0xff ) { // Non ISO-8859-1 character we should use TextCodec + return QString(*this).local8Bit().at(0); + } + return (char) ucs; +#endif // QT_NO_TEXTCODEC +} /*! @@ -15292,7 +15349,11 @@ if ( !d->ascii ) { Q2HELPER(stat_get_ascii++) Q2HELPER(stat_get_ascii_size+=d->len) +#ifdef QT_NO_TEXTCODEC d->ascii = unicodeToAscii( d->unicode, d->len ); +#else + if( d->unicode ) d->ascii = qstrdup(local8Bit().data()); +#endif } return d->ascii; } @@ -15315,9 +15376,8 @@ QCString QString::utf8() const { static QTextCodec* codec = QTextCodec::codecForMib(106); - return codec - ? codec->fromUnicode(*this) - : QCString(latin1()); + if ( !codec ) codec = QTextCodec::codecForMib(4); // Use ISO-8859-1 codec + return codec->fromUnicode(*this); } /*! @@ -15337,7 +15397,8 @@ { static QTextCodec* codec = QTextCodec::codecForMib( 106 ); if ( len < 0 ) len = qstrlen( utf8 ); - return codec ? codec->toUnicode( utf8, len ) : fromLatin1( utf8, len ); + if ( !codec ) codec = QTextCodec::codecForMib(4); // Use ISO-8859-1 codec + return codec->toUnicode( utf8, len ); } #endif // QT_NO_TEXTCODEC @@ -15360,6 +15421,7 @@ */ QString QString::fromLatin1( const char* chars, int len ) { +#ifdef QT_NO_TEXTCODEC uint l; QChar *uc; if ( len < 0 ) { @@ -15368,6 +15430,9 @@ uc = internalAsciiToUnicode( chars, &l, len ); } return QString( new QStringData(uc, l, l), TRUE ); +#else + return QString::fromLocal8Bit( chars, len ); +#endif // QT_NO_TEXTCODEC } /*! @@ -15393,24 +15458,18 @@ #ifdef QT_NO_TEXTCODEC return latin1(); #else -#ifdef Q_WS_X11 - QTextCodec* codec = QTextCodec::codecForLocale(); - return codec - ? codec->fromUnicode(*this) - : QCString(latin1()); -#endif -#if defined( Q_WS_MACX ) - return utf8(); +#if defined( Q_WS_X11 ) || defined( Q_WS_MACX ) || defined( Q_WS_QWS ) +#if defined( Q_WS_MACX ) || defined( Q_WS_QWS ) + static QTextCodec *codec = QTextCodec::codecForMib(106); // Use UTF8 codec +#else + static QTextCodec* codec = QTextCodec::codecForLocale(); #endif -#if defined( Q_WS_MAC9 ) - return QCString(latin1()); //I'm evil.. + if ( !codec ) codec = QTextCodec::codecForMib(4); // Use ISO-8859-1 codec + return codec->fromUnicode(*this); #endif #ifdef Q_WS_WIN return qt_winQString2MB( *this ); #endif -#ifdef Q_WS_QWS - return utf8(); // ##### if there is ANY 8 bit format supported? -#endif #endif } @@ -15437,15 +15496,15 @@ if ( !local8Bit ) return QString::null; -#ifdef Q_WS_X11 - QTextCodec* codec = QTextCodec::codecForLocale(); - if ( len < 0 ) len = qstrlen(local8Bit); - return codec - ? codec->toUnicode( local8Bit, len ) - : fromLatin1( local8Bit, len ); +#if defined( Q_WS_X11 ) || defined( Q_WS_MAC ) || defined( Q_WS_QWS ) +#if defined( Q_WS_MAC ) || defined( Q_WS_QWS ) + static QTextCodec *codec = QTextCodec::codecForMib(106); // Use UTF8 codec +#else + static QTextCodec* codec = QTextCodec::codecForLocale(); #endif -#if defined( Q_WS_MAC ) - return fromUtf8(local8Bit,len); + if ( len < 0 ) len = qstrlen(local8Bit); + if ( !codec ) codec = QTextCodec::codecForMib(4); // Use ISO-8859-1 codec + return codec->toUnicode( local8Bit, len ); #endif // Should this be OS_WIN32? #ifdef Q_WS_WIN @@ -15455,9 +15514,6 @@ } return qt_winMB2QString( local8Bit ); #endif -#ifdef Q_WS_QWS - return fromUtf8(local8Bit,len); -#endif #endif // QT_NO_TEXTCODEC } @@ -15659,10 +15715,17 @@ if ( len == 0 ) { // won't make a null string *this = QString::fromLatin1( "" ); } else { +#ifdef QT_NO_TEXTCODEC setUnicode( 0, len ); // resize but not copy QChar *p = d->unicode; while ( len-- ) *p++ = *str++; +#else + QString tmp( QString::fromLocal8Bit( str ) ); + tmp.d->ref(); + deref(); + d = tmp.d; +#endif // QT_NO_TEXTCODEC } return *this; } @@ -15845,22 +15908,7 @@ bool operator==( const QString &s1, const char *s2 ) -{ - if ( !s2 ) - return s1.isNull(); - - int len = s1.length(); - const QChar *uc = s1.unicode(); - while( len ) { - if ( !(*s2) || uc->unicode() != *s2 ) { - break; - } - ++uc; - ++s2; - --len; - } - return (len ? FALSE : (*s2) ? FALSE : TRUE); -} +{ return (s1 == QString::fromLocal8Bit(s2)); } bool operator==( const char *s1, const QString &s2 ) { return (s2 == s1 ); } @@ -15872,28 +15920,28 @@ { return !(s1==s2); } bool operator<( const QString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) < 0; } +{ return ucstrcmp(s1,QString::fromLocal8Bit(s2)) < 0; } bool operator<( const char *s1, const QString &s2 ) -{ return ucstrcmp(s1,s2) < 0; } +{ return ucstrcmp(QString::fromLocal8Bit(s1),s2) < 0; } bool operator<=( const QString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) <= 0; } +{ return ucstrcmp(s1,QString::fromLocal8Bit(s2)) <= 0; } bool operator<=( const char *s1, const QString &s2 ) -{ return ucstrcmp(s1,s2) <= 0; } +{ return ucstrcmp(QString::fromLocal8Bit(s1),s2) <= 0; } bool operator>( const QString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) > 0; } +{ return ucstrcmp(s1,QString::fromLocal8Bit(s2)) > 0; } bool operator>( const char *s1, const QString &s2 ) -{ return ucstrcmp(s1,s2) > 0; } +{ return ucstrcmp(QString::fromLocal8Bit(s1),s2) > 0; } bool operator>=( const QString &s1, const char *s2 ) -{ return ucstrcmp(s1,s2) >= 0; } +{ return ucstrcmp(s1,QString::fromLocal8Bit(s2)) >= 0; } bool operator>=( const char *s1, const QString &s2 ) -{ return ucstrcmp(s1,s2) >= 0; } +{ return ucstrcmp(QString::fromLocal8Bit(s1),s2) >= 0; } /***************************************************************************** @@ -16108,7 +16156,7 @@ QDataStream &operator<<( QDataStream &s, const QString &str ) { if ( s.version() == 1 ) { - QCString l( str.latin1() ); + QCString l( str.local8Bit() ); s << l; } else { @@ -16163,7 +16211,7 @@ if ( s.version() == 1 ) { QCString l; s >> l; - str = QString( l ); + str = QString::fromLocal8Bit( l ); } else { Q_UINT32 bytes; diff -Naur qt-x11-free-3.0.2.orig/src/tools/qstring.h qt-x11-free-3.0.2/src/tools/qstring.h --- qt-x11-free-3.0.2.orig/src/tools/qstring.h Mon Feb 18 15:46:57 2002 +++ qt-x11-free-3.0.2/src/tools/qstring.h Tue Mar 12 20:18:00 2002 @@ -173,7 +173,7 @@ Decomposition decompositionTag() const; unsigned char combiningClass() const; - char latin1() const { return ucs > 0xff ? 0 : (char) ucs; } + char latin1() const; ushort unicode() const { return ucs; } ushort &unicode() { return ucs; } #ifndef QT_NO_CAST_ASCII @@ -225,20 +225,6 @@ grp = 0; #endif } -inline QChar::QChar( char c ) -{ - ucs = (uchar)c; -#ifdef QT_QSTRING_UCS_4 - grp = 0; -#endif -} -inline QChar::QChar( uchar c ) -{ - ucs = c; -#ifdef QT_QSTRING_UCS_4 - grp = 0; -#endif -} inline QChar::QChar( uchar c, uchar r ) { ucs = (r << 8) | c; @@ -286,12 +272,12 @@ inline bool operator==( char ch, QChar c ) { - return ((uchar) ch) == c.ucs; + return QChar((uchar) ch).ucs == c.ucs; } inline bool operator==( QChar c, char ch ) { - return ((uchar) ch) == c.ucs; + return QChar((uchar) ch).ucs == c.ucs; } inline bool operator==( QChar c1, QChar c2 ) @@ -306,22 +292,22 @@ inline bool operator!=( char ch, QChar c ) { - return ((uchar)ch) != c.ucs; + return QChar((uchar) ch).ucs != c.ucs; } inline bool operator!=( QChar c, char ch ) { - return ((uchar) ch) != c.ucs; + return QChar((uchar) ch).ucs != c.ucs; } inline bool operator<=( QChar c, char ch ) { - return c.ucs <= ((uchar) ch); + return c.ucs <= QChar((uchar) ch).ucs; } inline bool operator<=( char ch, QChar c ) { - return ((uchar) ch) <= c.ucs; + return QChar((uchar) ch).ucs <= c.ucs; } inline bool operator<=( QChar c1, QChar c2 ) @@ -718,7 +704,7 @@ // inline QString::~QString() { - if ( d->deref() ) { + if ( d && d->deref() ) { if ( d == shared_null ) shared_null = 0; d->deleteSelf(); [-- Attachment #3: qt-x11-free-3.0.2-0004-step.2.diff --] [-- Type: text/x-diff, Size: 1420 bytes --] diff -Naur qt-x11-free-3.0.2.orig/src/tools/qstring.cpp qt-x11-free-3.0.2/src/tools/qstring.cpp --- qt-x11-free-3.0.2.orig/src/tools/qstring.cpp Sun Mar 3 14:52:32 2002 +++ qt-x11-free-3.0.2/src/tools/qstring.cpp Sun Mar 3 14:52:32 2002 @@ -12603,9 +12603,9 @@ \sa isNull() */ -QString::QString( int size, bool /*dummy*/ ) +QString::QString( int size, bool make_blank ) { - if ( size ) { + if ( size || ( !size && make_blank ) ) { Q2HELPER(stat_construct_int++) int l = size; Q2HELPER(stat_construct_int_size+=l) @@ -12626,9 +12626,14 @@ QString::QString( const QByteArray& ba ) { Q2HELPER(stat_construct_ba++) - uint l; - QChar *uc = internalAsciiToUnicode(ba,&l); - d = new QStringData(uc,l,l); + if(ba.isNull()) { + QString tmp = ba.size() ? QString::fromLocal8Bit(ba.data()) : QString(0,true); + tmp.d->ref(); + d = tmp.d; + } else { + d = shared_null ? shared_null : makeSharedNull(); + d->ref(); + } } /*! @@ -12679,10 +12684,14 @@ QString::QString( const char *str ) { Q2HELPER(stat_construct_charstar++) - uint l; - QChar *uc = internalAsciiToUnicode(str,&l); - Q2HELPER(stat_construct_charstar_size+=l) - d = new QStringData(uc,l,l); + if(str) { + QString tmp = str[0] ? QString::fromLocal8Bit(str) : QString(0,true); + tmp.d->ref(); + d = tmp.d; + } else { + d = shared_null ? shared_null : makeSharedNull(); + d->ref(); + } } [-- Attachment #4: qt-x11-free-3.0.2-0004-step.1.diff --] [-- Type: text/x-diff, Size: 28228 bytes --] diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qbig5codec.cpp qt-x11-free-3.0.2/src/codecs/qbig5codec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qbig5codec.cpp Mon Feb 18 15:46:28 2002 +++ qt-x11-free-3.0.2/src/codecs/qbig5codec.cpp Tue Mar 12 12:37:41 2002 @@ -52,6 +52,7 @@ #define IsBig5Char(c) (((c) >= 0x81) && ((c) <= 0xfe)) #define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) int QBig5Codec::mibEnum() const @@ -88,32 +89,35 @@ QString QBig5Codec::toUnicode(const char* chars, int len) const { - QString result; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if ( ch < 0x80 ) { - // ASCII - result += QChar(ch); - } else if ( IsBig5Char(ch) ) { - // Big5 1984 - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( (c2 >=0x40) && (c2 <=0xfe) ) { - uint u = qt_Big5ToUnicode((ch << 8) | c2); - result += QValidChar(u); - } else { - i--; - result += QChar::replacement; + QString result; + if (chars) { + result.setLength(0); + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if ( ch < 0x80 ) { + // ASCII + result += QAsciiChar(ch); + } else if ( IsBig5Char(ch) ) { + // Big5 1984 + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( (c2 >=0x40) && (c2 <=0xfe) ) { + uint u = qt_Big5ToUnicode((ch << 8) | c2); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } + } else { + result += QChar::replacement; + } + } else { + // Invalid + result += QChar::replacement; + } } - } else { - result += QChar::replacement; - } - } else { - // Invalid - result += QChar::replacement; } - } - return result; + return result; } const char* QBig5Codec::name() const @@ -197,7 +201,7 @@ case 0: if ( ch < 0x80 ) { // ASCII - result += QChar(ch); + result += QAsciiChar(ch); } else if ( IsBig5Char(ch) ) { // Big5 1984 buf[0] = ch; diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qeucjpcodec.cpp qt-x11-free-3.0.2/src/codecs/qeucjpcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qeucjpcodec.cpp Mon Feb 18 15:46:28 2002 +++ qt-x11-free-3.0.2/src/codecs/qeucjpcodec.cpp Tue Mar 12 12:39:50 2002 @@ -124,6 +124,7 @@ #define IsEucChar(c) (((c) >= 0xa1) && ((c) <= 0xfe)) #define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) /*! Constructs a QEucJpCodec. @@ -214,64 +215,67 @@ QString QEucJpCodec::toUnicode(const char* chars, int len) const { QString result; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if ( ch < 0x80 ) { - // ASCII - result += QChar(ch); - } else if ( ch == Ss2 ) { - // JIS X 0201 Kana - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsKana(c2) ) { - uint u = conv->jisx0201ToUnicode(c2); - result += QValidChar(u); - } else { - i--; - result += QChar::replacement; + if (chars) { + result.setLength(0); + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if ( ch < 0x80 ) { + // ASCII + result += QAsciiChar(ch); + } else if ( ch == Ss2 ) { + // JIS X 0201 Kana + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsKana(c2) ) { + uint u = conv->jisx0201ToUnicode(c2); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } } - } - } else if ( ch == Ss3 ) { - // JIS X 0212 - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsEucChar(c2) ) { - if ( i < len-1 ) { - uchar c3 = chars[++i]; - if ( IsEucChar(c3) ) { - uint u = conv->jisx0212ToUnicode(c2 & 0x7f, c3 & 0x7f); - result += QValidChar(u); + } else if ( ch == Ss3 ) { + // JIS X 0212 + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsEucChar(c2) ) { + if ( i < len-1 ) { + uchar c3 = chars[++i]; + if ( IsEucChar(c3) ) { + uint u = conv->jisx0212ToUnicode(c2 & 0x7f, c3 & 0x7f); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } } else { - i--; result += QChar::replacement; } } else { + i--; result += QChar::replacement; } } else { - i--; result += QChar::replacement; } - } else { - result += QChar::replacement; - } - } else if ( IsEucChar(ch) ) { - // JIS X 0208 - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsEucChar(c2) ) { - uint u = conv->jisx0208ToUnicode(ch & 0x7f, c2 & 0x7f); - result += QValidChar(u); + } else if ( IsEucChar(ch) ) { + // JIS X 0208 + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsEucChar(c2) ) { + uint u = conv->jisx0208ToUnicode(ch & 0x7f, c2 & 0x7f); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } } else { - i--; result += QChar::replacement; } } else { + // Invalid result += QChar::replacement; } - } else { - // Invalid - result += QChar::replacement; } } return result; @@ -411,7 +415,7 @@ case 0: if ( ch < 0x80 ) { // ASCII - result += QChar(ch); + result += QAsciiChar(ch); } else if ( ch == Ss2 || ch == Ss3 ) { // JIS X 0201 Kana or JIS X 0212 buf[0] = ch; diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qeuckrcodec.cpp qt-x11-free-3.0.2/src/codecs/qeuckrcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qeuckrcodec.cpp Mon Feb 18 15:46:28 2002 +++ qt-x11-free-3.0.2/src/codecs/qeuckrcodec.cpp Tue Mar 12 12:41:25 2002 @@ -98,6 +98,7 @@ #define IsEucChar(c) (((c) >= 0xa1) && ((c) <= 0xfe)) #define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) /*! \reimp @@ -154,30 +155,33 @@ QString QEucKrCodec::toUnicode(const char* chars, int len) const { QString result; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if (ch == 0) - break; - if ( ch < 0x80 ) { - // ASCII - result += QChar(ch); - } else if ( IsEucChar(ch) ) { - // KSC 5601 - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsEucChar(c2) ) { - uint u = qt_Ksc5601ToUnicode((ch << 8) | c2); - result += QValidChar(u); + if (chars) { + result.setLength(0); + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if (ch == 0) + break; + if ( ch < 0x80 ) { + // ASCII + result += QAsciiChar(ch); + } else if ( IsEucChar(ch) ) { + // KSC 5601 + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsEucChar(c2) ) { + uint u = qt_Ksc5601ToUnicode((ch << 8) | c2); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } } else { - i--; result += QChar::replacement; } } else { + // Invalid result += QChar::replacement; } - } else { - // Invalid - result += QChar::replacement; } } return result; @@ -291,7 +295,7 @@ case 0: if ( ch < 0x80 ) { // ASCII - result += QChar(ch); + result += QAsciiChar(ch); } else if ( IsEucChar(ch) ) { // KSC 5601 buf[0] = ch; diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qgbkcodec.cpp qt-x11-free-3.0.2/src/codecs/qgbkcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qgbkcodec.cpp Mon Feb 18 15:46:29 2002 +++ qt-x11-free-3.0.2/src/codecs/qgbkcodec.cpp Tue Mar 12 12:43:22 2002 @@ -84,6 +84,7 @@ #define IsFirstByte(c) (((c) >= 0x81) && ((c) <= 0xFE)) #define IsSecondByte(c) ((((c) >= 0x40) && ((c) <= 0x7E)) || ((((c) >= 0x80) && ((c) <= 0xFE)))) #define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) static unsigned int qt_GBKToUnicode(unsigned int code); unsigned int qt_UnicodeToGBK(unsigned int unicode); @@ -130,29 +131,32 @@ QString QGbkCodec::toUnicode(const char* chars, int len) const { QString result; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if ( IsLatin(ch) ) { - // ASCII - result += QChar(ch); - } else if ( IsFirstByte(ch) ) { - // GBK ? - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsSecondByte(c2) ) { - uint u = qt_GBKToUnicode((ch << 8) | c2); - result += QValidChar(u); + if (chars) { + result.setLength(0); + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if ( IsLatin(ch) ) { + // ASCII + result += QAsciiChar(ch); + } else if ( IsFirstByte(ch) ) { + // GBK ? + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsSecondByte(c2) ) { + uint u = qt_GBKToUnicode((ch << 8) | c2); + result += QValidChar(u); + } else { + i--; + result += QChar::replacement; + } } else { - i--; + //Bad String result += QChar::replacement; } } else { - //Bad String + // Invalid result += QChar::replacement; } - } else { - // Invalid - result += QChar::replacement; } } return result; @@ -224,7 +228,7 @@ case 0: if ( ch < 0x80 ) { // ASCII - result += QChar(ch); + result += QAsciiChar(ch); } else if ( IsFirstByte(ch) ) { // GBK ? buf[0] = ch; diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qjiscodec.cpp qt-x11-free-3.0.2/src/codecs/qjiscodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qjiscodec.cpp Mon Feb 18 15:46:29 2002 +++ qt-x11-free-3.0.2/src/codecs/qjiscodec.cpp Tue Mar 12 12:46:24 2002 @@ -145,6 +145,7 @@ #define IsJisChar(c) (((c) >= 0x21) && ((c) <= 0x7e)) #define QValidChar(u) ((u) ? QChar((ushort)(u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) enum Iso2022State{ Ascii, MinState = Ascii, JISX0201_Latin, JISX0201_Kana, @@ -260,106 +261,109 @@ QString QJisCodec::toUnicode(const char* chars, int len) const { QString result; - Iso2022State state = Ascii, prev = Ascii; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if ( ch == Esc ) { - // Escape sequence - state = Unknown; - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if (c2 == '$') { - if ( i < len-1 ) { - uchar c3 = chars[++i]; - if (strchr(Esc_CHARS, c3)) { - if ( i < len-1 ) { - uchar c4 = chars[++i]; - if (c4 == '(') { - switch (c4) { - case 'D': - state = JISX0212; // Esc $ ( D - break; - } - } - } - } else { - switch (c3) { - case '@': - state = JISX0208_1978; // Esc $ @ - break; - case 'B': - state = JISX0208_1983; // Esc $ B - break; - } - } - } - } else { - if (strchr(Esc_CHARS, c2)) { + if (chars) { + result.setLength(0); + Iso2022State state = Ascii, prev = Ascii; + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if ( ch == Esc ) { + // Escape sequence + state = Unknown; + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if (c2 == '$') { if ( i < len-1 ) { uchar c3 = chars[++i]; - if (c2 == '(') { + if (strchr(Esc_CHARS, c3)) { + if ( i < len-1 ) { + uchar c4 = chars[++i]; + if (c4 == '(') { + switch (c4) { + case 'D': + state = JISX0212; // Esc $ ( D + break; + } + } + } + } else { switch (c3) { - case 'B': - state = Ascii; // Esc ( B + case '@': + state = JISX0208_1978; // Esc $ @ break; - case 'I': - state = JISX0201_Kana; // Esc ( I - break; - case 'J': - state = JISX0201_Latin; // Esc ( J + case 'B': + state = JISX0208_1983; // Esc $ B break; } } } + } else { + if (strchr(Esc_CHARS, c2)) { + if ( i < len-1 ) { + uchar c3 = chars[++i]; + if (c2 == '(') { + switch (c3) { + case 'B': + state = Ascii; // Esc ( B + break; + case 'I': + state = JISX0201_Kana; // Esc ( I + break; + case 'J': + state = JISX0201_Latin; // Esc ( J + break; + } + } + } + } } } - } - } else if (ch == So) { - // Shift out - prev = state; - state = JISX0201_Kana; - } else if (ch == Si) { - // Shift in - if (prev == Ascii || prev == JISX0201_Latin) { - state = prev; - } else { - state = Ascii; - } - } else { - uint u; - switch (state) { - case Ascii: - if (ch < 0x80) { - result += QChar(ch); - break; + } else if (ch == So) { + // Shift out + prev = state; + state = JISX0201_Kana; + } else if (ch == Si) { + // Shift in + if (prev == Ascii || prev == JISX0201_Latin) { + state = prev; + } else { + state = Ascii; } + } else { + uint u; + switch (state) { + case Ascii: + if (ch < 0x80) { + result += QAsciiChar(ch); + break; + } /* fall throught */ - case JISX0201_Latin: - u = conv->jisx0201ToUnicode(ch); - result += QValidChar(u); - break; - case JISX0201_Kana: - u = conv->jisx0201ToUnicode(ch | 0x80); - result += QValidChar(u); - break; - case JISX0208_1978: - case JISX0208_1983: - if ( i < len-1 ) { - uchar c2 = chars[++i]; - u = conv->jisx0208ToUnicode(ch & 0x7f, c2 & 0x7f); + case JISX0201_Latin: + u = conv->jisx0201ToUnicode(ch); result += QValidChar(u); - } - break; - case JISX0212: - if ( i < len-1 ) { - uchar c2 = chars[++i]; - u = conv->jisx0212ToUnicode(ch & 0x7f, c2 & 0x7f); + break; + case JISX0201_Kana: + u = conv->jisx0201ToUnicode(ch | 0x80); result += QValidChar(u); + break; + case JISX0208_1978: + case JISX0208_1983: + if ( i < len-1 ) { + uchar c2 = chars[++i]; + u = conv->jisx0208ToUnicode(ch & 0x7f, c2 & 0x7f); + result += QValidChar(u); + } + break; + case JISX0212: + if ( i < len-1 ) { + uchar c2 = chars[++i]; + u = conv->jisx0212ToUnicode(ch & 0x7f, c2 & 0x7f); + result += QValidChar(u); + } + break; + default: + result += QChar::replacement; + break; } - break; - default: - result += QChar::replacement; - break; } } } @@ -646,7 +650,7 @@ switch (state) { case Ascii: if (ch < 0x80) { - result += QChar(ch); + result += QAsciiChar(ch); break; } /* fall throught */ diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qrtlcodec.cpp qt-x11-free-3.0.2/src/codecs/qrtlcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qrtlcodec.cpp Mon Feb 18 15:46:29 2002 +++ qt-x11-free-3.0.2/src/codecs/qrtlcodec.cpp Tue Mar 12 18:58:14 2002 @@ -40,6 +40,8 @@ #ifndef QT_NO_CODEC_HEBREW +#define QAsciiChar(u) (QChar((ushort)(u))) + // NOT REVISED static const uchar unkn = '?'; // BLACK SQUARE (94) would be better @@ -302,7 +304,7 @@ // directionality, we know the answer. pos = 0; while (pos < len) { - if ( str.at(pos) == '\n' ) + if ( str.at(pos) == QAsciiChar('\n') ) startLine = pos; if (str.at(pos).direction() < 2) { // DirR or DirL dir1 = str.at(pos).direction(); @@ -315,7 +317,7 @@ return QChar::DirL; // move to end of line - while( pos < len && str.at(pos) != '\n' ) + while( pos < len && str.at(pos) != QAsciiChar('\n') ) pos++; while (pos > startLine) { @@ -336,7 +338,7 @@ pos = 0; while (pos < len-1 ) { if(str.at(pos).category() == QChar::Punctuation_Other) { - if( str.at(pos) != (char)0xbf && str.at(pos) != (char)0xa1 ) // spanish inverted question and exclamation mark + if( str.at(pos) != QAsciiChar(0xbf) && str.at(pos) != QAsciiChar(0xa1) ) // spanish inverted question and exclamation mark if( str.at(pos+1).direction() < 2 ) return QChar::DirR; } pos++; @@ -430,37 +432,43 @@ QString QHebrewCodec::toUnicode(const char* chars, int len ) const { QString r; - const unsigned char * c = (const unsigned char *)chars; - QChar::Direction basicDir = QChar::DirON; // neutral, we don't know + if (chars) { + r.setLength(0); - if( len == 0 ) return QString::null; + const unsigned char * c = (const unsigned char *)chars; + QChar::Direction basicDir = QChar::DirON; // neutral, we don't know - // Test, if the user gives us a directionality. - // We use 0xFE and 0xFF in ISO8859-8 for that. - // These chars are undefined in the charset, and are mapped to - // RTL overwrite - if( c[0] == 0xfe ) { - basicDir = QChar::DirL; - c++; // skip directionality hint - } - if( c[0] == 0xff ) { - basicDir = QChar::DirR; - c++; // skip directionality hint - } + // Won't null string if chars!=NULL + if( len != 0 ) { + // Test, if the user gives us a directionality. + // We use 0xFE and 0xFF in ISO8859-8 for that. + // These chars are undefined in the charset, and are mapped to + // RTL overwrite + if( c[0] == 0xfe ) { + basicDir = QChar::DirL; + c++; // skip directionality hint + len--; + } + if( c[0] == 0xff ) { + basicDir = QChar::DirR; + c++; // skip directionality hint + len--; + } - for( int i=0; i<len; i++ ) { - if ( c[i] > 127 ) - r[i] = heb_to_unicode[c[i]-128]; - else - r[i] = c[i]; - } + for( int i=0; i<len; i++ ) { + if ( c[i] > 127 ) + r[i] = heb_to_unicode[c[i]-128]; + else + r[i] = QAsciiChar(c[i]); + } - // do transformation from visual byte ordering to logical byte - // ordering - if( basicDir == QChar::DirON ) - basicDir = findBasicDirection(r); + // do transformation from visual byte ordering to logical byte + // ordering + if( basicDir == QChar::DirON ) + basicDir = findBasicDirection(r); - return QComplexText::bidiReorderString(r); + return QComplexText::bidiReorderString(r); + } #if 0 QString out; @@ -476,6 +484,8 @@ } return out; #endif + } + return r; } /*! diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qsjiscodec.cpp qt-x11-free-3.0.2/src/codecs/qsjiscodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qsjiscodec.cpp Mon Feb 18 15:46:29 2002 +++ qt-x11-free-3.0.2/src/codecs/qsjiscodec.cpp Tue Mar 12 19:01:00 2002 @@ -176,32 +176,35 @@ QString QSjisCodec::toUnicode(const char* chars, int len) const { QString result; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if ( ch < 0x80 || IsKana(ch) ) { - // JIS X 0201 Latin or JIS X 0201 Kana - uint u = conv->jisx0201ToUnicode(ch); - result += QValidChar(u); - } else if ( IsSjisChar1(ch) ) { - // JIS X 0208 - if ( i < len-1 ) { - uchar c2 = chars[++i]; - if ( IsSjisChar2(c2) ) { - if ( IsUserDefinedChar1(ch) ) { - result += QChar::replacement; + if (chars) { + result.setLength(0); + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if ( ch < 0x80 || IsKana(ch) ) { + // JIS X 0201 Latin or JIS X 0201 Kana + uint u = conv->jisx0201ToUnicode(ch); + result += QValidChar(u); + } else if ( IsSjisChar1(ch) ) { + // JIS X 0208 + if ( i < len-1 ) { + uchar c2 = chars[++i]; + if ( IsSjisChar2(c2) ) { + if ( IsUserDefinedChar1(ch) ) { + result += QChar::replacement; + } else { + uint u = conv->sjisToUnicode(ch, c2); + result += QValidChar(u); + } } else { - uint u = conv->sjisToUnicode(ch, c2); - result += QValidChar(u); + i--; + result += QChar::replacement; } } else { - i--; result += QChar::replacement; } } else { result += QChar::replacement; } - } else { - result += QChar::replacement; } } return result; diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qtextcodec.cpp qt-x11-free-3.0.2/src/codecs/qtextcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qtextcodec.cpp Tue Mar 12 12:34:27 2002 +++ qt-x11-free-3.0.2/src/codecs/qtextcodec.cpp Tue Mar 12 19:12:04 2002 @@ -1544,8 +1544,10 @@ { QString result; if(chars) { - const uchar* uchars = (const uchar*)chars; result.setLength(0); + + const uchar* uchars = (const uchar*)chars; + while (len--) { QMultiByteUnicodeTable& t = mb[*uchars]; if ( t.multibyte ) { @@ -2270,15 +2272,15 @@ QString r; if (chars) { + r.setLength(0); + const unsigned char * c = (const unsigned char *)chars; int i; for ( i = 0; i < len; i++ ) if ( c[i] == '\0' ) len = i; - if( len<=0 ) - r.setLength(0); - else { + if( len > 0 ) { r.setUnicode(0, len); QChar* uc = (QChar*)r.unicode(); // const_cast @@ -2460,15 +2462,15 @@ QString r; if (chars) { + r.setLength(0); + const unsigned char * c = (const unsigned char *)chars; int i; for ( i = 0; i < len; i++ ) if ( c[i] == '\0' ) len = i; - if( len<=0 ) - r.setLength(0); - else { + if( len > 0 ) { r.setUnicode(0, len); QChar* uc = (QChar*)r.unicode(); // const_cast diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qtsciicodec.cpp qt-x11-free-3.0.2/src/codecs/qtsciicodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qtsciicodec.cpp Mon Feb 18 15:46:30 2002 +++ qt-x11-free-3.0.2/src/codecs/qtsciicodec.cpp Tue Mar 12 19:08:24 2002 @@ -88,6 +88,7 @@ #define IsTSCIIChar(c) (((c) >= 0x80) && ((c) <= 0xfd)) #define QValidChar(u) ((u) ? QChar((u)) : QChar::replacement) +#define QAsciiChar(u) (QChar((ushort)(u))) /*! \reimp */ int QTsciiCodec::mibEnum() const @@ -133,26 +134,28 @@ QString QTsciiCodec::toUnicode(const char* chars, int len) const { QString result; - for (int i = 0; i < len; i++) { - uchar ch = chars[i]; - if ( ch < 0x80 ) { - // ASCII - result += QChar(ch); - } else if ( IsTSCIIChar(ch) ) { - // TSCII - uint s[3]; - uint u = qt_TSCIIToUnicode(ch, s); - uint *p = s; - while ( u-- ) { - uint c = *p++; - result += QValidChar(c); + if (chars) { + result.setLength(0); + for (int i = 0; i < len; i++) { + uchar ch = chars[i]; + if ( ch < 0x80 ) { + // ASCII + result += QAsciiChar(ch); + } else if ( IsTSCIIChar(ch) ) { + // TSCII + uint s[3]; + uint u = qt_TSCIIToUnicode(ch, s); + uint *p = s; + while ( u-- ) { + uint c = *p++; + result += QValidChar(c); + } + } else { + // Invalid + result += QChar::replacement; } - } else { - // Invalid - result += QChar::replacement; } } - return result; } diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qutfcodec.cpp qt-x11-free-3.0.2/src/codecs/qutfcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qutfcodec.cpp Mon Feb 18 15:46:30 2002 +++ qt-x11-free-3.0.2/src/codecs/qutfcodec.cpp Tue Mar 12 19:06:47 2002 @@ -37,6 +37,8 @@ #include "qutfcodec.h" +#define QAsciiChar(u) (QChar((ushort)(u))) + #ifndef QT_NO_TEXTCODEC int QUtf8Codec::mibEnum() const @@ -127,30 +129,34 @@ QString toUnicode(const char* chars, int len) { - QString result = ""; - for (int i=0; i<len; i++) { - uchar ch = chars[i]; - if (need) { - if ( (ch&0xc0) == 0x80 ) { - uc = (uc << 6) | (ch & 0x3f); - need--; - if ( !need ) { - result += QChar(uc); + QString result; + if (chars) { + result.setLength(0); + + for (int i=0; i<len; i++) { + uchar ch = chars[i]; + if (need) { + if ( (ch&0xc0) == 0x80 ) { + uc = (uc << 6) | (ch & 0x3f); + need--; + if ( !need ) { + result += QAsciiChar(uc); + } + } else { + // error + result += QChar::replacement; + need = 0; } } else { - // error - result += QChar::replacement; - need = 0; - } - } else { - if ( ch < 128 ) { - result += QChar(ch); - } else if ( (ch&0xe0) == 0xc0 ) { - uc = ch &0x1f; - need = 1; - } else if ( (ch&0xf0) == 0xe0 ) { - uc = ch &0x0f; - need = 2; + if ( ch < 128 ) { + result += QAsciiChar(ch); + } else if ( (ch&0xe0) == 0xc0 ) { + uc = ch &0x1f; + need = 1; + } else if ( (ch&0xf0) == 0xe0 ) { + uc = ch &0x0f; + need = 2; + } } } } @@ -230,35 +236,36 @@ QString toUnicode(const char* chars, int len) { QString r; - - while ( len-- ) { - if ( half ) { - QChar ch; - if ( swap ) { - ch.setRow( *chars++ ); - ch.setCell( buf ); - } else { - ch.setRow( buf ); - ch.setCell( *chars++ ); - } - if ( !headerdone ) { - if ( ch == QChar::byteOrderSwapped ) { - swap = !swap; - } else if ( ch == QChar::byteOrderMark ) { - // Ignore ZWNBSP + if (chars) { + r.setLength(0); + while ( len-- ) { + if ( half ) { + QChar ch; + if ( swap ) { + ch.setRow( *chars++ ); + ch.setCell( buf ); } else { - r += ch; + ch.setRow( buf ); + ch.setCell( *chars++ ); } - headerdone = TRUE; - } else - r += ch; - half = FALSE; - } else { - buf = *chars++; - half = TRUE; + if ( !headerdone ) { + if ( ch == QChar::byteOrderSwapped ) { + swap = !swap; + } else if ( ch == QChar::byteOrderMark ) { + // Ignore ZWNBSP + } else { + r += ch; + } + headerdone = TRUE; + } else + r += ch; + half = FALSE; + } else { + buf = *chars++; + half = TRUE; + } } } - return r; } }; diff -Naur qt-x11-free-3.0.2.orig/src/tools/qstring.cpp qt-x11-free-3.0.2/src/tools/qstring.cpp --- qt-x11-free-3.0.2.orig/src/tools/qstring.cpp Mon Feb 18 15:46:57 2002 +++ qt-x11-free-3.0.2/src/tools/qstring.cpp Tue Mar 12 19:22:34 2002 @@ -16378,6 +16378,11 @@ int len=0; while ( ((TCHAR*)tc)[len] ) len++; + if ( !len ) { + QString r; + r.setlength(0); + return r; + } # if defined(Q_WS_X11) || defined(QT_WIN32BYTESWAP) QString r; for ( int i=0; i<len; i++ ) @@ -16430,39 +16435,46 @@ // WATCH OUT: mblen must include the NUL (or just use -1) QString qt_winMB2QString( const char* mb, int mblen ) { - if ( !mb || !mblen ) - return QString::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, + QString result; + if ( mb ) { + result.setLength(0); + + if ( !mblen ) return result; + + 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; + { + 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 { - wclen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, - mb, mblen, 0, 0 ); - wc = new WCHAR[wclen]; - // and try again... + // Fail. + qWarning("MultiByteToWideChar cannot convert multibyte text"); + break; } - } else { - // Fail. - qWarning("MultiByteToWideChar cannot convert multibyte text"); - break; } + + if ( len >0 ) { + result.setUnicode( (QChar*)wc, len - 1 ); // len - 1: we don't want terminator + if ( wc != wc_auto ) + delete [] wc; + } } - if ( len <= 0 ) - return QString::null; - QString s( (QChar*)wc, len - 1 ); // len - 1: we don't want terminator - if ( wc != wc_auto ) - delete [] wc; - return s; + return result; } #endif // Q_OS_WIN32 diff -Naur qt-x11-free-3.0.2.orig/tools/linguist/shared/metatranslator.cpp qt-x11-free-3.0.2/tools/linguist/shared/metatranslator.cpp --- qt-x11-free-3.0.2.orig/tools/linguist/shared/metatranslator.cpp Tue Feb 12 19:02:53 2002 +++ qt-x11-free-3.0.2/tools/linguist/shared/metatranslator.cpp Tue Mar 12 18:43:11 2002 @@ -523,9 +523,16 @@ { if ( utf8 ) return QString::fromUtf8( str ); - else if ( codec == 0 ) - return QString( str ); - else + else if ( codec == 0 ) { + QString r; + if (str) { + if ( !str[0] ) + r.setLength(0); + else + r = QString( str ); + } + return r; + } else return codec->toUnicode( str ); } [-- Attachment #5: qt-x11-free-3.0.2-0004-step.0.diff --] [-- Type: text/x-diff, Size: 4003 bytes --] diff -Naur qt-x11-free-3.0.2.orig/src/codecs/qtextcodec.cpp qt-x11-free-3.0.2/src/codecs/qtextcodec.cpp --- qt-x11-free-3.0.2.orig/src/codecs/qtextcodec.cpp Mon Feb 18 15:46:29 2002 +++ qt-x11-free-3.0.2/src/codecs/qtextcodec.cpp Tue Mar 12 12:17:01 2002 @@ -424,19 +424,21 @@ // returns a string cotnaining the letters and numbers from input, // with a space separating run of a character class. e.g. "iso8859-1" // becomes "iso 8859 1" -static QString lettersAndNumbers( const char * input ) +static QCString lettersAndNumbers( const char * input ) { - QString result; - QChar c; + QCString result; + QChar c, n; while( input && *input ) { - c = *input; + c.setCell(*input); + c.setRow(0); if ( c.isLetter() || c.isNumber() ) - result += c.lower(); + result += c.lower().cell(); if ( input[1] ) { // add space at character class transition, except // transition from upper-case to lower-case letter - QChar n( input[1] ); + n.setCell(input[1]); + n.setRow(0); if ( c.isLetter() && n.isLetter() ) { if ( c == c.lower() && n == n.upper() ) result += ' '; @@ -464,8 +466,8 @@ // if the letters and numbers are the same, we have an "almost" // perfect match. - QString h( lettersAndNumbers( hint ) ); - QString n( lettersAndNumbers( name ) ); + QCString h( lettersAndNumbers( hint ) ); + QCString n( lettersAndNumbers( name ) ); if ( h == n ) return qstrlen( hint )-1; @@ -1540,19 +1542,22 @@ QString QTextCodecFromIODDecoder::toUnicode(const char* chars, int len) { - const uchar* uchars = (const uchar*)chars; QString result; - while (len--) { - QMultiByteUnicodeTable& t = mb[*uchars]; - if ( t.multibyte ) { - // Chained multi-byte - mb = t.multibyte; - } else { - if ( t.unicode ) - result += QChar(t.unicode); - mb=codec->to_unicode_multibyte; + if(chars) { + const uchar* uchars = (const uchar*)chars; + result.setLength(0); + while (len--) { + QMultiByteUnicodeTable& t = mb[*uchars]; + if ( t.multibyte ) { + // Chained multi-byte + mb = t.multibyte; + } else { + if ( t.unicode ) + result += QChar(t.unicode); + mb=codec->to_unicode_multibyte; + } + uchars++; } - uchars++; } return result; } @@ -2262,26 +2267,30 @@ QString QSimpleTextCodec::toUnicode(const char* chars, int len) const { - if ( len <= 0 || chars == 0 ) - return QString::null; - - const unsigned char * c = (const unsigned char *)chars; - int i; - - for ( i = 0; i < len; i++ ) { - if ( c[i] == '\0' ) - len = i; - } - QString r; - r.setUnicode(0, len); - QChar* uc = (QChar*)r.unicode(); // const_cast - for ( i = 0; i < len; i++ ) { - if ( c[i] > 127 ) - uc[i] = unicodevalues[forwardIndex].values[c[i]-128]; - else - uc[i] = c[i]; + if (chars) { + const unsigned char * c = (const unsigned char *)chars; + int i; + + for ( i = 0; i < len; i++ ) + if ( c[i] == '\0' ) len = i; + + if( len<=0 ) + r.setLength(0); + else { + r.setUnicode(0, len); + QChar* uc = (QChar*)r.unicode(); // const_cast + + for ( i = 0; i < len; i++ ) { + if ( c[i] > 127 ) + uc[i] = unicodevalues[forwardIndex].values[c[i]-128]; + else { + uc[i].setCell( c[i] ); + uc[i].setRow(0); + } + } + } } return r; } @@ -2448,10 +2457,28 @@ QString QLatin1Codec::toUnicode(const char* chars, int len) const { - if(len <= 0) - return QString::null; + QString r; - return QString::fromLatin1(chars, len); + if (chars) { + const unsigned char * c = (const unsigned char *)chars; + int i; + + for ( i = 0; i < len; i++ ) + if ( c[i] == '\0' ) len = i; + + if( len<=0 ) + r.setLength(0); + else { + r.setUnicode(0, len); + QChar* uc = (QChar*)r.unicode(); // const_cast + + for ( i = 0; i < len; i++ ) { + uc[i].setCell( c[i] ); + uc[i].setRow(0); + } + } + } + return r; }
reply other threads:[~2002-03-15 10:00 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=200203150959.g2F9xIY07465@ns.micom.don.ru \ --to=corwin@micom.don.ru \ --cc=kde-russian@lists.kde.ru \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
рассылка русскоязычной группы пользователей и разработчиков KDE This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/kde-russian/0 kde-russian/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 kde-russian kde-russian/ http://lore.altlinux.org/kde-russian \ kde-russian@lists.kde.ru public-inbox-index kde-russian Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.kde-russian AGPL code for this site: git clone https://public-inbox.org/public-inbox.git