The Qt patch linked in the book - http://www.trolltech.com/developer/download/Qt-3.3.8-UTF-8-fix.diff - is apparently a DOS-format text file, and as a result won't apply. I converted it into a unix file, and thought I may as well turn it into a more standard patch as well (using -Np1 like the others in BLFS), and attached the updated patch.
diff -Naur qt-x11-free-3.3.8.orig/src/codecs/qutfcodec.cpp 
qt-x11-free-3.3.8/src/codecs/qutfcodec.cpp
--- qt-x11-free-3.3.8.orig/src/codecs/qutfcodec.cpp     2007-02-02 
09:01:08.000000000 -0500
+++ qt-x11-free-3.3.8/src/codecs/qutfcodec.cpp  2007-12-19 13:35:44.000000000 
-0500
@@ -154,6 +154,7 @@
 
 class QUtf8Decoder : public QTextDecoder {
     uint uc;
+    uint min_uc;
     int need;
     bool headerDone;
 public:
@@ -167,8 +168,9 @@
        result.setLength( len ); // worst case
        QChar *qch = (QChar *)result.unicode();
        uchar ch;
+        int error = -1;
        for (int i=0; i<len; i++) {
-           ch = *chars++;
+           ch = chars[i];
            if (need) {
                if ( (ch&0xc0) == 0x80 ) {
                    uc = (uc << 6) | (ch & 0x3f);
@@ -182,6 +184,8 @@
                            *qch++ = QChar(high);
                            *qch++ = QChar(low);
                            headerDone = TRUE;
+                       } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 
0xdfff) || (uc >= 0xfffe)) {
+                            *qch++ = QChar::replacement;
                        } else {
                            if (headerDone || QChar(uc) != QChar::byteOrderMark)
                                *qch++ = uc;
@@ -190,6 +194,7 @@
                    }
                } else {
                    // error
+                    i = error;
                    *qch++ = QChar::replacement;
                    need = 0;
                }
@@ -200,13 +205,22 @@
                } 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++ = QChar::replacement;
+                }
            }
        }
        result.truncate( qch - result.unicode() );
diff -Naur qt-x11-free-3.3.8.orig/src/tools/qstring.cpp 
qt-x11-free-3.3.8/src/tools/qstring.cpp
--- qt-x11-free-3.3.8.orig/src/tools/qstring.cpp        2007-02-02 
09:01:05.000000000 -0500
+++ qt-x11-free-3.3.8/src/tools/qstring.cpp     2007-12-19 13:35:44.000000000 
-0500
@@ -5805,6 +5805,7 @@
     result.setLength( len ); // worst case
     QChar *qch = (QChar *)result.unicode();
     uint uc = 0;
+    uint min_uc = 0;
     int need = 0;
     int error = -1;
     uchar ch;
@@ -5822,7 +5823,13 @@
                        unsigned short low = uc%0x400 + 0xdc00;
                        *qch++ = QChar(high);
                        *qch++ = QChar(low);
-                   } else {
+                   } else if (uc < min_uc || (uc >= 0xd800 && uc <= 0xdfff) || 
(uc >= 0xfffe)) {
+                       // overlong seqence, UTF16 surrogate or BOM
+                        i = error;
+                        qch = addOne(qch, result);
+                        *qch++ = QChar(0xdbff);
+                        *qch++ = QChar(0xde00+((uchar)utf8[i]));
+                    } else {
                        *qch++ = uc;
                    }
                }
@@ -5844,14 +5851,17 @@
                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);
-- 
http://linuxfromscratch.org/mailman/listinfo/blfs-dev
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page

Reply via email to