1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 #include "XalanExtensions.hpp"
19
20 #include "FunctionDifference.hpp"
21 #include "FunctionDistinct.hpp"
22 #include "FunctionEvaluate.hpp"
23 #include "FunctionHasSameNodes.hpp"
24 #include "FunctionIntersection.hpp"
25 #include "FunctionNodeSet.hpp"
26
27
28
29 #include <xalanc/XPath/XPathEnvSupportDefault.hpp>
30
31
32
33 namespace XALAN_CPP_NAMESPACE {
34
35
36
37 static const XalanDOMChar s_extensionsNamespace[] =
38 {
39 XalanUnicode::charLetter_h,
40 XalanUnicode::charLetter_t,
41 XalanUnicode::charLetter_t,
42 XalanUnicode::charLetter_p,
43 XalanUnicode::charColon,
44 XalanUnicode::charSolidus,
45 XalanUnicode::charSolidus,
46 XalanUnicode::charLetter_x,
47 XalanUnicode::charLetter_m,
48 XalanUnicode::charLetter_l,
49 XalanUnicode::charFullStop,
50 XalanUnicode::charLetter_a,
51 XalanUnicode::charLetter_p,
52 XalanUnicode::charLetter_a,
53 XalanUnicode::charLetter_c,
54 XalanUnicode::charLetter_h,
55 XalanUnicode::charLetter_e,
56 XalanUnicode::charFullStop,
57 XalanUnicode::charLetter_o,
58 XalanUnicode::charLetter_r,
59 XalanUnicode::charLetter_g,
60 XalanUnicode::charSolidus,
61 XalanUnicode::charLetter_x,
62 XalanUnicode::charLetter_a,
63 XalanUnicode::charLetter_l,
64 XalanUnicode::charLetter_a,
65 XalanUnicode::charLetter_n,
66 0
67 };
68
69
70
71 static const XalanDOMChar s_differenceFunctionName[] =
72 {
73 XalanUnicode::charLetter_d,
74 XalanUnicode::charLetter_i,
75 XalanUnicode::charLetter_f,
76 XalanUnicode::charLetter_f,
77 XalanUnicode::charLetter_e,
78 XalanUnicode::charLetter_r,
79 XalanUnicode::charLetter_e,
80 XalanUnicode::charLetter_n,
81 XalanUnicode::charLetter_c,
82 XalanUnicode::charLetter_e,
83 0
84 };
85
86
87
88 static const XalanDOMChar s_distinctFunctionName[] =
89 {
90 XalanUnicode::charLetter_d,
91 XalanUnicode::charLetter_i,
92 XalanUnicode::charLetter_s,
93 XalanUnicode::charLetter_t,
94 XalanUnicode::charLetter_i,
95 XalanUnicode::charLetter_n,
96 XalanUnicode::charLetter_c,
97 XalanUnicode::charLetter_t,
98 0
99 };
100
101
102
103 static const XalanDOMChar s_evaluateFunctionName[] =
104 {
105 XalanUnicode::charLetter_e,
106 XalanUnicode::charLetter_v,
107 XalanUnicode::charLetter_a,
108 XalanUnicode::charLetter_l,
109 XalanUnicode::charLetter_u,
110 XalanUnicode::charLetter_a,
111 XalanUnicode::charLetter_t,
112 XalanUnicode::charLetter_e,
113 0
114 };
115
116
117
118 static const XalanDOMChar s_hasSameNodesFunctionName[] =
119 {
120 XalanUnicode::charLetter_h,
121 XalanUnicode::charLetter_a,
122 XalanUnicode::charLetter_s,
123 XalanUnicode::charLetter_S,
124 XalanUnicode::charLetter_a,
125 XalanUnicode::charLetter_m,
126 XalanUnicode::charLetter_e,
127 XalanUnicode::charLetter_N,
128 XalanUnicode::charLetter_o,
129 XalanUnicode::charLetter_d,
130 XalanUnicode::charLetter_e,
131 XalanUnicode::charLetter_s,
132 0
133 };
134
135
136
137 static const XalanDOMChar s_intersectionFunctionName[] =
138 {
139 XalanUnicode::charLetter_i,
140 XalanUnicode::charLetter_n,
141 XalanUnicode::charLetter_t,
142 XalanUnicode::charLetter_e,
143 XalanUnicode::charLetter_r,
144 XalanUnicode::charLetter_s,
145 XalanUnicode::charLetter_e,
146 XalanUnicode::charLetter_c,
147 XalanUnicode::charLetter_t,
148 XalanUnicode::charLetter_i,
149 XalanUnicode::charLetter_o,
150 XalanUnicode::charLetter_n,
151 0
152 };
153
154
155
156 static const XalanDOMChar s_nodeSetFunctionName1[] =
157 {
158 XalanUnicode::charLetter_n,
159 XalanUnicode::charLetter_o,
160 XalanUnicode::charLetter_d,
161 XalanUnicode::charLetter_e,
162 XalanUnicode::charLetter_s,
163 XalanUnicode::charLetter_e,
164 XalanUnicode::charLetter_t,
165 0
166 };
167
168
169
170 static const XalanDOMChar s_nodeSetFunctionName2[] =
171 {
172 XalanUnicode::charLetter_n,
173 XalanUnicode::charLetter_o,
174 XalanUnicode::charLetter_d,
175 XalanUnicode::charLetter_e,
176 XalanUnicode::charHyphenMinus,
177 XalanUnicode::charLetter_s,
178 XalanUnicode::charLetter_e,
179 XalanUnicode::charLetter_t,
180 0
181 };
182
183
184
185 static const FunctionDifference s_differenceFunction;
186 static const FunctionDistinct s_distinctFunction;
187 static const FunctionEvaluate s_evaluateFunction;
188 static const FunctionHasSameNodes s_hasSameNodesFunction;
189 static const FunctionIntersection s_intersectionFunction;
190 static const FunctionNodeSet s_nodesetFunction(true);
191
192
193
194 static const XalanExtensionsInstaller::FunctionTableEntry theFunctionTable[] =
195 {
196 { s_differenceFunctionName, &s_differenceFunction },
197 { s_distinctFunctionName, &s_distinctFunction },
198 { s_evaluateFunctionName, &s_evaluateFunction },
199 { s_hasSameNodesFunctionName, &s_hasSameNodesFunction },
200 { s_intersectionFunctionName, &s_intersectionFunction },
201 { s_nodeSetFunctionName1, &s_nodesetFunction },
202 { s_nodeSetFunctionName2, &s_nodesetFunction },
203 { 0, 0 }
204 };
205
206
207
208 void
installLocal(XPathEnvSupportDefault & theSupport)209 XalanExtensionsInstaller::installLocal(XPathEnvSupportDefault& theSupport)
210 {
211 doInstallLocal(s_extensionsNamespace, theFunctionTable, theSupport);
212 }
213
214
215
216 void
installGlobal(MemoryManager & theManager)217 XalanExtensionsInstaller::installGlobal(MemoryManager& theManager)
218 {
219 doInstallGlobal( theManager, s_extensionsNamespace, theFunctionTable);
220 }
221
222
223
224 void
uninstallLocal(XPathEnvSupportDefault & theSupport)225 XalanExtensionsInstaller::uninstallLocal(XPathEnvSupportDefault& theSupport)
226 {
227 doUninstallLocal(s_extensionsNamespace, theFunctionTable, theSupport);
228 }
229
230
231
232 void
uninstallGlobal(MemoryManager & theManager)233 XalanExtensionsInstaller::uninstallGlobal(MemoryManager& theManager)
234 {
235 doUninstallGlobal(theManager, s_extensionsNamespace, theFunctionTable);
236 }
237
238
239
240 void
doInstallLocal(const XalanDOMChar * theNamespace,const FunctionTableEntry theFunctionTable[],XPathEnvSupportDefault & theSupport)241 XalanExtensionsInstaller::doInstallLocal(
242 const XalanDOMChar* theNamespace,
243 const FunctionTableEntry theFunctionTable[],
244 XPathEnvSupportDefault& theSupport)
245 {
246 assert(theNamespace != 0);
247
248 const XalanDOMString theNamespaceString(theNamespace, theSupport.getMemoryManager());
249 XalanDOMString theFunctionName( theSupport.getMemoryManager());
250
251 for(const FunctionTableEntry* theEntry = theFunctionTable; theEntry->theFunctionName != 0; ++theEntry)
252 {
253 assert(theEntry->theFunction != 0);
254
255 theFunctionName = theEntry->theFunctionName;
256
257 theSupport.installExternalFunctionLocal(theNamespaceString, theFunctionName, *theEntry->theFunction);
258 }
259 }
260
261
262
263 void
doInstallGlobal(MemoryManager & theManager,const XalanDOMChar * theNamespace,const FunctionTableEntry theFunctionTable[])264 XalanExtensionsInstaller::doInstallGlobal(
265 MemoryManager& theManager,
266 const XalanDOMChar* theNamespace,
267 const FunctionTableEntry theFunctionTable[])
268 {
269 assert(theNamespace != 0);
270
271 const XalanDOMString theNamespaceString(theNamespace, theManager);
272 XalanDOMString theFunctionName(theManager);
273
274 for(const FunctionTableEntry* theEntry = theFunctionTable; theEntry->theFunctionName != 0; ++theEntry)
275 {
276 assert(theEntry->theFunction != 0);
277
278 theFunctionName = theEntry->theFunctionName;
279
280 XPathEnvSupportDefault::installExternalFunctionGlobal(theNamespaceString, theFunctionName, *theEntry->theFunction);
281 }
282 }
283
284
285
286 void
doUninstallLocal(const XalanDOMChar * theNamespace,const FunctionTableEntry theFunctionTable[],XPathEnvSupportDefault & theSupport)287 XalanExtensionsInstaller::doUninstallLocal(
288 const XalanDOMChar* theNamespace,
289 const FunctionTableEntry theFunctionTable[],
290 XPathEnvSupportDefault& theSupport)
291 {
292 assert(theNamespace != 0);
293
294 const XalanDOMString theNamespaceString(theNamespace, theSupport.getMemoryManager());
295 XalanDOMString theFunctionName(theSupport.getMemoryManager());
296
297 for(const FunctionTableEntry* theEntry = theFunctionTable; theEntry->theFunctionName != 0; ++theEntry)
298 {
299 theFunctionName = theEntry->theFunctionName;
300
301 theSupport.uninstallExternalFunctionLocal(theNamespaceString, theFunctionName);
302 }
303 }
304
305
306
307 void
doUninstallGlobal(MemoryManager & theManager,const XalanDOMChar * theNamespace,const FunctionTableEntry theFunctionTable[])308 XalanExtensionsInstaller::doUninstallGlobal(
309 MemoryManager& theManager,
310 const XalanDOMChar* theNamespace,
311 const FunctionTableEntry theFunctionTable[])
312 {
313 assert(theNamespace != 0);
314
315 const XalanDOMString theNamespaceString(theNamespace, theManager);
316 XalanDOMString theFunctionName(theManager);
317
318 for(const FunctionTableEntry* theEntry = theFunctionTable; theEntry->theFunctionName != 0; ++theEntry)
319 {
320 theFunctionName = theEntry->theFunctionName;
321
322 XPathEnvSupportDefault::uninstallExternalFunctionGlobal(theNamespaceString, theFunctionName);
323 }
324 }
325
326
327
328 }
329