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