]> git.cworth.org Git - apitrace/commitdiff
Improve the XML semantic info. CSS magic.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 9 Jul 2008 17:00:31 +0000 (02:00 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 9 Jul 2008 17:00:31 +0000 (02:00 +0900)
base.py
d3dtrace-txt.xsl
d3dtrace.css
d3dtrace.xsl
log.cpp
log.hpp

diff --git a/base.py b/base.py
index d2b4a22dd80d988fd2bec711f04592538239a9f5..64a02ed558914b479f57b4cc0954921242903da0 100644 (file)
--- a/base.py
+++ b/base.py
@@ -128,10 +128,12 @@ class Pointer(Type):
     
     def dump(self, instance):
         print '    if(%s) {' % instance
+        print '        Log::BeginReference("%s", %s);' % (self.type, instance)
         try:
             self.type.dump("*" + instance)
         except NotImplementedError:
-            print '        Log::TextF("%%p", %s);' % instance
+            pass
+        print '        Log::EndReference();'
         print '    }'
         print '    else'
         print '        Log::Text("NULL");'
@@ -201,15 +203,10 @@ class Struct(Concrete):
         self.members = members
 
     def _dump(self, instance):
-        print '    Log::Text("{");'
-        first = True
         for type, name in self.members:
-            if first:
-                first = False
-            else:
-                print '    Log::Text(", ");'
+            print '    Log::BeginElement("%s", "%s");' % (type, name)
             type.dump('(%s).%s' % (instance, name))
-        print '    Log::Text("}");'
+            print '    Log::EndElement();'
 
 
 class Alias(Type):
@@ -302,21 +299,21 @@ class Interface(Type):
                 print '    %s result;' % method.type
                 result = 'result = '
             print '    Log::BeginCall("%s");' % (self.name + '::' + method.name)
-            print '    Log::BeginParam("this", "%s *");' % self.name
+            print '    Log::BeginArg("%s *", "this");' % self.name
             print '    Log::TextF("%p", m_pInstance);'
-            print '    Log::EndParam();'
+            print '    Log::EndArg();'
             for type, name in method.args:
                 if not type.isoutput():
                     type.unwrap_instance(name)
-                    print '    Log::BeginParam("%s", "%s");' % (name, type)
+                    print '    Log::BeginArg("%s", "%s");' % (type, name)
                     type.dump(name)
-                    print '    Log::EndParam();'
+                    print '    Log::EndArg();'
             print '    %sm_pInstance->%s(%s);' % (result, method.name, ', '.join([str(name) for type, name in method.args]))
             for type, name in method.args:
                 if type.isoutput():
-                    print '    Log::BeginParam("%s", "%s");' % (name, type)
+                    print '    Log::BeginArg("%s", "%s");' % (type, name)
                     type.dump(name)
-                    print '    Log::EndParam();'
+                    print '    Log::EndArg();'
                     type.wrap_instance(name)
             if method.type is not Void:
                 print '    Log::BeginReturn("%s");' % method.type
index 36caf1af440eac5ffd73bf8ff75588ac3a4db8da..ea5c2558e2c63cf39d30fc62d81dc09ebfc9b00c 100644 (file)
        <xsl:template match="call">
                <xsl:value-of select="@name"/>
                <xsl:text>(</xsl:text>
-               <xsl:apply-templates select="param"/>
+               <xsl:apply-templates select="arg"/>
                <xsl:text>)</xsl:text>
-               <xsl:apply-templates select="return"/>
+               <xsl:apply-templates select="ret"/>
                <xsl:text>&#10;</xsl:text>
        </xsl:template>
 
-       <xsl:template match="param">
+       <xsl:template match="arg|elem">
                <xsl:value-of select="@name"/>
                <xsl:text> = </xsl:text>
-               <xsl:value-of select="."/>
+               <xsl:call-template name="compound"/>
                <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                </xsl:if>
        </xsl:template>
 
-       <xsl:template match="return">
+       <xsl:template match="ret">
                <xsl:text> = </xsl:text>
-               <xsl:value-of select="."/>
+               <xsl:call-template name="compound"/>
        </xsl:template>
 
+       <xsl:template match="ref">
+               <xsl:choose>
+                       <xsl:when test="*">
+                               <xsl:text>&amp;</xsl:text>
+                               <xsl:call-template name="compound"/>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:value-of select="@addr"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template name="compound">
+               <xsl:choose>
+                       <xsl:when test="elem">
+                               <xsl:text>{</xsl:text>
+                               <xsl:apply-templates />
+                               <xsl:text>}</xsl:text>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:apply-templates />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
 </xsl:transform>
index c72f36307f4076f52756bbadbdb72f2ea10b4fa7..535d6d2716413728cedbe6b0c8c99d2d629d40d1 100644 (file)
@@ -5,12 +5,33 @@ body {
        text-align : left;
 }
 
-ul {
+ul.calls {
        list-style: none;
        margin-left: 0px;
        padding-left: 0px;
 }
 
+ul.args {
+       display:inline;
+       list-style: none;
+       margin-left: 0px;
+       padding-left: 0px;
+}
+
+ul.args li {
+       display:inline;
+}
+
+ul.elems {
+       list-style: none;
+       margin-left: 2em;
+       padding-left: 0px;
+}
+
+ul.elems li {
+       display:block;
+}
+
 .fun {
        font-weight: bold;
 }
@@ -26,3 +47,25 @@ ul {
 .lit {
        color: #0000ff;
 }
+
+.addr {
+       color: #008000;
+}
+
+.ref {
+       position: relative;
+}
+
+.def {
+       display: none;
+       position: absolute;
+       top: 1.5em;
+       left: 0;
+       width: 32em;
+       background: #f7f7f7;
+}
+
+.ref:hover .def {
+       display: block;
+}
+
index de4336f1afc369b97fcee1c56a6a9216c70d1693..99c36d4ee31c04b0143c1ab7697a71012579a3a6 100644 (file)
@@ -4,6 +4,8 @@
 
        <xsl:output method="html" />
 
+       <xsl:strip-space elements="*" />
+
        <xsl:template match="/trace">
                <html>
                        <head>
@@ -11,7 +13,7 @@
                                <link rel="stylesheet" type="text/css" href="d3dtrace.css"/>
                        </head>
                        <body>
-                               <ul>
+                               <ul class="calls">
                                        <xsl:apply-templates/>
                                </ul>
                        </body>
                                <xsl:value-of select="@name"/>
                        </span>
                        <xsl:text>(</xsl:text>
-                       <xsl:apply-templates select="param"/>
+                       <ul class="args">
+                               <xsl:apply-templates select="arg"/>
+                       </ul>
                        <xsl:text>)</xsl:text>
-                       <xsl:apply-templates select="return"/>
+                       <xsl:apply-templates select="ret"/>
                </li>
        </xsl:template>
 
-       <xsl:template match="param">
-               <span class="typ">
-                       <xsl:value-of select="@type"/>
-                       <xsl:text> </xsl:text>
-               </span>
+       <xsl:template match="arg|elem">
+               <li>
+                       <xsl:apply-templates select="@type"/>
+                       <xsl:apply-templates select="@name"/>
+                       <xsl:text> = </xsl:text>
+                       <xsl:call-template name="compound"/>
+                       <xsl:if test="position() != last()">
+                               <xsl:text>, </xsl:text>
+                       </xsl:if>
+               </li>
+       </xsl:template>
+
+       <xsl:template match="@type">
+               <xsl:attribute name="title">
+                       <xsl:value-of select="."/>
+               </xsl:attribute>
+       </xsl:template>
+
+       <xsl:template match="@name">
                <span class="var">
-                       <xsl:value-of select="@name"/>
+                       <xsl:value-of select="."/>
                </span>
+       </xsl:template>
+
+       <xsl:template match="ret">
                <xsl:text> = </xsl:text>
-               <span class="lit">
+               <xsl:call-template name="compound"/>
+       </xsl:template>
+
+       <xsl:template match="ref">
+               <xsl:choose>
+                       <xsl:when test="elem">
+                               <span class="ref">
+                                       <xsl:apply-templates select="@addr"/>
+                                       <span class="def">
+                                               <xsl:call-template name="compound"/>
+                                       </span>
+                               </span>
+                       </xsl:when>
+                       <xsl:when test="*">
+                               <xsl:text>&amp;</xsl:text>
+                               <xsl:apply-templates />
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:apply-templates select="@addr"/>
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
+
+       <xsl:template match="@addr">
+               <span class="addr">
                        <xsl:value-of select="."/>
                </span>
-               <xsl:if test="position() != last()">
-                       <xsl:text>, </xsl:text>
-               </xsl:if>
        </xsl:template>
 
-       <xsl:template match="return">
-               <xsl:text> = </xsl:text>
+       <xsl:template match="text()">
                <span class="lit">
                        <xsl:value-of select="."/>
                </span>
        </xsl:template>
 
+       <xsl:template name="compound">
+               <xsl:choose>
+                       <xsl:when test="elem">
+                               <xsl:text>{</xsl:text>
+                               <ul class="elems">
+                                       <xsl:apply-templates />
+                               </ul>
+                               <xsl:text>}</xsl:text>
+                       </xsl:when>
+                       <xsl:otherwise>
+                               <xsl:apply-templates />
+                       </xsl:otherwise>
+               </xsl:choose>
+       </xsl:template>
 </xsl:transform>
diff --git a/log.cpp b/log.cpp
index 0c5a09e3315001a8e31c53483173bd35369ccc70..20df332ad9908e6c96c7874bfe40762058b85397 100644 (file)
--- a/log.cpp
+++ b/log.cpp
@@ -124,8 +124,13 @@ static void Escape(const char *s) {
     Write(s);
 }
 
+
+DWORD g_dwIndent = 0;
+
 void NewLine(void) {
     Write("\r\n");
+    for(unsigned i = 0; i < g_dwIndent; ++i)
+        Write("\t");        
 }
 
 void Tag(const char *name) {
@@ -138,6 +143,7 @@ void BeginTag(const char *name) {
     Write("<");
     Write(name);
     Write(">");
+    ++g_dwIndent;
 }
 
 void BeginTag(const char *name, 
@@ -149,6 +155,7 @@ void BeginTag(const char *name,
     Write("=\"");
     Escape(value1);
     Write("\">");
+    ++g_dwIndent;
 }
 
 void BeginTag(const char *name, 
@@ -165,9 +172,33 @@ void BeginTag(const char *name,
     Write("=\"");
     Escape(value2);
     Write("\">");
+    ++g_dwIndent;
+}
+
+void BeginTag(const char *name, 
+              const char *attr1, const char *value1,
+              const char *attr2, const char *value2,
+              const char *attr3, const char *value3) {
+    Write("<");
+    Write(name);
+    Write(" ");
+    Write(attr1);
+    Write("=\"");
+    Escape(value1);
+    Write("\" ");
+    Write(attr2);
+    Write("=\"");
+    Escape(value2);
+    Write("\" ");
+    Write(attr3);
+    Write("=\"");
+    Escape(value3);
+    Write("\">");
+    ++g_dwIndent;
 }
 
 void EndTag(const char *name) {
+    --g_dwIndent;
     Write("</");
     Write(name);
     Write(">");
@@ -194,37 +225,55 @@ void TextF(const char *format, ...) {
 }
 
 void BeginCall(const char *function) {
-    Write("\t");
     BeginTag("call", "name", function);
     NewLine();
 }
 
 void EndCall(void) {
-    Write("\t");
     EndTag("call");
     NewLine();
 }
 
-void BeginParam(const char *name, const char *type) {
-    Write("\t\t");
-    BeginTag("param", "name", name, "type", type);
+void BeginArg(const char *type, const char *name) {
+    BeginTag("arg", "type", type, "name", name);
 }
 
-void EndParam(void) {
-    EndTag("param");
+void EndArg(void) {
+    EndTag("arg");
     NewLine();
 }
 
 void BeginReturn(const char *type) {
-    Write("\t\t");
-    BeginTag("return", "type", type);
+    BeginTag("ret", "type", type);
 }
 
 void EndReturn(void) {
-    EndTag("return");
+    EndTag("ret");
     NewLine();
 }
 
+void BeginElement(const char *type, const char *name) {
+    BeginTag("elem", "type", type, "name", name);
+}
+
+void BeginElement(const char *type) {
+    BeginTag("elem", "type", type);
+}
+
+void EndElement(void) {
+    EndTag("elem");
+}
+
+void BeginReference(const char *type, const void *addr) {
+    char saddr[256];
+    _snprintf(saddr, sizeof(saddr), "%p", addr);
+    BeginTag("ref", "type", type, "addr", saddr);
+}
+
+void EndReference(void) {
+    EndTag("ref");
+}
+
 void DumpString(const char *str) {
     const unsigned char *p = (const unsigned char *)str;
     Log::Text("\"");
diff --git a/log.hpp b/log.hpp
index abeebe6f26172cebff42bc808400a01a4d226bc8..60ae3b7dcc490e1ba442b0ea8692427ed090d2c1 100644 (file)
--- a/log.hpp
+++ b/log.hpp
@@ -31,6 +31,7 @@ namespace Log {
     void Close(void);
     
     void NewLine(void);
+    
     void Tag(const char *name);
     void BeginTag(const char *name);
     void BeginTag(const char *name, 
@@ -39,16 +40,28 @@ namespace Log {
                   const char *attr1, const char *value1,
                   const char *attr2, const char *value2);
     void EndTag(const char *name);
+    
     void Text(const char *text);
     void TextF(const char *format, ...);
+    
     void BeginCall(const char *function);
     void EndCall(void);
-    void BeginParam(const char *name, const char *type);
-    void EndParam(void);
+    
+    void BeginArg(const char *type, const char *name);
+    void EndArg(void);
+
     void BeginReturn(const char *type);
     void EndReturn(void);
 
+    void BeginElement(const char *type);
+    void BeginElement(const char *type, const char *name);
+    void EndElement(void);
+
+    void BeginReference(const char *type, const void *addr);
+    void EndReference(void);
+
     void DumpString(const char *str);
+    
 }
 
 #endif /* _LOG_HPP_ */