diff --git a/audit/gen-apidiff-html.cs b/audit/gen-apidiff-html.cs
new file mode 100644
index 000000000..b04e0c9b0
--- /dev/null
+++ b/audit/gen-apidiff-html.cs
@@ -0,0 +1,73 @@
+//
+// gen-apidiff-html.cs - Converts a set of apidiff files to HTML by
+// merging them and applying an XSL file.
+//
+// Author:
+// Bertrand Lorentz (bertrand.lorentz@gmail.com)
+//
+// Copyright (C) 2013 Bertrand Lorentz
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Xsl;
+
+namespace Mono.AssemblyCompare
+{
+ public class Driver
+ {
+ static int Main (string [] args)
+ {
+ if (args.Length != 2) {
+ Console.WriteLine ("Usage: mono gen-apidiff-html.exe ");
+ return 1;
+ }
+
+ string diff_dir = args[0];
+ string out_file = args[1];
+
+ var all = new XmlDocument ();
+ all.AppendChild(all.CreateElement ("assemblies"));
+ foreach (string file in Directory.EnumerateFiles(diff_dir, "*.apidiff")) {
+ Console.WriteLine ("Merging " + file);
+ var doc = new XmlDocument ();
+ doc.Load (file);
+ foreach (XmlNode child in doc.GetElementsByTagName ("assembly")) {
+ XmlNode imported = all.ImportNode (child, true);
+ all.DocumentElement.AppendChild (imported);
+ }
+ }
+
+ var transform = new XslCompiledTransform ();
+ transform.Load ("mono-api.xsl");
+ var writer = new StreamWriter (out_file);
+
+ Console.WriteLine (String.Format ("Transforming to {0}...", out_file));
+ transform.Transform (all.CreateNavigator (), null, writer);
+ writer.Close ();
+
+ return 0;
+ }
+ }
+}
+
diff --git a/audit/html/c.gif b/audit/html/c.gif
new file mode 100644
index 000000000..02c347efd
Binary files /dev/null and b/audit/html/c.gif differ
diff --git a/audit/html/cormissing.css b/audit/html/cormissing.css
new file mode 100644
index 000000000..5a78c306f
--- /dev/null
+++ b/audit/html/cormissing.css
@@ -0,0 +1,213 @@
+.y IMG
+{
+ border: 0px;
+ padding: 0px;
+ margin: 0px;
+ margin-right: 4px;
+ vertical-align: middle;
+}
+
+.a, .a_,
+.y, .y_,
+.n, .n_,
+.c, .c_,
+.c, .c_,
+.d, .d_,
+.en, .en_,
+.i, .i_,
+.s, .s_,
+.e, .e_,
+.f, .f_,
+.m, .m_,
+.o, .o_,
+.p, .p_,
+.r, .r_,
+.x, .x_,
+.w, .w_
+{
+ FONT: 12px 'Verdana';
+ margin-left: 20px;
+}
+
+.y_ .n,
+.y_ .n_,
+.n_ .c,
+.n_ .c_,
+.n_ .s,
+.n_ .s_,
+.n_ .d,
+.n_ .d_,
+.n_ .en,
+.n_ .en_,
+.n_ .i,
+.n_ .i_,
+.c_ .c,
+.c_ .c_,
+.c_ .d,
+.c_ .d_,
+.c_ .e,
+.c_ .e_,
+.c_ .f,
+.c_ .f_,
+.c_ .m,
+.c_ .m_,
+.c_ .o,
+.c_ .o_,
+.c_ .en,
+.c_ .en_,
+.c_ .p,
+.c_ .p_,
+.c_ .r,
+.c_ .r_,
+.c_ .x,
+.c_ .x_,
+.c_ .i,
+.c_ .i_,
+.c_ .w,
+.c_ .w_,
+.d_ .c,
+.d_ .c_,
+.d_ .e,
+.d_ .e_,
+.d_ .f,
+.d_ .f_,
+.d_ .i,
+.d_ .i_,
+.d_ .m,
+.d_ .m_,
+.d_ .o,
+.d_ .o_,
+.d_ .p,
+.d_ .p_,
+.d_ .r,
+.d_ .r_,
+.d_ .x,
+.d_ .x_,
+.d_ .w,
+.d_ .w_,
+.e_ .m,
+.e_ .m_,
+.en_ .c,
+.en_ .c_,
+.en_ .e,
+.en_ .e_,
+.en_ .f,
+.en_ .f_,
+.en_ .i,
+.en_ .i_,
+.en_ .m,
+.en_ .m_,
+.en_ .o,
+.en_ .o_,
+.en_ .p,
+.en_ .p_,
+.en_ .r,
+.en_ .r_,
+.en_ .x,
+.en_ .x_,
+.en_ .w,
+.en_ .w_,
+.i_ .c,
+.i_ .c_,
+.i_ .e,
+.i_ .e_,
+.i_ .f,
+.i_ .f_,
+.i_ .m,
+.i_ .m_,
+.i_ .o,
+.i_ .o_,
+.i_ .p,
+.i_ .p_,
+.i_ .r,
+.i_ .r_,
+.i_ .x,
+.i_ .x_,
+.i_ .w,
+.i_ .w_,
+.i_ .i,
+.i_ .i_,
+.s_ .c,
+.s_ .c_,
+.s_ .e,
+.s_ .e_,
+.s_ .f,
+.s_ .f_,
+.s_ .m,
+.s_ .m_,
+.s_ .o,
+.s_ .o_,
+.s_ .p,
+.s_ .p_,
+.s_ .r,
+.s_ .r_,
+.s_ .s,
+.s_ .s_,
+.s_ .x,
+.s_ .x_,
+.s_ .i,
+.s_ .i_,
+.s_ .w,
+.s_ .w_,
+.x_ .a,
+.x_ .a_,
+.m_ .a,
+.m_ .a_,
+.e_ .r,
+.e_ .r_,
+.e_ .o,
+.e_ .o_,
+.f_ .r,
+.f_ .r_,
+.f_ .o,
+.f_ .o_,
+.m_ .r,
+.m_ .r_,
+.m_ .o,
+.m_ .o_,
+.o_ .r,
+.o_ .r_,
+.o_ .o,
+.o_ .o_,
+.o_ .a_,
+.p_ .r,
+.p_ .r_,
+.p_ .o,
+.p_ .o_,
+.r_ .r,
+.r_ .r_,
+.r_ .o,
+.r_ .o_,
+.x_ .r,
+.x_ .r_,
+.x_ .o,
+.x_ .o_
+.w_ .r,
+.w_ .r_,
+.w_ .o,
+.w_ .o_
+{
+ display: none;
+}
+
+.t
+{
+ cursor: pointer;
+ margin-right: 8px;
+}
+
+.filter
+{
+ cursor: pointer;
+ vertical-align: middle;
+}
+
+.st
+{
+ margin-left: 20px;
+}
+
+.l
+{
+ cursor: pointer;
+}
diff --git a/audit/html/cormissing.js b/audit/html/cormissing.js
new file mode 100644
index 000000000..64397b5ff
--- /dev/null
+++ b/audit/html/cormissing.js
@@ -0,0 +1,584 @@
+// FIXME:
+// It still does not update icons previous to a type/member name when
+// certain icon kinds are unchecked (when an item has "todo" and "missing",
+// the default display is "missing" and when "missing" is unchecked it
+// should turn into "todo").
+
+function toggle (elt)
+{
+ if (elt == null)
+ return;
+
+ var eltLink = firstElement (elt);
+ if (eltLink != null && eltLink.className == 't') // toggle
+ {
+ var ich = elt.className.indexOf ('_');
+ if (ich < 0)
+ {
+ eltLink.src = 'tp.gif';
+ elt.className += '_';
+ }
+ else
+ {
+ eltLink.src = 'tm.gif';
+ elt.className = elt.className.slice (0, ich);
+ }
+ }
+}
+
+function setView (elt, fView)
+{
+ var eltLink = firstElement (elt);
+ if (eltLink != null && eltLink.className == 't') // toggle
+ {
+ var ich = elt.className.indexOf ('_');
+ if (ich < 0 && !fView)
+ {
+ eltLink.src = 'tp.gif';
+ elt.className += '_';
+ }
+ else if (ich >= 0 && fView)
+ {
+ eltLink.src = 'tm.gif';
+ elt.className = elt.className.slice (0, ich);
+ }
+ }
+}
+
+function firstElement (elt)
+{
+ var c = elt.firstChild;
+ while (c != null) {
+ if (c.nodeType == 1) // Node.ELEMENT_NODE (IE6 does not recognize it)
+ return c;
+ c = c.nextSibling;
+ }
+ return null;
+}
+
+function trimSrc (strSrc)
+{
+ return strSrc.slice (strSrc.lastIndexOf ('/') + 1, strSrc.lastIndexOf ('.'));
+}
+
+function getChildrenByTagName (elt, strTag)
+{
+ strTag = strTag.toLowerCase ();
+ var rgChildren = new Array ();
+ var eltChild = firstElement (elt);
+ while (eltChild)
+ {
+ if (eltChild.tagName && eltChild.tagName.toLowerCase () == strTag)
+ rgChildren.push (eltChild);
+ eltChild = eltChild.nextSibling;
+ }
+ return rgChildren;
+}
+
+function viewAll (elt, dictTypes)
+{
+ var fView = isShown (elt, dictTypes);
+
+ var aCounts = new Array (4);
+ for (i = 0; i < 4; i++)
+ aCounts [i] = 0;
+ var rgElts = getChildrenByTagName (elt, 'DIV');
+ for (iElt in rgElts) {
+ var aChildRet = viewAll (rgElts [iElt], dictTypes);
+ if (aChildRet != null) {
+ fView = true;
+ for (i = 0; i < 4; i++)
+ aCounts [i] += aChildRet [i];
+ }
+ }
+
+ elt.style.display = fView ? '' : 'none';
+
+ if (!fView)
+ return null;
+
+ rgShownDivs = getChildrenByTagName (elt, 'DIV');
+ for (i = 0; i < rgShownDivs.length; i++) {
+ var cDiv = rgShownDivs [i];
+ if (cDiv.style.display == 'none')
+ continue;
+ incrementCount (cDiv, aCounts, dictTypes);
+ }
+
+ // update the numbers
+ rgSpans = getChildrenByTagName (elt, 'SPAN');
+ for (iSpan in rgSpans) {
+ var cSpan = rgSpans [iSpan];
+ var cImage = firstElement (cSpan);
+ if (cImage == null)
+ continue;
+ switch (trimSrc (cImage.src)) {
+ case 'st': cSpan.lastChild.nodeValue = ": " + aCounts [0]; break;
+ case 'sm': cSpan.lastChild.nodeValue = ": " + aCounts [1]; break;
+ case 'sx': cSpan.lastChild.nodeValue = ": " + aCounts [2]; break;
+ case 'se': cSpan.lastChild.nodeValue = ": " + aCounts [3]; break;
+ }
+ }
+ return aCounts;
+}
+
+function isShown (elt, dictTypes)
+{
+ if (!isShownMarkType (elt, dictTypes))
+ return false;
+
+ return true;
+}
+
+function isShownMarkType (elt, dictTypes)
+{
+ var rgImages = getChildrenByTagName (elt, 'IMG');
+ var cImages = rgImages.length;
+ for (var iImage = 0; iImage < cImages; iImage++)
+ {
+ var strImage = trimSrc (rgImages [iImage].src);
+ if (dictTypes [strImage])
+ return true;
+ }
+ return false;
+}
+
+function incrementCount (cDiv, aCounts, dictTypes)
+{
+ switch (cDiv.className) {
+ case 'y': case 'y_': // assembly
+ case 'n': case 'n_': // namespace
+ // types
+ case 'c': case 'c_': case 'i': case 'i_':
+ case 'en': case 'en_': case 'd': case 'd_':
+ // members
+ case 'r': case 'r_': case 'x': case 'x_': case 'm': case 'm_':
+ case 'f': case 'f_': case 'e': case 'e_': case 'p': case 'p_':
+ case 'o': case 'o_': case 'a': case 'a_':
+ var rgImgs = getChildrenByTagName (cDiv, 'IMG');
+ for (iImg = 0; iImg < rgImgs.length; iImg++) {
+ var cImg = rgImgs [iImg];
+ if (cImg.className != 't')
+ continue;
+ var stype = trimSrc (cImg.src);
+ if (!dictTypes [stype])
+ continue;
+ switch (stype) {
+ case "st": aCounts [0]++; break;
+ case "sm": aCounts [1]++; break;
+ case "sx": aCounts [2]++; break;
+ case "se": aCounts [3]++; break;
+ default:
+ continue;
+ }
+ break;
+ }
+ break;
+ }
+}
+
+/* just for debugging use now.
+function firstInnerText (elt)
+{
+ var s = elt.innerText;
+ if (s != null)
+ return s;
+ var n = elt.firstChild;
+ while (n != null) {
+ s = n.nodeValue;
+ if (s != null && s.replace (/^\s+/g, '') != '')
+ return s;
+ s = firstInnerText (n);
+ if (s != null)
+ return s;
+ n = n.nextSibling;
+ }
+ return s;
+}
+*/
+
+function getView (elt)
+{
+ var eltLink = firstElement (elt);
+ if (eltLink != null && eltLink.className == 't') // toggle
+ {
+ var ich = elt.className.indexOf ('_');
+ if (ich < 0)
+ return true;
+ }
+ return false;
+}
+
+function getParentDiv (elt)
+{
+ if (elt)
+ {
+ do
+ {
+ elt = elt.parentNode;
+ }
+ while (elt && elt.tagName != 'DIV');
+ }
+
+ return elt;
+}
+
+function getName (elt)
+{
+ var rgSpans = getChildrenByTagName (elt, 'SPAN');
+ for (var iSpan = 0; iSpan < rgSpans.length; iSpan ++)
+ {
+ var span = rgSpans [iSpan];
+ if (span.className == 'l') // label
+ {
+ if (span.innerText)
+ return span.innerText;
+ else
+ return span.firstChild.nodeValue;
+ }
+ }
+ return null;
+}
+
+function clickHandler (evt)
+{
+ var elt;
+ if (document.layers)
+ elt = evt.taget;
+ else if (window.event && window.event.srcElement)
+ {
+ elt = window.event.srcElement;
+ evt = window.event;
+ }
+ else if (evt && evt.stopPropagation)
+ elt = evt.target;
+
+ if (!elt.className && elt.parentNode)
+ elt = elt.parentNode;
+
+ if (elt.className == 'l') // label
+ {
+ var strClass;
+ var strField;
+ var strNamespace;
+ var strAssembly;
+ var strFieldType;
+
+ elt = getParentDiv (elt);
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'x') // constructor
+ {
+ strField = 'ctor';
+ elt = getParentDiv (elt);
+ }
+ else
+ if (strEltClass == 'm' || // method
+ strEltClass == 'p' || // property
+ strEltClass == 'e' || // event
+ strEltClass == 'f') // field
+ {
+ strFieldType = strEltClass;
+ strField = getName (elt);
+ var match = strField.match ( /[\.A-Z0-9_]*/i );
+ if (match)
+ strField = match [0];
+ elt = getParentDiv (elt);
+
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'c' || // class
+ strEltClass == 's' || // struct
+ strEltClass == 'i' || // struct
+ strEltClass == 'd' || // delegate
+ strEltClass == 'en') // enum
+ {
+ strClass = getName (elt);
+ if (strEltClass == 'en')
+ strField = null;
+ elt = getParentDiv (elt);
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'n')
+ {
+ strNamespace = getName (elt);
+ elt = getParentDiv (elt);
+ }
+
+ var strEltClass = elt.className;
+ if (strEltClass.charAt (strEltClass.length - 1) == '_')
+ strEltClass = strEltClass.slice (0, strEltClass.length - 1);
+
+ if (strEltClass == 'y')
+ {
+ strAssembly = getName (elt);
+ }
+
+ if (evt.ctrlKey)
+ {
+ var strRoot = 'http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/';
+ var strExtra = '';
+
+ if (strAssembly)
+ {
+ if (strAssembly == 'mscorlib')
+ strAssembly = 'corlib';
+ else if (strAssembly == 'System.Xml')
+ strAssembly = 'System.XML';
+
+ strRoot = strRoot + strAssembly + '/';
+ if (strNamespace)
+ {
+ strRoot = strRoot + strNamespace + '/';
+ if (strClass)
+ {
+ strRoot += strClass + '.cs';
+ strExtra += '?view=markup';
+ }
+ }
+ window.open (strRoot + strExtra, 'CVS');
+ }
+ }
+ else if (strNamespace)
+ {
+ if (document.getElementById ('TargetMsdn1').checked)
+ {
+ var re = /\./g ;
+ strNamespace = strNamespace.toLowerCase ().replace (re, '');
+ if (strClass)
+ strNamespace += strClass.toLowerCase () + 'class';
+ if (strField)
+ strNamespace += strField;
+ if (strClass || strField)
+ strNamespace += 'topic';
+
+ window.open ('http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrf' + strNamespace + '.asp', 'MSDN');
+
+ }
+ else
+ {
+ if (strClass)
+ strNamespace += '.' + strClass;
+ if (strField)
+ strNamespace += '.' + strField;
+ if (document.getElementById ('TargetMonodoc').checked)
+ {
+ var category = null;
+ if (strClass == null)
+ category = "N:";
+ else if (strField == null)
+ category = "T:";
+ else {
+ switch (strFieldType) {
+ case 'f': category = "F:"; break;
+ case 'p': category = "P:"; break;
+ case 'm': category = "M:"; break;
+ case 'e': category = "E:"; break;
+ }
+ }
+ if (category != null)
+ window.open ('http://www.go-mono.com/docs/monodoc.ashx?link=' + category + strNamespace);
+ }
+ else
+ {
+ window.open ('http://msdn2.microsoft.com/library/' + strNamespace + '.aspx', 'MSDN');
+ }
+ }
+ }
+ }
+ else
+ {
+ if (elt.parentNode && elt.parentNode.className == 't') // toggle
+ elt = elt.parentNode;
+ else if (elt.className != 't') // toggle
+ return;
+
+ while (elt != null && elt.tagName != 'DIV')
+ elt = elt.parentNode;
+
+ if (evt.shiftKey)
+ {
+ var rgElts = getChildrenByTagName (elt, 'DIV');
+ var cElts = rgElts.length;
+ if (cElts != 0)
+ {
+ var fView = false;
+ var iElt;
+ for (iElt = 0; iElt < cElts; iElt ++)
+ {
+ if (getView (rgElts [iElt]))
+ {
+ fView = true;
+ break;
+ }
+ }
+ for (iElt = 0; iElt < cElts; iElt ++)
+ {
+ setView (rgElts [iElt], !fView);
+ }
+ }
+ }
+ else if (evt.ctrlKey)
+ {
+ setView (elt, true);
+ var eltParent = getParentDiv (elt);
+ while (eltParent)
+ {
+ var rgSiblings = getChildrenByTagName (eltParent, 'DIV');
+ var cSiblings = rgSiblings.length;
+ for (var iSibling = 0; iSibling < cSiblings; iSibling++)
+ {
+ var eltSibling = rgSiblings [iSibling];
+ if (eltSibling != elt)
+ {
+ setView (eltSibling, false);
+ }
+ }
+ elt = eltParent;
+ eltParent = getParentDiv (elt);
+ }
+ }
+ else
+ toggle (elt);
+ }
+
+ return false;
+}
+
+function filterTree ()
+{
+ var eltMissing = document.getElementById ('missing');
+ var eltTodo = document.getElementById ('todo');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+ var eltStable = document.getElementById ('stable');
+
+ var dictTypes = new Object ();
+ if (eltMissing.checked)
+ dictTypes ['sm'] = true;
+ if (eltTodo.checked)
+ dictTypes ['st'] = true;
+ if (eltErrors.checked)
+ dictTypes ['se'] = true;
+ if (eltExtra.checked)
+ dictTypes ['sx'] = true;
+ if (eltStable.checked)
+ dictTypes ['sc'] = true;
+
+ viewAll (document.getElementById ('ROOT'), dictTypes);
+}
+
+function addAndFilter ()
+{
+ var newInput = document.getElementById ('NewFilterTarget');
+ var newAttr = newInput.value;
+ if (newAttr.length > 0) {
+ var selection = document.getElementById ('FilteredAttributes');
+ var newElem = document.createElement ('option');
+ newElem.appendChild (document.createTextNode (newAttr));
+ selection.appendChild (newElem);
+ newInput.value = '';
+ filterTree ();
+ }
+}
+
+function removeAndFilter ()
+{
+ var selection = document.getElementById ('FilteredAttributes');
+ if (selection.selectedIndex >= 0) {
+ var newInput = document.getElementById ('NewFilterTarget');
+ if (newInput.value.length == 0)
+ newInput.value = selection.options [selection.selectedIndex].firstChild.nodeValue;
+ selection.removeChild (selection.options [selection.selectedIndex]);
+ filterTree ();
+ }
+}
+
+function selectMissing ()
+{
+ toggleFilter ('missing');
+}
+
+function selectTodo ()
+{
+ toggleFilter ('todo');
+}
+
+function selectExtra ()
+{
+ toggleFilter ('extra');
+}
+
+function selectErrors ()
+{
+ toggleFilter ('errors');
+}
+
+function selectStable ()
+{
+ toggleFilter ('stable');
+}
+
+function toggleAttributeFilter (attrName)
+{
+ toggleFilter (attrName);
+}
+
+function toggleFilter (strFilter)
+{
+ var eltTodo = document.getElementById ('todo');
+ var eltMissing = document.getElementById ('missing');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+
+ var eltToggle = document.getElementById (strFilter);
+ if (window && window.event && window.event.shiftKey)
+ {
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = false;
+ eltToggle.checked = true;
+ }
+ else
+ if (!eltTodo.checked && !eltMissing.checked && !eltExtra.checked && !eltErrors.checked)
+ {
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
+ eltToggle.checked = false;
+ }
+ filterTree ();
+}
+
+function onLoad ()
+{
+ var eltMissing = document.getElementById ('missing');
+ var eltTodo = document.getElementById ('todo');
+ var eltExtra = document.getElementById ('extra');
+ var eltErrors = document.getElementById ('errors');
+ eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
+ filterTree ();
+}
+
+if (document.layers)
+{
+ document.captureEvents (Event.MOUSEUP);
+ document.onmouseup = clickHandler;
+}
+else if (document.attachEvent)
+{
+ document.attachEvent('onclick', clickHandler);
+}
+else if (document.addEventListener)
+{
+ document.addEventListener('click', clickHandler, false);
+}
+else
+ document.onclick = clickHandler;
+
diff --git a/audit/html/d.gif b/audit/html/d.gif
new file mode 100644
index 000000000..c9735952f
Binary files /dev/null and b/audit/html/d.gif differ
diff --git a/audit/html/e.gif b/audit/html/e.gif
new file mode 100644
index 000000000..1137246bf
Binary files /dev/null and b/audit/html/e.gif differ
diff --git a/audit/html/en.gif b/audit/html/en.gif
new file mode 100644
index 000000000..00026b773
Binary files /dev/null and b/audit/html/en.gif differ
diff --git a/audit/html/f.gif b/audit/html/f.gif
new file mode 100644
index 000000000..f78a2f53b
Binary files /dev/null and b/audit/html/f.gif differ
diff --git a/audit/html/i.gif b/audit/html/i.gif
new file mode 100644
index 000000000..56cd032a5
Binary files /dev/null and b/audit/html/i.gif differ
diff --git a/audit/html/m.gif b/audit/html/m.gif
new file mode 100644
index 000000000..75fe3586d
Binary files /dev/null and b/audit/html/m.gif differ
diff --git a/audit/html/n.gif b/audit/html/n.gif
new file mode 100644
index 000000000..f6fa74630
Binary files /dev/null and b/audit/html/n.gif differ
diff --git a/audit/html/p.gif b/audit/html/p.gif
new file mode 100644
index 000000000..b79d0dd7e
Binary files /dev/null and b/audit/html/p.gif differ
diff --git a/audit/html/r.gif b/audit/html/r.gif
new file mode 100644
index 000000000..a3ef0f38e
Binary files /dev/null and b/audit/html/r.gif differ
diff --git a/audit/html/s.gif b/audit/html/s.gif
new file mode 100644
index 000000000..f2fd5c8ae
Binary files /dev/null and b/audit/html/s.gif differ
diff --git a/audit/html/sc.gif b/audit/html/sc.gif
new file mode 100644
index 000000000..b02afd9b2
Binary files /dev/null and b/audit/html/sc.gif differ
diff --git a/audit/html/se.gif b/audit/html/se.gif
new file mode 100644
index 000000000..1c46eaa58
Binary files /dev/null and b/audit/html/se.gif differ
diff --git a/audit/html/sm.gif b/audit/html/sm.gif
new file mode 100644
index 000000000..0c7194786
Binary files /dev/null and b/audit/html/sm.gif differ
diff --git a/audit/html/st.gif b/audit/html/st.gif
new file mode 100644
index 000000000..067582cb3
Binary files /dev/null and b/audit/html/st.gif differ
diff --git a/audit/html/sx.gif b/audit/html/sx.gif
new file mode 100644
index 000000000..2c8ca5479
Binary files /dev/null and b/audit/html/sx.gif differ
diff --git a/audit/html/tb.gif b/audit/html/tb.gif
new file mode 100644
index 000000000..ee68c5a35
Binary files /dev/null and b/audit/html/tb.gif differ
diff --git a/audit/html/tm.gif b/audit/html/tm.gif
new file mode 100644
index 000000000..3c8f18aec
Binary files /dev/null and b/audit/html/tm.gif differ
diff --git a/audit/html/tp.gif b/audit/html/tp.gif
new file mode 100644
index 000000000..8b7435361
Binary files /dev/null and b/audit/html/tp.gif differ
diff --git a/audit/html/w.gif b/audit/html/w.gif
new file mode 100644
index 000000000..0b7dc7693
Binary files /dev/null and b/audit/html/w.gif differ
diff --git a/audit/html/y.gif b/audit/html/y.gif
new file mode 100644
index 000000000..08f00d4ea
Binary files /dev/null and b/audit/html/y.gif differ
diff --git a/audit/makefile b/audit/makefile
index ffaa3ce44..a726e2ab5 100644
--- a/audit/makefile
+++ b/audit/makefile
@@ -7,7 +7,7 @@ COMMON_SOURCES = \
APIINFO_SOURCES = mono-api-info.cs $(COMMON_SOURCES)
-all: extract-missing.exe mono-api-info.exe mono-api-diff.exe
+all: extract-missing.exe mono-api-info.exe mono-api-diff.exe gen-apidiff-html.exe
check: all
rm -rf curr diff
@@ -24,6 +24,9 @@ mono-api-info.exe: $(APIINFO_SOURCES)
extract-missing.exe: extract-missing.cs
$(MCS) extract-missing.cs
+gen-apidiff-html.exe: gen-apidiff-html.cs
+ $(MCS) -out:$@ $^
+
clean:
rm -f *.exe
rm -rf curr
diff --git a/audit/mono-api.xsl b/audit/mono-api.xsl
new file mode 100644
index 000000000..b3be16540
--- /dev/null
+++ b/audit/mono-api.xsl
@@ -0,0 +1,541 @@
+
+
+
+
+
+
+
+
+
+
+
+ Gtk# API Status
+
+
+
+
+
+
+
Gtk# API Status
+
+
+
+
+
+
+
+
+
+ Legend :
+
+
+ |
+ Assembly |
+ |
+ |
+ Namespace |
+ |
+ |
+ Class |
+ |
+ |
+ Struct |
+
+
+ |
+ Interface |
+ |
+ |
+ Delegate |
+ |
+ |
+ Enum |
+ |
+ |
+ Method |
+
+
+ |
+ Field |
+ |
+ |
+ Property |
+ |
+ |
+ Event |
+ |
+ |
+ Attribute |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ c
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ w
+
+
+
+
+
+
+
+
+
+
+
+
+ d
+
+
+
+
+
+
+
+
+
+
+
+
+ en
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ p
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ x
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ f
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ o
+ m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ _
+
+
+
+
+
+ se.gif
+ t
+
+
+
+
+
+ st.gif
+ t
+
+
+
+
+ No TODO description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ a
+ tb
+
+
+
+
+
+
+
+
+
+ :
+
+ %
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ WARNING:
+
+
+
+
+
+
+
+
+
+
+
+