290 lines
11 KiB
XML
290 lines
11 KiB
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
<!--
|
|
The original XML format is good for human use, but
|
|
difficult to interpret during code generation. This
|
|
lowers it to more repetitive & verbose, but easier
|
|
for the programs to interpret.
|
|
|
|
This is the first pass that folds all field tags into ld:field.
|
|
-->
|
|
<xsl:stylesheet version="1.0"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns:ld="http://github.com/peterix/dfhack/lowered-data-definition">
|
|
<!--
|
|
Global templates:
|
|
|
|
- Copy attributes and simple tags
|
|
- Bail out on unexpected tags
|
|
-->
|
|
|
|
<xsl:template match="@*">
|
|
<xsl:copy-of select='.'/>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="*">
|
|
<xsl:message terminate="yes">
|
|
Error: Unexpected tag: <xsl:value-of select='name(.)'/>
|
|
</xsl:message>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="/data-definition">
|
|
<ld:data-definition>
|
|
<xsl:apply-templates select='@*|node()'/>
|
|
</ld:data-definition>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="comment|code-helper|enum-attr|enum-item|item-attr">
|
|
<xsl:copy>
|
|
<xsl:apply-templates select='@*|node()'/>
|
|
</xsl:copy>
|
|
</xsl:template>
|
|
|
|
<xsl:template match="virtual-methods|cond-if|cond-else">
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:copy>
|
|
<xsl:apply-templates select='@*|node()'>
|
|
<xsl:with-param name='level' select="$level"/>
|
|
</xsl:apply-templates>
|
|
</xsl:copy>
|
|
</xsl:template>
|
|
|
|
<!-- Type defs: convert to one common 'global-type' tag name. -->
|
|
|
|
<xsl:template match='enum-type|bitfield-type|class-type|struct-type'>
|
|
<ld:global-type>
|
|
<xsl:attribute name='ld:meta'><xsl:value-of select='name(.)'/></xsl:attribute>
|
|
<xsl:attribute name='ld:level'>0</xsl:attribute>
|
|
<xsl:apply-templates select='@*|node()'>
|
|
<xsl:with-param name='level' select="1"/>
|
|
</xsl:apply-templates>
|
|
</ld:global-type>
|
|
</xsl:template>
|
|
|
|
<!-- Code to properly annotate references to types by name -->
|
|
|
|
<xsl:key name="primitive-type-lookup" match="prim-type" use="@ld:subtype"/>
|
|
<xsl:variable name="primitive-types-top" select="document('')/*/ld:primitive-types"/>
|
|
|
|
<xsl:template match="ld:primitive-types">
|
|
<xsl:param name="name"/>
|
|
<xsl:param name="level"/>
|
|
<xsl:param name="rq_global"/>
|
|
<xsl:variable name='item' select="key('primitive-type-lookup', $name)"/>
|
|
<xsl:choose>
|
|
<xsl:when test="$item">
|
|
<xsl:if test='$rq_global'>
|
|
<xsl:message terminate="yes">
|
|
Error: Cannot refer to primitive types from <xsl:value-of select='$rq_global'/>
|
|
</xsl:message>
|
|
</xsl:if>
|
|
<xsl:apply-templates select="$item/@*"/>
|
|
<xsl:apply-templates select="$item/*">
|
|
<xsl:with-param name='level' select="$level+1"/>
|
|
</xsl:apply-templates>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:attribute name='ld:meta'>global</xsl:attribute>
|
|
<xsl:attribute name='type-name'><xsl:value-of select='$name'/></xsl:attribute>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
<xsl:template name="lookup-type-ref">
|
|
<xsl:param name='name'/>
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:param name='rq_global'/>
|
|
<xsl:attribute name='ld:level'><xsl:value-of select='$level'/></xsl:attribute>
|
|
<xsl:apply-templates select="$primitive-types-top">
|
|
<xsl:with-param name="name" select="$name"/>
|
|
<xsl:with-param name="level" select="$level"/>
|
|
<xsl:with-param name="rq_global" select="$rq_global"/>
|
|
</xsl:apply-templates>
|
|
</xsl:template>
|
|
|
|
<!--
|
|
Fields:
|
|
|
|
- Fold into one generic 'field' tag.
|
|
- Add a 'level' attribute to assist in searching by name.
|
|
-->
|
|
|
|
<!-- Primitive types: -->
|
|
<ld:primitive-types>
|
|
<prim-type ld:meta='number' ld:subtype='int8_t' ld:bits='8'/>
|
|
<prim-type ld:meta='number' ld:subtype='uint8_t' ld:unsigned='true' ld:bits='8'/>
|
|
<prim-type ld:meta='number' ld:subtype='int16_t' ld:bits='16'/>
|
|
<prim-type ld:meta='number' ld:subtype='uint16_t' ld:unsigned='true' ld:bits='16'/>
|
|
<prim-type ld:meta='number' ld:subtype='int32_t' ld:bits='32'/>
|
|
<prim-type ld:meta='number' ld:subtype='uint32_t' ld:unsigned='true' ld:bits='32'/>
|
|
<prim-type ld:meta='number' ld:subtype='int64_t' ld:bits='64'/>
|
|
<prim-type ld:meta='number' ld:subtype='uint64_t' ld:unsigned='true' ld:bits='64'/>
|
|
<prim-type ld:meta='number' ld:subtype='bool' ld:bits='8'/>
|
|
<prim-type ld:meta='number' ld:subtype='s-float' ld:bits='32'/>
|
|
<prim-type ld:meta='number' ld:subtype='flag-bit' ld:bits='1'/>
|
|
|
|
<prim-type ld:meta='bytes' ld:subtype='padding'/>
|
|
<prim-type ld:meta='bytes' ld:subtype='static-string'/>
|
|
|
|
<prim-type ld:meta='pointer' ld:subtype='pointer'/>
|
|
<prim-type ld:meta='pointer' ld:subtype='ptr-string' ld:is-container='true'>
|
|
<static-string/>
|
|
</prim-type>
|
|
|
|
<prim-type ld:meta='primitive' ld:subtype='stl-string'/>
|
|
</ld:primitive-types>
|
|
|
|
<xsl:template match='int8_t|uint8_t|int16_t|uint16_t|int32_t|uint32_t|int64_t|uint64_t|bool|flag-bit|s-float|padding|static-string|ptr-string|stl-string'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<ld:field>
|
|
<xsl:apply-templates select='@*'/>
|
|
<xsl:call-template name='lookup-type-ref'>
|
|
<xsl:with-param name="name" select="name(.)"/>
|
|
<xsl:with-param name="level" select="$level"/>
|
|
</xsl:call-template>
|
|
<xsl:apply-templates select='node()'/>
|
|
</ld:field>
|
|
</xsl:template>
|
|
|
|
<!--
|
|
Compound, enum or bitfield:
|
|
|
|
- When a proxy: meta='global' subtype='$tag' type-name='blah'
|
|
- When an ad-hoc compound: meta='compound' subtype='$tag'
|
|
- Level not incremented unless it has a name.
|
|
-->
|
|
<xsl:template name='compound'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:param name='level_shift' select='1'/>
|
|
<xsl:param name='rq_global'/>
|
|
<xsl:apply-templates select='@*'/>
|
|
<xsl:choose>
|
|
<xsl:when test='@type-name'>
|
|
<xsl:call-template name='lookup-type-ref'>
|
|
<xsl:with-param name='name' select="@type-name"/>
|
|
<xsl:with-param name="level" select="$level"/>
|
|
<xsl:with-param name='rq_global' select="$rq_global"/>
|
|
</xsl:call-template>
|
|
<xsl:apply-templates select='node()'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:attribute name='ld:level'><xsl:value-of select='$level'/></xsl:attribute>
|
|
<xsl:attribute name='ld:meta'>compound</xsl:attribute>
|
|
<xsl:apply-templates select='node()'>
|
|
<xsl:with-param name='level' select="$level+$level_shift"/>
|
|
</xsl:apply-templates>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
<xsl:template match='compound'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<ld:field>
|
|
<xsl:if test="not(@name|@type-name)">
|
|
<xsl:attribute name='ld:anon-compound'>true</xsl:attribute>
|
|
</xsl:if>
|
|
<xsl:call-template name='compound'>
|
|
<xsl:with-param name='level' select="$level"/>
|
|
<xsl:with-param name='level_shift' select="count(@name)"/>
|
|
</xsl:call-template>
|
|
</ld:field>
|
|
</xsl:template>
|
|
|
|
<xsl:template match='bitfield|enum'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<ld:field>
|
|
<xsl:attribute name='ld:subtype'><xsl:value-of select='name(.)'/></xsl:attribute>
|
|
<xsl:call-template name='compound'>
|
|
<xsl:with-param name='level' select="$level"/>
|
|
<xsl:with-param name='rq_global' select="name(.)"/>
|
|
</xsl:call-template>
|
|
</ld:field>
|
|
</xsl:template>
|
|
|
|
<!-- Generic container helper: resolve type-name to a field, then process subtags. -->
|
|
<xsl:template name='container'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:attribute name='ld:is-container'>true</xsl:attribute>
|
|
<xsl:choose>
|
|
<xsl:when test='@type-name'>
|
|
<ld:field>
|
|
<xsl:call-template name='lookup-type-ref'>
|
|
<xsl:with-param name='name' select="@type-name"/>
|
|
<xsl:with-param name="level" select="$level"/>
|
|
</xsl:call-template>
|
|
</ld:field>
|
|
<xsl:apply-templates select='node()'/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:apply-templates select='node()'>
|
|
<xsl:with-param name='level' select="$level"/>
|
|
</xsl:apply-templates>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
<!-- Special containers: meta='$tag' -->
|
|
<xsl:template match='static-array|pointer'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<ld:field>
|
|
<xsl:attribute name='ld:level'><xsl:value-of select='$level'/></xsl:attribute>
|
|
<xsl:attribute name='ld:meta'><xsl:value-of select='name(.)'/></xsl:attribute>
|
|
<xsl:apply-templates select='@*'/>
|
|
<xsl:call-template name='container'>
|
|
<xsl:with-param name='level' select="$level+1"/>
|
|
</xsl:call-template>
|
|
</ld:field>
|
|
</xsl:template>
|
|
|
|
<!-- Misc containers: meta='container' subtype='$tag' -->
|
|
<xsl:template match='stl-vector|df-flagarray|stl-bit-vector'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<ld:field ld:meta='container'>
|
|
<xsl:attribute name='ld:level'><xsl:value-of select='$level'/></xsl:attribute>
|
|
<xsl:attribute name='ld:subtype'><xsl:value-of select='name(.)'/></xsl:attribute>
|
|
<xsl:apply-templates select='@*'/>
|
|
<xsl:call-template name='container'>
|
|
<xsl:with-param name='level' select="$level+1"/>
|
|
</xsl:call-template>
|
|
</ld:field>
|
|
</xsl:template>
|
|
|
|
<!-- Virtual methods -->
|
|
|
|
<xsl:template match='vmethod'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:copy>
|
|
<xsl:attribute name='ld:level'><xsl:value-of select='$level'/></xsl:attribute>
|
|
<xsl:apply-templates select='@*'/>
|
|
<xsl:if test='@ret-type'>
|
|
<xsl:copy-of select='text()[1]'/>
|
|
<ret-type>
|
|
<xsl:call-template name='lookup-type-ref'>
|
|
<xsl:with-param name='name' select="@ret-type"/>
|
|
<xsl:with-param name="level" select="$level+1"/>
|
|
</xsl:call-template>
|
|
</ret-type>
|
|
</xsl:if>
|
|
<xsl:apply-templates select='node()'>
|
|
<xsl:with-param name='level' select="$level+1"/>
|
|
</xsl:apply-templates>
|
|
</xsl:copy>
|
|
</xsl:template>
|
|
|
|
<xsl:template match='ret-type'>
|
|
<xsl:param name='level' select='-1'/>
|
|
<xsl:copy>
|
|
<xsl:call-template name='compound'>
|
|
<xsl:with-param name='level' select="$level"/>
|
|
</xsl:call-template>
|
|
</xsl:copy>
|
|
</xsl:template>
|
|
</xsl:stylesheet>
|
|
|
|
<!--
|
|
Local Variables:
|
|
indent-tabs-mode: nil
|
|
nxml-child-indent: 4
|
|
End:
|
|
-->
|