From 1c94133b581e9761718716ebae72b9a648034328 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 8 Dec 2009 16:00:06 +0100
Subject: [PATCH] debugger: start working on infrastructure to allow selection
 of encoding of char arrays

---
 src/plugins/debugger/watchhandler.cpp | 56 +++++++++++++++++++++------
 src/plugins/debugger/watchhandler.h   | 12 ++++++
 src/plugins/debugger/watchwindow.cpp  |  9 +++--
 3 files changed, 62 insertions(+), 15 deletions(-)

diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index c8b25794722..f4ff199c1cb 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -627,18 +627,35 @@ template <class IntType> QString reformatInteger(IntType value, int format)
     return QString::number(value); // not reached
 }
 
-static QString formattedValue(const WatchData &data,
-    int individualFormat, int typeFormat)
+static QString formattedValue(const WatchData &data, int format)
 {
     if (isIntType(data.type)) {
-        const int format = individualFormat == -1 ? typeFormat : individualFormat;
         if (format <= 0)
             return data.value;
-        if (data.type.contains(QLatin1String("unsigned"))) {            
+        if (data.type.contains(QLatin1String("unsigned")))
             return reformatInteger(data.value.toULongLong(), format);
-        } else {
-            return reformatInteger(data.value.toLongLong(), format);
-        }
+        return reformatInteger(data.value.toLongLong(), format);
+    }
+    if (0 && !data.addr.isEmpty()) {
+        if (format == BaldPointerFormat)
+            return data.value;
+        bool ok = false;
+        const void *addr =
+            reinterpret_cast<void *>(data.value.toULongLong(&ok, 0));
+        if (!ok || !addr)
+            return data.value;
+        // FIXME: add a round trip throught the debugger to prevent crashs?
+        if (format == Latin1StringFormat)
+            return QString::fromLatin1(static_cast<const char *>(addr));
+        if (format == Local8BitStringFormat)
+            return QString::fromLocal8Bit(static_cast<const char *>(addr));
+        if (format == Utf8StringFormat)
+            return QString::fromUtf8(static_cast<const char *>(addr));
+        if (format == Utf16StringFormat)
+            return QString::fromUtf16(static_cast<const ushort *>(addr));
+        if (format == Ucs4StringFormat)
+            return QString::fromUcs4(static_cast<const uint *>(addr));
+         return data.value;
     }
     return data.value;
 }
@@ -762,14 +779,20 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
     switch (role) {
         case Qt::DisplayRole: {
             switch (idx.column()) {
-                case 0: return data.name;
-                case 1: return formattedValue(data,
-                    m_handler->m_individualFormats.value(data.iname, -1),
-                    m_handler->m_typeFormats.value(data.type, -1));
-                case 2:
+                case 0:
+                    return data.name;
+                case 1: {
+                    int format = m_handler->m_individualFormats.value(data.iname, -1);
+                    if (format == -1)
+                        format = m_handler->m_typeFormats.value(data.type, -1);
+                    //qDebug() << "FORMATTED: " << format << formattedValue(data, format);
+                    return formattedValue(data, format);
+                }
+                case 2: {
                     if (!data.displayedType.isEmpty())
                         return data.displayedType;
                     return niceType(data.type);
+                }
                 default: break;
             }
             break;
@@ -806,12 +829,21 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
             if (isIntType(data.type))
                 return QStringList() << tr("decimal") << tr("hexadecimal")
                     << tr("binary") << tr("octal");
+            if (!data.addr.isEmpty())
+                return QStringList()
+                    << tr("Bald pointer")
+                    << tr("Latin1 string")
+                    << tr("UTF8 string")
+                    << tr("UTF16 string")
+                    << tr("UCS4 string");
             break;
 
         case TypeFormatRole:
             return m_handler->m_typeFormats.value(data.type, -1);
+
         case IndividualFormatRole:
             return m_handler->m_individualFormats.value(data.iname, -1);
+
         case AddressRole: {
             if (!data.addr.isEmpty())
                 return data.addr;
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index a35f05e97bc..c59e87e36ad 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -168,6 +168,18 @@ enum IntegerFormat
     OctalFormat,
 };
 
+
+enum PointerFomat
+{
+    BaldPointerFormat = 0, // keep that at 0 as default
+    Latin1StringFormat,
+    Local8BitStringFormat,
+    Utf8StringFormat,
+    Utf16StringFormat,
+    Ucs4StringFormat,
+};
+
+
 enum DumpableFormat
 {
     PrettyFormat = 0, // keep that at 0 as default
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 776e8cbd4dc..d763c84ffda 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -210,9 +210,12 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
 
     QStringList alternativeFormats = 
         model()->data(mi0, TypeFormatListRole).toStringList();
-    const int typeFormat = qMax(int(DecimalFormat), model()->data(mi0, TypeFormatRole).toInt());
-    const int individualFormat = model()->data(mi0, IndividualFormatRole).toInt();
-    const int effectiveIndividualFormat = individualFormat == -1 ? typeFormat : individualFormat;
+    const int typeFormat =
+        qMax(int(DecimalFormat), model()->data(mi0, TypeFormatRole).toInt());
+    const int individualFormat =
+        model()->data(mi0, IndividualFormatRole).toInt();
+    const int effectiveIndividualFormat =
+        individualFormat == -1 ? typeFormat : individualFormat;
 
     QMenu typeFormatMenu;
     QMenu individualFormatMenu;
-- 
GitLab