xref: /aosp_15_r20/prebuilts/build-tools/common/bison/xslt/xml2dot.xsl (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker<?xml version="1.0" encoding="UTF-8"?>
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker<!--
4*cda5da8dSAndroid Build Coastguard Worker    xml2dot.xsl - transform Bison XML Report into DOT.
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Worker    Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc.
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Worker    This file is part of Bison, the GNU Compiler Compiler.
9*cda5da8dSAndroid Build Coastguard Worker
10*cda5da8dSAndroid Build Coastguard Worker    This program is free software: you can redistribute it and/or modify
11*cda5da8dSAndroid Build Coastguard Worker    it under the terms of the GNU General Public License as published by
12*cda5da8dSAndroid Build Coastguard Worker    the Free Software Foundation, either version 3 of the License, or
13*cda5da8dSAndroid Build Coastguard Worker    (at your option) any later version.
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Worker    This program is distributed in the hope that it will be useful,
16*cda5da8dSAndroid Build Coastguard Worker    but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cda5da8dSAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cda5da8dSAndroid Build Coastguard Worker    GNU General Public License for more details.
19*cda5da8dSAndroid Build Coastguard Worker
20*cda5da8dSAndroid Build Coastguard Worker    You should have received a copy of the GNU General Public License
21*cda5da8dSAndroid Build Coastguard Worker    along with this program.  If not, see <https://www.gnu.org/licenses/>.
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker    Written by Wojciech Polak <[email protected]>.
24*cda5da8dSAndroid Build Coastguard Worker  -->
25*cda5da8dSAndroid Build Coastguard Worker
26*cda5da8dSAndroid Build Coastguard Worker<xsl:stylesheet version="1.0"
27*cda5da8dSAndroid Build Coastguard Worker  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
28*cda5da8dSAndroid Build Coastguard Worker  xmlns:bison="https://www.gnu.org/software/bison/">
29*cda5da8dSAndroid Build Coastguard Worker
30*cda5da8dSAndroid Build Coastguard Worker<xsl:import href="bison.xsl"/>
31*cda5da8dSAndroid Build Coastguard Worker<xsl:output method="text" encoding="UTF-8" indent="no"/>
32*cda5da8dSAndroid Build Coastguard Worker
33*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="/">
34*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="bison-xml-report"/>
35*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
36*cda5da8dSAndroid Build Coastguard Worker
37*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="bison-xml-report">
38*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>// Generated by GNU Bison </xsl:text>
39*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="@version"/>
40*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>.&#10;</xsl:text>
41*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>// Report bugs to &lt;</xsl:text>
42*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="@bug-report"/>
43*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>&gt;.&#10;</xsl:text>
44*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>// Home page: &lt;</xsl:text>
45*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="@url"/>
46*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>&gt;.&#10;&#10;</xsl:text>
47*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="automaton">
48*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="filename" select="filename"/>
49*cda5da8dSAndroid Build Coastguard Worker  </xsl:apply-templates>
50*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
51*cda5da8dSAndroid Build Coastguard Worker
52*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="automaton">
53*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="filename"/>
54*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>digraph "</xsl:text>
55*cda5da8dSAndroid Build Coastguard Worker  <xsl:call-template name="escape">
56*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="subject" select="$filename"/>
57*cda5da8dSAndroid Build Coastguard Worker  </xsl:call-template>
58*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>"&#10;{
59*cda5da8dSAndroid Build Coastguard Worker  node [fontname = courier, shape = box, colorscheme = paired6]
60*cda5da8dSAndroid Build Coastguard Worker  edge [fontname = courier]
61*cda5da8dSAndroid Build Coastguard Worker
62*cda5da8dSAndroid Build Coastguard Worker</xsl:text>
63*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="state"/>
64*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>}&#10;</xsl:text>
65*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
66*cda5da8dSAndroid Build Coastguard Worker
67*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="automaton/state">
68*cda5da8dSAndroid Build Coastguard Worker  <xsl:call-template name="output-node">
69*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="number" select="@number"/>
70*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="label">
71*cda5da8dSAndroid Build Coastguard Worker      <xsl:apply-templates select="itemset/item"/>
72*cda5da8dSAndroid Build Coastguard Worker    </xsl:with-param>
73*cda5da8dSAndroid Build Coastguard Worker  </xsl:call-template>
74*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="actions/transitions"/>
75*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="actions/reductions">
76*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="staten">
77*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="@number"/>
78*cda5da8dSAndroid Build Coastguard Worker    </xsl:with-param>
79*cda5da8dSAndroid Build Coastguard Worker  </xsl:apply-templates>
80*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
81*cda5da8dSAndroid Build Coastguard Worker
82*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="actions/reductions">
83*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="staten"/>
84*cda5da8dSAndroid Build Coastguard Worker  <xsl:for-each select='reduction'>
85*cda5da8dSAndroid Build Coastguard Worker    <!-- These variables are needed because the current context can't be
86*cda5da8dSAndroid Build Coastguard Worker         referred to directly in XPath expressions. -->
87*cda5da8dSAndroid Build Coastguard Worker    <xsl:variable name="rul">
88*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="@rule"/>
89*cda5da8dSAndroid Build Coastguard Worker    </xsl:variable>
90*cda5da8dSAndroid Build Coastguard Worker    <xsl:variable name="ena">
91*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="@enabled"/>
92*cda5da8dSAndroid Build Coastguard Worker    </xsl:variable>
93*cda5da8dSAndroid Build Coastguard Worker    <!-- The foreach's body is protected by this, so that we are actually
94*cda5da8dSAndroid Build Coastguard Worker         going to iterate once per reduction rule, and not per lookahead. -->
95*cda5da8dSAndroid Build Coastguard Worker    <xsl:if test='not(preceding-sibling::*[@rule=$rul and @enabled=$ena])'>
96*cda5da8dSAndroid Build Coastguard Worker      <xsl:variable name="rule">
97*cda5da8dSAndroid Build Coastguard Worker        <xsl:choose>
98*cda5da8dSAndroid Build Coastguard Worker          <!-- The acceptation state is referred to as 'accept' in the XML, but
99*cda5da8dSAndroid Build Coastguard Worker               just as '0' in the DOT. -->
100*cda5da8dSAndroid Build Coastguard Worker          <xsl:when test="@rule='accept'">
101*cda5da8dSAndroid Build Coastguard Worker            <xsl:text>0</xsl:text>
102*cda5da8dSAndroid Build Coastguard Worker          </xsl:when>
103*cda5da8dSAndroid Build Coastguard Worker          <xsl:otherwise>
104*cda5da8dSAndroid Build Coastguard Worker            <xsl:value-of select="@rule"/>
105*cda5da8dSAndroid Build Coastguard Worker          </xsl:otherwise>
106*cda5da8dSAndroid Build Coastguard Worker        </xsl:choose>
107*cda5da8dSAndroid Build Coastguard Worker      </xsl:variable>
108*cda5da8dSAndroid Build Coastguard Worker
109*cda5da8dSAndroid Build Coastguard Worker      <!-- The edge's beginning -->
110*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="reduction-edge-start">
111*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="state" select="$staten"/>
112*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="rule" select="$rule"/>
113*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="enabled" select="@enabled"/>
114*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
115*cda5da8dSAndroid Build Coastguard Worker
116*cda5da8dSAndroid Build Coastguard Worker      <!-- The edge's tokens -->
117*cda5da8dSAndroid Build Coastguard Worker      <!-- Don't show labels for the default action. In other cases, there will
118*cda5da8dSAndroid Build Coastguard Worker           always be at least one token, so 'label="[]"' will not occur. -->
119*cda5da8dSAndroid Build Coastguard Worker      <xsl:if test='$rule!=0 and not(../reduction[@enabled=$ena and @rule=$rule and @symbol="$default"])'>
120*cda5da8dSAndroid Build Coastguard Worker        <xsl:text>label="[</xsl:text>
121*cda5da8dSAndroid Build Coastguard Worker        <xsl:for-each select='../reduction[@enabled=$ena and @rule=$rule]'>
122*cda5da8dSAndroid Build Coastguard Worker          <xsl:call-template name="escape">
123*cda5da8dSAndroid Build Coastguard Worker            <xsl:with-param name="subject" select="@symbol"/>
124*cda5da8dSAndroid Build Coastguard Worker          </xsl:call-template>
125*cda5da8dSAndroid Build Coastguard Worker          <xsl:if test="position() != last ()">
126*cda5da8dSAndroid Build Coastguard Worker            <xsl:text>, </xsl:text>
127*cda5da8dSAndroid Build Coastguard Worker          </xsl:if>
128*cda5da8dSAndroid Build Coastguard Worker        </xsl:for-each>
129*cda5da8dSAndroid Build Coastguard Worker        <xsl:text>]", </xsl:text>
130*cda5da8dSAndroid Build Coastguard Worker      </xsl:if>
131*cda5da8dSAndroid Build Coastguard Worker
132*cda5da8dSAndroid Build Coastguard Worker      <!-- The edge's end -->
133*cda5da8dSAndroid Build Coastguard Worker      <xsl:text>style=solid]&#10;</xsl:text>
134*cda5da8dSAndroid Build Coastguard Worker
135*cda5da8dSAndroid Build Coastguard Worker      <!-- The diamond representing the reduction -->
136*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="reduction-node">
137*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="state" select="$staten"/>
138*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="rule" select="$rule"/>
139*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="color">
140*cda5da8dSAndroid Build Coastguard Worker          <xsl:choose>
141*cda5da8dSAndroid Build Coastguard Worker            <xsl:when test='@enabled="true"'>
142*cda5da8dSAndroid Build Coastguard Worker              <xsl:text>3</xsl:text>
143*cda5da8dSAndroid Build Coastguard Worker            </xsl:when>
144*cda5da8dSAndroid Build Coastguard Worker            <xsl:otherwise>
145*cda5da8dSAndroid Build Coastguard Worker              <xsl:text>5</xsl:text>
146*cda5da8dSAndroid Build Coastguard Worker            </xsl:otherwise>
147*cda5da8dSAndroid Build Coastguard Worker          </xsl:choose>
148*cda5da8dSAndroid Build Coastguard Worker        </xsl:with-param>
149*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
150*cda5da8dSAndroid Build Coastguard Worker    </xsl:if>
151*cda5da8dSAndroid Build Coastguard Worker  </xsl:for-each>
152*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
153*cda5da8dSAndroid Build Coastguard Worker
154*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="actions/transitions">
155*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="transition"/>
156*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
157*cda5da8dSAndroid Build Coastguard Worker
158*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="item">
159*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="prev-rule-number"
160*cda5da8dSAndroid Build Coastguard Worker    select="preceding-sibling::item[1]/@rule-number"/>
161*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)">
162*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="dot" select="@dot"/>
163*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="num" select="@rule-number"/>
164*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="prev-lhs"
165*cda5da8dSAndroid Build Coastguard Worker      select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
166*cda5da8dSAndroid Build Coastguard Worker   />
167*cda5da8dSAndroid Build Coastguard Worker  </xsl:apply-templates>
168*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="lookaheads"/>
169*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
170*cda5da8dSAndroid Build Coastguard Worker
171*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="rule">
172*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="dot"/>
173*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="num"/>
174*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="prev-lhs"/>
175*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>&#10;</xsl:text>
176*cda5da8dSAndroid Build Coastguard Worker  <xsl:choose>
177*cda5da8dSAndroid Build Coastguard Worker    <xsl:when test="$num &lt; 10">
178*cda5da8dSAndroid Build Coastguard Worker      <xsl:text>  </xsl:text>
179*cda5da8dSAndroid Build Coastguard Worker    </xsl:when>
180*cda5da8dSAndroid Build Coastguard Worker    <xsl:when test="$num &lt; 100">
181*cda5da8dSAndroid Build Coastguard Worker      <xsl:text> </xsl:text>
182*cda5da8dSAndroid Build Coastguard Worker    </xsl:when>
183*cda5da8dSAndroid Build Coastguard Worker    <xsl:otherwise>
184*cda5da8dSAndroid Build Coastguard Worker      <xsl:text></xsl:text>
185*cda5da8dSAndroid Build Coastguard Worker    </xsl:otherwise>
186*cda5da8dSAndroid Build Coastguard Worker  </xsl:choose>
187*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$num"/>
188*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> </xsl:text>
189*cda5da8dSAndroid Build Coastguard Worker  <xsl:choose>
190*cda5da8dSAndroid Build Coastguard Worker  <xsl:when test="$prev-lhs = lhs[text()]">
191*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="lpad">
192*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="str" select="'|'"/>
193*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="pad" select="number(string-length(lhs[text()])) + 1"/>
194*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
195*cda5da8dSAndroid Build Coastguard Worker    </xsl:when>
196*cda5da8dSAndroid Build Coastguard Worker    <xsl:otherwise>
197*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="lhs"/>
198*cda5da8dSAndroid Build Coastguard Worker      <xsl:text>:</xsl:text>
199*cda5da8dSAndroid Build Coastguard Worker    </xsl:otherwise>
200*cda5da8dSAndroid Build Coastguard Worker  </xsl:choose>
201*cda5da8dSAndroid Build Coastguard Worker  <xsl:if test="$dot = 0">
202*cda5da8dSAndroid Build Coastguard Worker    <xsl:text> .</xsl:text>
203*cda5da8dSAndroid Build Coastguard Worker  </xsl:if>
204*cda5da8dSAndroid Build Coastguard Worker
205*cda5da8dSAndroid Build Coastguard Worker  <!-- RHS -->
206*cda5da8dSAndroid Build Coastguard Worker  <xsl:for-each select="rhs/symbol|rhs/empty">
207*cda5da8dSAndroid Build Coastguard Worker    <xsl:apply-templates select="."/>
208*cda5da8dSAndroid Build Coastguard Worker    <xsl:if test="$dot = position()">
209*cda5da8dSAndroid Build Coastguard Worker      <xsl:text> .</xsl:text>
210*cda5da8dSAndroid Build Coastguard Worker    </xsl:if>
211*cda5da8dSAndroid Build Coastguard Worker  </xsl:for-each>
212*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
213*cda5da8dSAndroid Build Coastguard Worker
214*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="symbol">
215*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> </xsl:text>
216*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="."/>
217*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
218*cda5da8dSAndroid Build Coastguard Worker
219*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="empty">
220*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> %empty</xsl:text>
221*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
222*cda5da8dSAndroid Build Coastguard Worker
223*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="lookaheads">
224*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>  [</xsl:text>
225*cda5da8dSAndroid Build Coastguard Worker  <xsl:apply-templates select="symbol"/>
226*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>]</xsl:text>
227*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
228*cda5da8dSAndroid Build Coastguard Worker
229*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="lookaheads/symbol">
230*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="."/>
231*cda5da8dSAndroid Build Coastguard Worker  <xsl:if test="position() != last()">
232*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>, </xsl:text>
233*cda5da8dSAndroid Build Coastguard Worker  </xsl:if>
234*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
235*cda5da8dSAndroid Build Coastguard Worker
236*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="reduction-edge-start">
237*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="state"/>
238*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="rule"/>
239*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="enabled"/>
240*cda5da8dSAndroid Build Coastguard Worker
241*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>  </xsl:text>
242*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$state"/>
243*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> -> "</xsl:text>
244*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$state"/>
245*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>R</xsl:text>
246*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$rule"/>
247*cda5da8dSAndroid Build Coastguard Worker  <xsl:if test='$enabled = "false"'>
248*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>d</xsl:text>
249*cda5da8dSAndroid Build Coastguard Worker  </xsl:if>
250*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>" [</xsl:text>
251*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
252*cda5da8dSAndroid Build Coastguard Worker
253*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="reduction-node">
254*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="state"/>
255*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="rule"/>
256*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="color"/>
257*cda5da8dSAndroid Build Coastguard Worker
258*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> "</xsl:text>
259*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$state"/>
260*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>R</xsl:text>
261*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$rule"/>
262*cda5da8dSAndroid Build Coastguard Worker  <xsl:if test="$color = 5">
263*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>d</xsl:text>
264*cda5da8dSAndroid Build Coastguard Worker  </xsl:if>
265*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>" [label="</xsl:text>
266*cda5da8dSAndroid Build Coastguard Worker  <xsl:choose>
267*cda5da8dSAndroid Build Coastguard Worker  <xsl:when test="$rule = 0">
268*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>Acc", fillcolor=1</xsl:text>
269*cda5da8dSAndroid Build Coastguard Worker  </xsl:when>
270*cda5da8dSAndroid Build Coastguard Worker  <xsl:otherwise>
271*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>R</xsl:text>
272*cda5da8dSAndroid Build Coastguard Worker    <xsl:value-of select="$rule"/>
273*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>", fillcolor=</xsl:text>
274*cda5da8dSAndroid Build Coastguard Worker    <xsl:value-of select="$color"/>
275*cda5da8dSAndroid Build Coastguard Worker  </xsl:otherwise>
276*cda5da8dSAndroid Build Coastguard Worker  </xsl:choose>
277*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>, shape=diamond, style=filled]&#10;</xsl:text>
278*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
279*cda5da8dSAndroid Build Coastguard Worker
280*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="transition">
281*cda5da8dSAndroid Build Coastguard Worker  <xsl:call-template name="output-edge">
282*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="src" select="../../../@number"/>
283*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="dst" select="@state"/>
284*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="style">
285*cda5da8dSAndroid Build Coastguard Worker      <xsl:choose>
286*cda5da8dSAndroid Build Coastguard Worker        <xsl:when test="@symbol = 'error'">
287*cda5da8dSAndroid Build Coastguard Worker          <xsl:text>dotted</xsl:text>
288*cda5da8dSAndroid Build Coastguard Worker        </xsl:when>
289*cda5da8dSAndroid Build Coastguard Worker        <xsl:when test="@type = 'shift'">
290*cda5da8dSAndroid Build Coastguard Worker          <xsl:text>solid</xsl:text>
291*cda5da8dSAndroid Build Coastguard Worker        </xsl:when>
292*cda5da8dSAndroid Build Coastguard Worker        <xsl:otherwise>
293*cda5da8dSAndroid Build Coastguard Worker          <xsl:text>dashed</xsl:text>
294*cda5da8dSAndroid Build Coastguard Worker        </xsl:otherwise>
295*cda5da8dSAndroid Build Coastguard Worker      </xsl:choose>
296*cda5da8dSAndroid Build Coastguard Worker    </xsl:with-param>
297*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="label">
298*cda5da8dSAndroid Build Coastguard Worker      <xsl:if test="not(@symbol = 'error')">
299*cda5da8dSAndroid Build Coastguard Worker        <xsl:value-of select="@symbol"/>
300*cda5da8dSAndroid Build Coastguard Worker      </xsl:if>
301*cda5da8dSAndroid Build Coastguard Worker    </xsl:with-param>
302*cda5da8dSAndroid Build Coastguard Worker  </xsl:call-template>
303*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
304*cda5da8dSAndroid Build Coastguard Worker
305*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="output-node">
306*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="number"/>
307*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="label"/>
308*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>  </xsl:text>
309*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$number"/>
310*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> [label="</xsl:text>
311*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>State </xsl:text>
312*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$number"/>
313*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>\n</xsl:text>
314*cda5da8dSAndroid Build Coastguard Worker  <xsl:call-template name="escape">
315*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="subject" select="$label"/>
316*cda5da8dSAndroid Build Coastguard Worker  </xsl:call-template>
317*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>\l"]&#10;</xsl:text>
318*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
319*cda5da8dSAndroid Build Coastguard Worker
320*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="output-edge">
321*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="src"/>
322*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="dst"/>
323*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="style"/>
324*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="label"/>
325*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>  </xsl:text>
326*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$src"/>
327*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> -> </xsl:text>
328*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$dst"/>
329*cda5da8dSAndroid Build Coastguard Worker  <xsl:text> [style=</xsl:text>
330*cda5da8dSAndroid Build Coastguard Worker  <xsl:value-of select="$style"/>
331*cda5da8dSAndroid Build Coastguard Worker  <xsl:if test="$label and $label != ''">
332*cda5da8dSAndroid Build Coastguard Worker    <xsl:text> label="</xsl:text>
333*cda5da8dSAndroid Build Coastguard Worker    <xsl:call-template name="escape">
334*cda5da8dSAndroid Build Coastguard Worker      <xsl:with-param name="subject" select="$label"/>
335*cda5da8dSAndroid Build Coastguard Worker    </xsl:call-template>
336*cda5da8dSAndroid Build Coastguard Worker    <xsl:text>"</xsl:text>
337*cda5da8dSAndroid Build Coastguard Worker  </xsl:if>
338*cda5da8dSAndroid Build Coastguard Worker  <xsl:text>]&#10;</xsl:text>
339*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
340*cda5da8dSAndroid Build Coastguard Worker
341*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="escape">
342*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="subject"/> <!-- required -->
343*cda5da8dSAndroid Build Coastguard Worker  <xsl:call-template name="string-replace">
344*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="subject">
345*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="string-replace">
346*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="subject">
347*cda5da8dSAndroid Build Coastguard Worker          <xsl:call-template name="string-replace">
348*cda5da8dSAndroid Build Coastguard Worker            <xsl:with-param name="subject" select="$subject"/>
349*cda5da8dSAndroid Build Coastguard Worker            <xsl:with-param name="search" select="'\'"/>
350*cda5da8dSAndroid Build Coastguard Worker            <xsl:with-param name="replace" select="'\\'"/>
351*cda5da8dSAndroid Build Coastguard Worker          </xsl:call-template>
352*cda5da8dSAndroid Build Coastguard Worker        </xsl:with-param>
353*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="search" select="'&quot;'"/>
354*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="replace" select="'\&quot;'"/>
355*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
356*cda5da8dSAndroid Build Coastguard Worker    </xsl:with-param>
357*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="search" select="'&#10;'"/>
358*cda5da8dSAndroid Build Coastguard Worker    <xsl:with-param name="replace" select="'\l'"/>
359*cda5da8dSAndroid Build Coastguard Worker  </xsl:call-template>
360*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
361*cda5da8dSAndroid Build Coastguard Worker
362*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="string-replace">
363*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="subject"/>
364*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="search"/>
365*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="replace"/>
366*cda5da8dSAndroid Build Coastguard Worker  <xsl:choose>
367*cda5da8dSAndroid Build Coastguard Worker    <xsl:when test="contains($subject, $search)">
368*cda5da8dSAndroid Build Coastguard Worker      <xsl:variable name="before" select="substring-before($subject, $search)"/>
369*cda5da8dSAndroid Build Coastguard Worker      <xsl:variable name="after" select="substring-after($subject, $search)"/>
370*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="$before"/>
371*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="$replace"/>
372*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="string-replace">
373*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="subject" select="$after"/>
374*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="search" select="$search"/>
375*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="replace" select="$replace"/>
376*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
377*cda5da8dSAndroid Build Coastguard Worker    </xsl:when>
378*cda5da8dSAndroid Build Coastguard Worker    <xsl:otherwise>
379*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="$subject"/>
380*cda5da8dSAndroid Build Coastguard Worker    </xsl:otherwise>
381*cda5da8dSAndroid Build Coastguard Worker  </xsl:choose>
382*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
383*cda5da8dSAndroid Build Coastguard Worker
384*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="lpad">
385*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="str" select="''"/>
386*cda5da8dSAndroid Build Coastguard Worker  <xsl:param name="pad" select="0"/>
387*cda5da8dSAndroid Build Coastguard Worker  <xsl:variable name="diff" select="$pad - string-length($str)" />
388*cda5da8dSAndroid Build Coastguard Worker  <xsl:choose>
389*cda5da8dSAndroid Build Coastguard Worker    <xsl:when test="$diff &lt; 0">
390*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="$str"/>
391*cda5da8dSAndroid Build Coastguard Worker    </xsl:when>
392*cda5da8dSAndroid Build Coastguard Worker    <xsl:otherwise>
393*cda5da8dSAndroid Build Coastguard Worker      <xsl:call-template name="space">
394*cda5da8dSAndroid Build Coastguard Worker        <xsl:with-param name="repeat" select="$diff"/>
395*cda5da8dSAndroid Build Coastguard Worker      </xsl:call-template>
396*cda5da8dSAndroid Build Coastguard Worker      <xsl:value-of select="$str"/>
397*cda5da8dSAndroid Build Coastguard Worker    </xsl:otherwise>
398*cda5da8dSAndroid Build Coastguard Worker  </xsl:choose>
399*cda5da8dSAndroid Build Coastguard Worker</xsl:template>
400*cda5da8dSAndroid Build Coastguard Worker
401*cda5da8dSAndroid Build Coastguard Worker</xsl:stylesheet>
402