• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?xml version="1.0" ?>
2
3<!--
4Copyright (c) 2002-2003 The Trustees of Indiana University.
5                        All rights reserved.
6Copyright (c) 2000-2001 University of Notre Dame. All rights reserved.
7
8   Distributed under the Boost Software License, Version 1.0.
9   (See accompanying file LICENSE_1_0.txt or copy at
10   http://www.boost.org/LICENSE_1_0.txt) -->
11
12<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
13  <xsl:template name="unparse-cpp">
14    <xsl:param name="typeref"/>
15    <xsl:param name="definition_list"/>
16    <xsl:param name="priority">0</xsl:param>
17    <xsl:param name="ignore-cv" select="false()"/>
18    <xsl:param name="ignore-references" select="false()"/>
19    <xsl:param name="notations"/>
20    <xsl:param name="ignore-notation" select="false()"/>
21    <xsl:param name="print-updated-notation" select="false()"/>
22    <xsl:param name="use-typename" select="false()"/>
23    <xsl:param name="const-if-not-mutable-value" select="'const-if-not-mutable'"/>
24
25    <xsl:variable name="notation_check">
26      <xsl:if test="not($ignore-notation)"> <!-- Prevent infinite recursion -->
27	<xsl:call-template name="unparse-cpp">
28	  <xsl:with-param name="typeref" select="$typeref"/>
29	  <xsl:with-param name="definition_list" select="$definition_list"/>
30	  <xsl:with-param name="priority">0</xsl:with-param>
31	  <xsl:with-param name="ignore-cv" select="true()"/>
32	  <xsl:with-param name="ignore-references" select="true()"/>
33	  <xsl:with-param name="notations" select="$notations"/>
34	  <xsl:with-param name="ignore-notation" select="true()"/>
35	  <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
36	</xsl:call-template>
37      </xsl:if>
38    </xsl:variable>
39
40    <!--
41    <xsl:message>Notation check: <xsl:value-of select="$notation_check"/>
42		 Notations: <xsl:value-of select="$notations"/>
43    </xsl:message> -->
44
45    <xsl:variable name="this_op_priority" select="document('cpp-operators.xml')/operator-list/op[@name=name($typeref)]/apply/@priority"/>
46
47    <xsl:variable name="result">
48
49      <xsl:variable name="subcall_priority">
50	<xsl:choose>
51	  <xsl:when test="true() or ($this_op_priority &gt; $priority)">
52	    <xsl:value-of select="$this_op_priority"/>
53	  </xsl:when>
54	  <!-- <xsl:otherwise>0</xsl:otherwise> -->
55	</xsl:choose>
56      </xsl:variable>
57
58      <xsl:if test="$this_op_priority &lt;= $priority">(</xsl:if>
59
60      <xsl:choose>
61
62	<xsl:when test="name($typeref)='sample-value'"
63	  >boost::sample_value &lt; <xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="ignore-references" select="$ignore-references"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template> &gt;()</xsl:when>
64
65	<xsl:when test="name($typeref)='reference-to'"
66	  ><xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="priority" select="$subcall_priority"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template><xsl:if test="not($ignore-references)"> &amp;</xsl:if></xsl:when>
67
68	<xsl:when test="name($typeref)='pointer-to'"
69	  ><xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="priority" select="$subcall_priority"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/></xsl:call-template> *</xsl:when>
70
71	<xsl:when test="name($typeref)='const'"
72	><xsl:if test="not($ignore-cv)">const </xsl:if><xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="priority" select="$subcall_priority"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="ignore-references" select="$ignore-references"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template>
73	</xsl:when>
74
75	<xsl:when test="name($typeref)='const-if-not-mutable'"
76	><xsl:if test="not($ignore-cv)"><xsl:value-of select="$const-if-not-mutable-value"/><xsl:if test="$const-if-not-mutable-value"><xsl:text> </xsl:text></xsl:if></xsl:if><xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="priority" select="$subcall_priority"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="ignore-references" select="$ignore-references"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template>
77	</xsl:when>
78
79	<xsl:when test="name($typeref)='volatile'"
80	><xsl:if test="not($ignore-cv)">volatile </xsl:if><xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="priority" select="$subcall_priority"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="ignore-references" select="$ignore-references"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template>
81	</xsl:when>
82
83	<xsl:when test="name($typeref)='apply-template'">
84	  <xsl:value-of select="$typeref/@name"/>&lt;<xsl:for-each select="$typeref/*">
85	      <xsl:if test="position()!=1">, </xsl:if><xsl:comment/>
86	      <xsl:call-template name="unparse-cpp">
87		<xsl:with-param name="typeref" select="."/>
88		<xsl:with-param name="definition_list" select="$definition_list"/>
89		<xsl:with-param name="ignore-cv" select="$ignore-cv"/>
90		<xsl:with-param name="notations" select="$notations"/>
91		<xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
92	      </xsl:call-template></xsl:for-each
93	    ><xsl:comment/>&gt;</xsl:when>
94
95	<xsl:when test="name($typeref)='get-member-type'">
96	  <xsl:call-template name="unparse-cpp"><xsl:with-param name="typeref" select="$typeref/*[1]"/><xsl:with-param name="definition_list" select="$definition_list"/><xsl:with-param name="ignore-cv" select="$ignore-cv"/><xsl:with-param name="notations" select="$notations"/><xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/></xsl:call-template>::<xsl:value-of select="$typeref/@name"/>
97	</xsl:when>
98
99	<xsl:when test="name($typeref)='type'">
100	  <xsl:variable name="typeref_value" select="normalize-space(substring-before(substring-after($definition_list,concat('@(@',$typeref/@name,'=')),'@)@'))"/>
101	  <xsl:choose>
102	    <xsl:when test="$typeref_value=''">
103	      <xsl:value-of select="$typeref/@name"/><xsl:comment/>
104	    </xsl:when>
105	    <xsl:otherwise>
106	      <xsl:value-of select="$typeref_value"/><xsl:comment/>
107	    </xsl:otherwise>
108	  </xsl:choose>
109	</xsl:when>
110
111	<xsl:when test="name($typeref)='documentation'"/>
112
113	<xsl:when test="document('cpp-operators.xml')/operator-list/op[@name=name($typeref)]">
114	  <xsl:variable name="op_file" select="document('cpp-operators.xml')/operator-list"/>
115	  <xsl:variable name="op_info" select="$op_file/op[@name=name($typeref)]/apply/."/>
116
117	  <xsl:call-template name="unparse-operator-definition">
118	    <xsl:with-param name="typeref" select="$typeref"/>
119	    <xsl:with-param name="operator_nodeset" select="$op_info/child::node()"/>
120	    <xsl:with-param name="my_priority" select="$subcall_priority"/>
121	    <xsl:with-param name="definition_list" select="$definition_list"/>
122	    <xsl:with-param name="notations" select="$notations"/>
123	    <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
124	    <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
125	    <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
126	  </xsl:call-template>
127
128	</xsl:when>
129
130	<xsl:otherwise>
131	  (Unrecognized tag <xsl:value-of select="name($typeref)"/>)
132	</xsl:otherwise>
133      </xsl:choose>
134
135      <!-- Close parenthesis code moved below -->
136
137    </xsl:variable>
138
139    <!-- <xsl:message>ignore-notation = <xsl:value-of select="$ignore-notation"/></xsl:message> -->
140    <!-- <xsl:message>notation_check = <xsl:value-of select="$notation_check"/></xsl:message> -->
141    <!-- <xsl:message>notations = <xsl:value-of select="$notations"/></xsl:message> -->
142    <!-- <xsl:message>result = <xsl:value-of select="$result"/></xsl:message> -->
143
144    <xsl:variable name="used_notation" select="boolean($notation_check) and boolean(substring-before(substring-after($notations, concat('@@(@@', $notation_check, '@@=@@')),'@@)@@'))"/>
145
146    <xsl:variable name="notations2">
147      <!-- Possibly replace from result of unparse-operator-definition -->
148      <xsl:choose>
149	<xsl:when test="contains($result, ' *@@@* ')">
150	  <xsl:value-of select="substring-after($result, ' *@@@* ')"/>
151	</xsl:when>
152	<xsl:otherwise>
153	  <xsl:value-of select="$notations"/>
154	</xsl:otherwise>
155      </xsl:choose>
156    </xsl:variable>
157
158    <xsl:variable name="result2">
159      <!-- Possibly replace from result of unparse-operator-definition -->
160      <xsl:choose>
161	<xsl:when test="contains($result, ' *@@@* ')">
162	  <xsl:value-of select="substring-before($result, ' *@@@* ')"/>
163	</xsl:when>
164	<xsl:otherwise>
165	  <xsl:value-of select="$result"/>
166	</xsl:otherwise>
167      </xsl:choose>
168      <!-- Close parenthesis code -->
169      <xsl:if test="$this_op_priority &lt;= $priority">)</xsl:if>
170    </xsl:variable>
171
172    <xsl:variable name="notation_varlist">
173      <xsl:choose>
174	<xsl:when test="$used_notation">
175	  <xsl:value-of select="substring-before(substring-after($notations2, concat('@@(@@', $notation_check, '@@=@@')), '@@)@@')"/>
176	</xsl:when>
177	<xsl:otherwise>
178	  <xsl:value-of select="$result2"/>
179	</xsl:otherwise>
180      </xsl:choose>
181    </xsl:variable>
182
183    <xsl:variable name="new_varlist" select="substring-after(normalize-space($notation_varlist), ' ')"/>
184
185    <xsl:variable name="notation_var">
186      <xsl:choose>
187	<xsl:when test="not($used_notation)">
188	  <xsl:value-of select="$result2"/>
189	</xsl:when>
190	<xsl:when test="$new_varlist=''">
191	  <xsl:value-of select="$notation_varlist"/>
192	</xsl:when>
193	<xsl:otherwise>
194	  <xsl:value-of select="substring-before(normalize-space($notation_varlist), ' ')"/>
195	</xsl:otherwise>
196      </xsl:choose>
197    </xsl:variable>
198
199    <!-- Generate new notation list -->
200    <xsl:variable name="new_notations">
201      <xsl:choose>
202	<xsl:when test="$used_notation">
203	  <xsl:value-of select="normalize-space(concat('@@(@@', $notation_check, '@@=@@', $new_varlist, '@@)@@', $notations2))"/>
204	  <!-- Duplicate entries always use first occurrance, so I can optimize this -->
205	</xsl:when>
206	<xsl:otherwise><xsl:value-of select="$notations2"/></xsl:otherwise>
207      </xsl:choose>
208    </xsl:variable>
209
210    <!-- <xsl:message>final_result = <xsl:value-of select="normalize-space($final_result)"/></xsl:message> -->
211
212    <xsl:call-template name="add-typename"><xsl:with-param name="really-do-it" select="$use-typename"/><xsl:with-param name="type"><xsl:value-of select="normalize-space($notation_var)"/></xsl:with-param></xsl:call-template><xsl:if test="$print-updated-notation"> *@@@* <xsl:value-of select="$new_notations"/></xsl:if>
213
214  </xsl:template>
215
216  <xsl:template name="unparse-operator-definition">
217    <xsl:param name="typeref"/>
218    <xsl:param name="operator_nodeset"/>
219    <xsl:param name="current_start">1</xsl:param>
220    <xsl:param name="my_priority"/>
221    <xsl:param name="definition_list"/>
222    <xsl:param name="notations"/>
223    <xsl:param name="ignore-cv"/>
224    <xsl:param name="self"/>
225    <xsl:param name="use-code-block" select="false()"/>
226    <xsl:param name="print-updated-notation" select="false()"/>
227    <xsl:param name="const-if-not-mutable-value"/>
228
229    <xsl:variable name="op_current" select="$operator_nodeset[position()=1]"/>
230    <xsl:variable name="op_rest" select="$operator_nodeset[position()!=1]"/>
231
232    <xsl:choose>
233
234      <xsl:when test="count($operator_nodeset)=0">
235	<xsl:if test="$print-updated-notation"> *@@@* <xsl:value-of select="$notations"/></xsl:if>
236      </xsl:when>
237
238      <xsl:when test="$op_current != $op_current/../*"> <!-- If I am not an element -->
239	<xsl:value-of select="$op_current"/>
240	<xsl:call-template name="unparse-operator-definition">
241	  <xsl:with-param name="typeref" select="$typeref"/>
242	  <xsl:with-param name="operator_nodeset" select="$op_rest"/>
243	  <xsl:with-param name="my_priority" select="$my_priority"/>
244	  <xsl:with-param name="definition_list" select="$definition_list"/>
245	  <xsl:with-param name="notations" select="$notations"/>
246	  <xsl:with-param name="self" select="$self"/>
247	  <xsl:with-param name="use-code-block" select="$use-code-block"/>
248	  <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
249	  <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
250	</xsl:call-template>
251      </xsl:when>
252
253      <xsl:when test="name($op_current)='name'">
254	<xsl:value-of select="$typeref/@name"/>
255	<xsl:call-template name="unparse-operator-definition">
256	  <xsl:with-param name="typeref" select="$typeref"/>
257	  <xsl:with-param name="operator_nodeset" select="$op_rest"/>
258	  <xsl:with-param name="my_priority" select="$my_priority"/>
259	  <xsl:with-param name="definition_list" select="$definition_list"/>
260	  <xsl:with-param name="notations" select="$notations"/>
261	  <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
262	  <xsl:with-param name="self" select="$self"/>
263	  <xsl:with-param name="use-code-block" select="$use-code-block"/>
264	  <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
265	  <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
266	</xsl:call-template>
267      </xsl:when>
268
269      <xsl:when test="name($op_current)='self'">
270        <xsl:call-template name="concept.link">
271          <xsl:with-param name="name" select="string($self)"/>
272        </xsl:call-template>
273	<xsl:call-template name="unparse-operator-definition">
274	  <xsl:with-param name="typeref" select="$typeref"/>
275	  <xsl:with-param name="operator_nodeset" select="$op_rest"/>
276	  <xsl:with-param name="my_priority" select="$my_priority"/>
277	  <xsl:with-param name="definition_list" select="$definition_list"/>
278	  <xsl:with-param name="notations" select="$notations"/>
279	  <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
280	  <xsl:with-param name="self" select="$self"/>
281	  <xsl:with-param name="use-code-block" select="$use-code-block"/>
282	  <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
283	  <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
284	</xsl:call-template>
285      </xsl:when>
286
287      <xsl:when test="name($op_current)='arg'">
288	<xsl:variable name="num" select="$op_current/@num"/>
289	<xsl:variable name="assoc" select="$op_current/../@assoc"/>
290	<xsl:variable name="my_priority_before" select="$my_priority"/>
291	<xsl:variable name="my_priority">
292	  <xsl:choose>
293	    <xsl:when test="count($op_current/@priority)">
294	      <xsl:value-of select="$op_current/@priority"/>
295	    </xsl:when>
296	    <xsl:when test="$assoc and ($num = $assoc)">
297	      <xsl:value-of select="$my_priority_before - 1"/>
298	    </xsl:when>
299	    <xsl:otherwise>
300	      <xsl:value-of select="$my_priority"/>
301	    </xsl:otherwise>
302	  </xsl:choose>
303	</xsl:variable>
304	<xsl:variable name="typeref-result">
305	  <xsl:call-template name="unparse-cpp">
306	    <xsl:with-param name="typeref" select="$typeref/*[position()=$num]"/>
307	    <xsl:with-param name="definition_list" select="$definition_list"/>
308	    <xsl:with-param name="priority" select="$my_priority"/>
309	    <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
310	    <xsl:with-param name="notations" select="$notations"/>
311	    <xsl:with-param name="print-updated-notation" select="true()"/>
312	    <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
313	  </xsl:call-template>
314	</xsl:variable>
315	<xsl:variable name="typeref-print" select="normalize-space(substring-before($typeref-result, ' *@@@* '))"/>
316	<xsl:variable name="new_notations" select="normalize-space(substring-after($typeref-result, ' *@@@* '))"/>
317
318	<xsl:choose>
319	  <xsl:when test="$use-code-block">
320	    <type><xsl:value-of select="$typeref-print"/></type>
321	  </xsl:when>
322	  <xsl:otherwise>
323	    <xsl:value-of select="$typeref-print"/>
324	  </xsl:otherwise>
325	</xsl:choose>
326
327	<xsl:call-template name="unparse-operator-definition">
328	  <xsl:with-param name="typeref" select="$typeref"/>
329	  <xsl:with-param name="operator_nodeset" select="$op_rest"/>
330	  <xsl:with-param name="my_priority" select="$my_priority_before"/>
331	  <xsl:with-param name="definition_list" select="$definition_list"/>
332	  <xsl:with-param name="notations" select="$new_notations"/>
333	  <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
334	  <xsl:with-param name="self" select="$self"/>
335	  <xsl:with-param name="use-code-block" select="$use-code-block"/>
336	  <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
337	  <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
338	</xsl:call-template>
339      </xsl:when>
340
341      <xsl:when test="name($op_current)='arg-list'">
342	<xsl:variable name="start" select="$op_current/@start"/>
343	<xsl:variable name="typeref-result">
344	  <xsl:choose>
345	    <xsl:when test="$current_start &gt;= $start">
346	      <xsl:call-template name="unparse-cpp">
347		<xsl:with-param name="typeref" select="$typeref/*[$current_start]"/>
348		<xsl:with-param name="definition_list" select="$definition_list"/>
349		<xsl:with-param name="priority" select="$my_priority"/>
350		<xsl:with-param name="ignore-cv" select="$ignore-cv"/>
351		<xsl:with-param name="notations" select="$notations"/>
352		<xsl:with-param name="print-updated-notation" select="true()"/>
353		<xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
354	      </xsl:call-template>
355	    </xsl:when>
356
357	    <xsl:otherwise>
358	       *@@@* <xsl:value-of select="$notations"/>
359	    </xsl:otherwise>
360	  </xsl:choose>
361	</xsl:variable>
362
363	<xsl:variable name="typeref-print" select="normalize-space(substring-before($typeref-result, ' *@@@* '))"/>
364	<xsl:variable name="new_notations" select="normalize-space(substring-after($typeref-result, ' *@@@* '))"/>
365
366	<xsl:choose>
367	  <xsl:when test="$use-code-block">
368	    <type><xsl:value-of select="$typeref-print"/></type>
369	  </xsl:when>
370	  <xsl:otherwise>
371	    <xsl:value-of select="$typeref-print"/>
372	  </xsl:otherwise>
373	</xsl:choose>
374
375	<xsl:if test="$current_start &gt;= $start">
376	  <xsl:if test="$current_start!=count($typeref/*)">, </xsl:if>
377	</xsl:if>
378
379	<xsl:choose>
380	  <xsl:when test="$current_start != count($typeref/*)">
381	    <xsl:call-template name="unparse-operator-definition">
382	      <xsl:with-param name="typeref" select="$typeref"/>
383	      <xsl:with-param name="operator_nodeset" select="$operator_nodeset"/>
384	      <xsl:with-param name="current_start" select="$current_start + 1"/>
385	      <xsl:with-param name="my_priority" select="$my_priority"/>
386	      <xsl:with-param name="definition_list" select="$definition_list"/>
387	      <xsl:with-param name="notations" select="$new_notations"/>
388	      <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
389	      <xsl:with-param name="self" select="$self"/>
390	      <xsl:with-param name="use-code-block" select="$use-code-block"/>
391	      <xsl:with-param name="print-updated-notation" select="$print-updated-notation"/>
392	      <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
393	    </xsl:call-template>
394	  </xsl:when>
395	  <xsl:otherwise>
396	    <xsl:call-template name="unparse-operator-definition">
397	      <xsl:with-param name="typeref" select="$typeref"/>
398	      <xsl:with-param name="operator_nodeset" select="$op_rest"/>
399	      <xsl:with-param name="my_priority" select="$my_priority"/>
400	      <xsl:with-param name="definition_list" select="$definition_list"/>
401	      <xsl:with-param name="notations" select="$new_notations"/>
402	      <xsl:with-param name="ignore-cv" select="$ignore-cv"/>
403	      <xsl:with-param name="self" select="$self"/>
404	      <xsl:with-param name="use-code-block" select="$use-code-block"/>
405	      <xsl:with-param name="const-if-not-mutable-value" select="$const-if-not-mutable-value"/>
406	    </xsl:call-template>
407	  </xsl:otherwise>
408	</xsl:choose>
409      </xsl:when>
410
411      <xsl:otherwise>Invalid tag in operator definition: <xsl:value-of select="name($op_current)"/></xsl:otherwise>
412
413    </xsl:choose>
414  </xsl:template>
415
416  <xsl:template name="add-typename">
417    <!-- Adds typename to the front of a string if it is necessary. -->
418    <xsl:param name="type"/> <!-- string to prepend to -->
419    <xsl:param name="params" select="/concept/param | /concept/define-type | /concept/associated-type"/>
420      <!-- nodeset of param tags for concept -->
421      <!-- associated types are assumed to be dependent -->
422    <xsl:param name="really-do-it"/> <!-- really change anything? -->
423
424    <xsl:variable name="type-after-last-scope">
425      <xsl:call-template name="substring-before-last">
426	<xsl:with-param name="string" select="$type"/>
427	<xsl:with-param name="to-find" select="'::'"/>
428      </xsl:call-template>
429    </xsl:variable>
430
431    <xsl:variable name="tokenized-type-after-last-scope">
432      <xsl:call-template name="rough-tokenize">
433	<xsl:with-param name="string" select="$type-after-last-scope"/>
434      </xsl:call-template>
435    </xsl:variable>
436
437    <xsl:choose>
438      <xsl:when test="$really-do-it and boolean($params[contains($tokenized-type-after-last-scope, concat(' ', @name, ' '))])">
439      <!-- If the tokenized string contains any of the param names in a
440      token by itself, return true.  Return false otherwise -->
441	<xsl:comment/>typename <xsl:value-of select="$type"/><xsl:comment/>
442      </xsl:when>
443      <xsl:otherwise><xsl:value-of select="$type"/></xsl:otherwise>
444    </xsl:choose>
445  </xsl:template>
446
447  <xsl:template name="substring-before-last">
448    <xsl:param name="string"/>
449    <xsl:param name="to-find"/>
450    <xsl:param name="string-processed-so-far"/> <!-- internal -->
451    <!-- Find the substring of $string before the last occurrance of
452    $to-find, returning '' if it was not found. -->
453
454    <xsl:choose>
455      <xsl:when test="contains($string, $to-find)">
456	<xsl:call-template name="substring-before-last">
457	  <xsl:with-param name="string" select="substring-after($string, $to-find)"/>
458	  <xsl:with-param name="to-find" select="$to-find"/>
459	  <xsl:with-param name="string-processed-so-far" select="concat($string-processed-so-far, substring-before($string, $to-find), $to-find)"/>
460	</xsl:call-template>
461      </xsl:when>
462
463      <xsl:otherwise>
464	<xsl:value-of select="substring($string-processed-so-far, 1, string-length($string-processed-so-far)-(string-length($to-find)))"/>
465      </xsl:otherwise>
466    </xsl:choose>
467  </xsl:template>
468
469  <xsl:template name="substring-after-last">
470    <xsl:param name="string"/>
471    <xsl:param name="to-find"/>
472    <!-- Find the substring of $string after the last occurrance of
473    $to-find, returning the original string if it was not found. -->
474
475    <xsl:choose>
476      <xsl:when test="contains($string, $to-find)">
477	<xsl:call-template name="substring-after-last">
478	  <xsl:with-param name="string" select="substring-after($string, $to-find)"/>
479	  <xsl:with-param name="to-find" select="$to-find"/>
480	</xsl:call-template>
481      </xsl:when>
482
483      <xsl:otherwise>
484	<xsl:value-of select="$string"/>
485      </xsl:otherwise>
486    </xsl:choose>
487  </xsl:template>
488
489  <xsl:template name="rough-tokenize">
490    <xsl:param name="string"/>
491    <!-- Do a rough tokenization of the string.  Right now, just translate
492    all non-token-chars to spaces, normalize-space the result, and prepend
493    and append spaces. -->
494
495    <xsl:value-of select="concat(' ', normalize-space(translate($string, '&lt;&gt;,./?;:[]{}-=\\_+|!@#$%^&amp;*()', '                             ')), ' ')"/>
496  </xsl:template>
497</xsl:stylesheet>
498