src/corelib/tools/qstring.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
child 37 758a864f9613
--- a/src/corelib/tools/qstring.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/corelib/tools/qstring.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -69,6 +69,10 @@
 #include <winnls.h>
 #endif
 
+#ifdef Q_OS_SYMBIAN
+#include <e32cmn.h>
+#endif
+
 #include <limits.h>
 #include <string.h>
 #include <stdlib.h>
@@ -113,7 +117,7 @@
 static int ucstricmp(const ushort *a, const ushort *ae, const ushort *b, const ushort *be)
 {
     if (a == b)
-        return 0;
+        return (ae - be);
     if (a == 0)
         return 1;
     if (b == 0)
@@ -125,7 +129,7 @@
 
     uint alast = 0;
     uint blast = 0;
-    while (a != e) {
+    while (a < e) {
 //         qDebug() << hex << alast << blast;
 //         qDebug() << hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast);
 //         qDebug() << hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast);
@@ -154,7 +158,7 @@
     if (b == 0)
         return -1;
 
-    while (a != ae && *b) {
+    while (a < ae && *b) {
         int diff = foldCase(*a) - foldCase(*b);
         if ((diff))
             return diff;
@@ -4640,9 +4644,12 @@
         return length1;
 
     if (cs == Qt::CaseSensitive) {
-        while (uc != e && *c && *uc == *c)
+        while (uc < e && *c && *uc == *c)
             uc++, c++;
 
+        if (uc == e)
+            return -*c;
+
         return *uc - *c;
     } else {
         return ucstricmp(uc, e, c);
@@ -4765,6 +4772,10 @@
     CFRelease(thisString);
     CFRelease(otherString);
     return result;
+#elif defined(Q_OS_SYMBIAN)
+    TPtrC p1 = TPtrC16(reinterpret_cast<const TUint16 *>(data1), length1);
+    TPtrC p2 = TPtrC16(reinterpret_cast<const TUint16 *>(data2), length2);
+    return p1.CompareC(p2);
 #elif defined(Q_OS_UNIX)
     // declared in <string.h>
     int delta = strcoll(toLocal8Bit_helper(data1, length1), toLocal8Bit_helper(data2, length2));
@@ -6149,18 +6160,18 @@
     if (result.d->alloc != resultSize)
         return QString(); // not enough memory
 
-    qMemCopy(result.d->data, d->data, d->size * sizeof(ushort));
+    memcpy(result.d->data, d->data, d->size * sizeof(ushort));
 
     int sizeSoFar = d->size;
     ushort *end = result.d->data + sizeSoFar;
 
     const int halfResultSize = resultSize >> 1;
     while (sizeSoFar <= halfResultSize) {
-        qMemCopy(end, result.d->data, sizeSoFar * sizeof(ushort));
+        memcpy(end, result.d->data, sizeSoFar * sizeof(ushort));
         end += sizeSoFar;
         sizeSoFar <<= 1;
     }
-    qMemCopy(end, result.d->data, (resultSize - sizeSoFar) * sizeof(ushort));
+    memcpy(end, result.d->data, (resultSize - sizeSoFar) * sizeof(ushort));
     result.d->data[resultSize] = '\0';
     result.d->size = resultSize;
     return result;
@@ -6913,20 +6924,23 @@
         p++;
     }
 
-    p = d->data;
-    d->righttoleft = false;
+    d->righttoleft = isRightToLeft();
+    d->clean = true;
+}
+
+bool QString::isRightToLeft() const
+{
+    ushort *p = d->data;
+    const ushort * const end = p + d->size;
+    bool righttoleft = false;
     while (p < end) {
         switch(QChar::direction(*p))
         {
         case QChar::DirL:
-        case QChar::DirLRO:
-        case QChar::DirLRE:
             goto end;
         case QChar::DirR:
         case QChar::DirAL:
-        case QChar::DirRLO:
-        case QChar::DirRLE:
-            d->righttoleft = true;
+            righttoleft = true;
             goto end;
         default:
             break;
@@ -6934,8 +6948,7 @@
         ++p;
     }
  end:
-    d->clean = true;
-    return;
+    return righttoleft;
 }
 
 /*! \fn bool QString::isSimpleText() const
@@ -6945,7 +6958,7 @@
 
 /*! \fn bool QString::isRightToLeft() const
 
-    \internal
+    Returns true if the string is read right to left.
 */
 
 
@@ -7093,7 +7106,7 @@
 */
 QString &QString::setRawData(const QChar *unicode, int size)
 {
-    if (d->ref != 1 || d->alloc) {
+    if (d->ref != 1 || (d->data == d->array && d->alloc)) {
         *this = fromRawData(unicode, size);
     } else {
 #ifdef QT3_SUPPORT