]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/ifacecheck/src/xmlparser.cpp
assert if the window is being recreated, this indicates a bug in the user code and...
[wxWidgets.git] / utils / ifacecheck / src / xmlparser.cpp
index 43892d970d5627283f6384354aefeea716981915..efbb82798db2bcaef32ed825450d6a0612322d0e 100644 (file)
@@ -74,6 +74,15 @@ void wxType::SetTypeFromString(const wxString& t)
     m_strType.Replace(" ,", ",");
 
     m_strType = m_strType.Strip(wxString::both);
+
+    // now set the clean version
+    m_strTypeClean = m_strType;
+    m_strTypeClean.Replace("const", "");
+    m_strTypeClean.Replace("static", "");
+    m_strTypeClean.Replace("*", "");
+    m_strTypeClean.Replace("&", "");
+    m_strTypeClean.Replace("[]", "");
+    m_strTypeClean = m_strTypeClean.Strip(wxString::both);
 }
 
 bool wxType::IsOk() const
@@ -82,25 +91,14 @@ bool wxType::IsOk() const
     //     "reverse_iterator_impl<wxString::const_iterator>" type
     //     It can also contain commas, * and & operators etc
 
-    return !GetClean().IsEmpty();
-}
-
-wxString wxType::GetClean() const
-{
-    wxString ret(m_strType);
-    ret.Replace("const", "");
-    ret.Replace("static", "");
-    ret.Replace("*", "");
-    ret.Replace("&", "");
-    ret.Replace("[]", "");
-    return ret.Strip(wxString::both);
+    return !m_strTypeClean.IsEmpty();
 }
 
 bool wxType::operator==(const wxType& m) const
 {
     // brain-dead comparison:
 
-    if (GetClean() == m.GetClean() &&
+    if (m_strTypeClean == m.m_strTypeClean &&
         IsConst() == m.IsConst() &&
         IsStatic() == m.IsStatic() &&
         IsPointer() == m.IsPointer() &&
@@ -119,12 +117,13 @@ void wxArgumentType::SetDefaultValue(const wxString& defval, const wxString& def
 {
     m_strDefaultValue=defval.Strip(wxString::both);
     m_strDefaultValueForCmp=defvalForCmp.Strip(wxString::both);
-/*
+
     // in order to make valid&simple comparison on argument defaults,
     // we reduce some of the multiple forms in which the same things may appear
     // to a single form:
-    m_strDefaultValue.Replace("0u", "0");
-
+    if (m_strDefaultValue == "0u")
+        m_strDefaultValue = "0";
+/*
     if (IsPointer())
         m_strDefaultValue.Replace("0", "NULL");
     else
@@ -144,7 +143,20 @@ bool wxArgumentType::operator==(const wxArgumentType& m) const
     const wxString& def2 = m.m_strDefaultValueForCmp.IsEmpty() ? m.m_strDefaultValue : m.m_strDefaultValueForCmp;
 
     if (def1 != def2)
+    {
+        // maybe the default values are numbers.
+        // in this case gccXML gives as default values things like '-0x0000001' instead of just '-1'.
+        // To handle these cases, we try to convert the default value strings to numbers:
+        long def1val, def2val;
+        if (def1.ToLong(&def1val, 0 /* auto-detect */) &&
+            def2.ToLong(&def2val, 0 /* auto-detect */))
+        {
+            if (def1val == def2val)
+                return true;        // the default values match
+        }
+
         return false;
+    }
 
     // we deliberately avoid checks on the argument name
 
@@ -551,6 +563,31 @@ bool wxXmlGccInterface::Parse(const wxString& filename)
         return false;
     }
 
+    wxString version = doc.GetRoot()->GetAttribute("cvs_revision");
+    bool old = false;
+
+#define MIN_REVISION  120
+
+    if (!version.StartsWith("1."))
+        old = true;
+    if (!old)
+    {
+        unsigned long rev = 0;
+        if (!version.Mid(2).ToULong(&rev))
+            old = true;
+        else
+            if (rev < MIN_REVISION)
+                old = true;
+    }
+
+    if (old)
+    {
+        LogError("The version of GCC-XML used for the creation of %s is too old; "
+                 "the cvs_revision attribute of the root node reports '%s', "
+                 "minimal required is 1.%d.", filename, version, MIN_REVISION);
+        return false;
+    }
+
     wxToResolveTypeHashMap toResolveTypes;
     wxClassMemberIdHashMap members;
     wxTypeIdHashMap types;
@@ -1064,6 +1101,13 @@ bool wxXmlDoxygenInterface::Parse(const wxString& filename)
         return false;
     }
 
+    /*
+        NB: we may need in future to do a version-check here if the
+            format of the XML generated by doxygen changes.
+            For now (doxygen version 1.5.5), this check is not required
+            since AFAIK the XML format never changed since it was introduced.
+    */
+
     m_classes.Alloc(ESTIMATED_NUM_CLASSES);
 
     // process files referenced by this index file