Mike Gerwitz

Activist for User Freedom

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/current/dot/depout.xsl')
-rw-r--r--src/current/dot/depout.xsl212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/current/dot/depout.xsl b/src/current/dot/depout.xsl
new file mode 100644
index 0000000..5b3dbda
--- /dev/null
+++ b/src/current/dot/depout.xsl
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Outputs dependency relationship to a directed graph
+-->
+
+<xsl:stylesheet version="2.0"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+
+ xmlns:lv="http://www.lovullo.com/rater"
+ xmlns:dot="http://www.lovullo.com/calc/dot"
+ xmlns:preproc="http://www.lovullo.com/rater/preproc">
+
+
+
+<!--
+ Container for all the dependencies
+-->
+<xsl:template match="preproc:sym-deps" mode="dot:depout" priority="5">
+ <xsl:apply-templates mode="dot:depout" />
+</xsl:template>
+
+
+<!--
+ Treat the entry point (lv:yield) as the root node
+-->
+<xsl:template match="preproc:sym-dep[ @name='___yield' ]" mode="dot:depout" priority="6">
+ <xsl:value-of select="@name" />
+ <xsl:text> [root=ctr,fontsize=24,style=bold,label="Yield"]; </xsl:text>
+
+ <xsl:apply-templates mode="dot:depout" />
+</xsl:template>
+
+
+<!--
+ Constant and generated symbols will not be rendered
+-->
+<xsl:template mode="dot:depout" priority="5" match="
+ preproc:sym-dep[
+ @name=ancestor::lv:package/preproc:symtable/preproc:sym[
+ @type='const'
+ or @preproc:generated='true'
+ ]/@name
+ ]
+ ">
+</xsl:template>
+
+
+<!--
+ Container for symbol dependencies
+
+ That is: this node represents a symbol, and its children are its dependencies.
+-->
+<xsl:template match="preproc:sym-dep" mode="dot:depout" priority="3">
+ <xsl:apply-templates mode="dot:depout" />
+</xsl:template>
+
+
+<!--
+ Do not output relationships to primitives or constants; or generated
+-->
+<xsl:template mode="dot:depout" priority="5" match="
+ preproc:sym-ref[
+ @type='type'
+ and (
+ @name='integer'
+ or @name='float'
+ or @name='boolean'
+ )
+ or @type='const'
+ or @type='lparam'
+ or @type='map' or @type='retmap'
+ or @type='map:head' or @type='map:tail'
+ or @type='retmap:head' or @type='retmap:tail'
+ ]
+ ">
+
+ <!-- skip -->
+</xsl:template>
+
+
+<!--
+ Process generated symbol deps as our own
+
+ Generated symbols are not known by the user, so they should be treated as part
+ of the unit from which they are generated.
+-->
+<xsl:template mode="dot:depout" priority="4" match="
+ preproc:sym-ref[
+ @name=ancestor::lv:package/preproc:symtable/preproc:sym[
+ @preproc:generated='true'
+ ]/@name
+ ]
+ ">
+
+ <xsl:param name="usedby" select="parent::preproc:sym-dep/@name" />
+
+ <xsl:variable name="name" select="@name" />
+
+ <!-- process the generated symbol's deps as our own -->
+ <xsl:apply-templates mode="dot:depout" select="
+ ancestor::preproc:sym-deps/preproc:sym-dep[
+ @name=$name
+ ]/preproc:sym-ref
+ ">
+ <xsl:with-param name="usedby" select="$usedby" />
+ </xsl:apply-templates>
+</xsl:template>
+
+
+<!--
+ Process references with parents as if they were their parent symbol
+
+ Symbols with defined parents are generated as part of that parent and will
+ therefore be treated as a single unit.
+-->
+<xsl:template match="preproc:sym-ref[ @parent ]" mode="dot:depout" priority="3">
+ <xsl:param name="usedby" select="parent::preproc:sym-dep/@name" />
+
+ <xsl:variable name="parent" select="@parent" />
+
+ <xsl:apply-templates mode="dot:depout" select="
+ ancestor::lv:package/preproc:symtable/preproc:sym[ @name=$parent ]
+ ">
+ <xsl:with-param name="usedby" select="$usedby" />
+ </xsl:apply-templates>
+</xsl:template>
+
+
+<!--
+ Trigger processing of symbol associated with the ref
+-->
+<xsl:template match="preproc:sym-ref" mode="dot:depout" priority="2">
+ <xsl:param name="usedby" select="parent::preproc:sym-dep/@name" />
+
+ <xsl:variable name="name" select="@name" />
+
+ <xsl:apply-templates mode="dot:depout" select="
+ ancestor::lv:package/preproc:symtable/preproc:sym[ @name=$name ]
+ ">
+ <xsl:with-param name="usedby" select="$usedby" />
+ </xsl:apply-templates>
+</xsl:template>
+
+
+<!--
+ Output symbol reference to directed graph
+
+ The symbol (dependency) is referenced as a node adjacent to the node of the
+ symbol that uses it. The edge is directed toward the dependency and shall be
+ read as "uses".
+
+ For example: "foo uses bar":
+ (foo) -> (bar)
+-->
+<xsl:template match="preproc:sym" mode="dot:depout" priority="5">
+ <xsl:param name="usedby" />
+
+ <xsl:variable name="attr">
+ <xsl:call-template name="dot:render-attr-list">
+ <xsl:with-param name="attr-list">
+ <xsl:apply-templates select="." mode="dot:attr-extern" />
+ <xsl:apply-templates select="." mode="dot:attr-color" />
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$usedby" />
+ <xsl:text disable-output-escaping="yes">" -&gt; "</xsl:text>
+ <xsl:value-of select="@name" />
+ <xsl:text>"</xsl:text>
+
+ <xsl:if test="not( $attr='' )">
+ <xsl:text> [</xsl:text>
+ <xsl:value-of select="$attr" />
+ <xsl:text>]</xsl:text>
+ </xsl:if>
+
+ <xsl:text>;</xsl:text>
+
+ <xsl:value-of select="$dot:nl" />
+</xsl:template>
+
+
+<!--
+ Bail out if asked to render something unexpected
+-->
+<xsl:template match="*" mode="dot:depout" priority="1">
+ <xsl:message terminate="yes">
+ <xsl:text>error: what do I do!?: unexpected </xsl:text>
+ <xsl:value-of select="name()" />
+ </xsl:message>
+</xsl:template>
+
+
+<!--
+ Extra comments and attributes are ignored
+
+ text() is ignored, otherwise, extra whitespace corresponding to the
+ indentation of nodes appears in the output.
+
+ Ignoring attributes is just in case of an xpath whoopsie, but probably isn't
+ necessary, and is probably dangerous (because it may veil bugs).
+-->
+<xsl:template match="@*|text()" mode="dot:depout" priority="1">
+ <!-- ignore -->
+</xsl:template>
+
+
+</xsl:stylesheet>
+