00001 /* 00002 * Copyright 1999-2004 The Apache Software Foundation. 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #if !defined(STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680) 00017 #define STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680 00018 00019 00020 00021 // Base include file. Must be first. 00022 #include <xalanc/XSLT/XSLTDefinitions.hpp> 00023 00024 00025 00026 #include <xalanc/Include/XalanVector.hpp> 00027 00028 00029 00030 #include <xalanc/PlatformSupport/ArenaAllocator.hpp> 00031 #include <xalanc/PlatformSupport/XalanArrayAllocator.hpp> 00032 #include <xalanc/PlatformSupport/XalanDOMStringPool.hpp> 00033 00034 00035 00036 #if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION) || (XALAN_ALLINONE_BUILD_DLL) 00037 #include <xalanc/XPath/XPathProcessor.hpp> 00038 #endif 00039 00040 00041 00042 #include <xalanc/Include/XalanMemMgrAutoPtr.hpp> 00043 00044 00045 00046 #include <xalanc/PlatformSupport/XalanDOMStringCache.hpp> 00047 00048 00049 00050 #include <xalanc/XPath/XalanQNameByReference.hpp> 00051 #include <xalanc/XPath/XalanQNameByValue.hpp> 00052 #include <xalanc/XPath/XalanQNameByValueAllocator.hpp> 00053 00054 00055 00056 // Base class header file... 00057 #include <xalanc/XSLT/StylesheetConstructionContext.hpp> 00058 00059 00060 00061 #include <xalanc/XSLT/AVT.hpp> 00062 #include <xalanc/XSLT/XalanAVTAllocator.hpp> 00063 #include <xalanc/XSLT/AVTPartSimple.hpp> 00064 #include <xalanc/XSLT/XalanAVTPartSimpleAllocator.hpp> 00065 #include <xalanc/XSLT/AVTPartXPath.hpp> 00066 #include <xalanc/XSLT/XalanAVTPartXPathAllocator.hpp> 00067 #include <xalanc/XSLT/XalanElemApplyTemplatesAllocator.hpp> 00068 #include <xalanc/XSLT/XalanElemAttributeAllocator.hpp> 00069 #include <xalanc/XSLT/XalanElemAttributeSetAllocator.hpp> 00070 #include <xalanc/XSLT/XalanElemCallTemplateAllocator.hpp> 00071 #include <xalanc/XSLT/XalanElemElementAllocator.hpp> 00072 #include <xalanc/XSLT/XalanElemLiteralResultAllocator.hpp> 00073 #include <xalanc/XSLT/XalanElemTemplateAllocator.hpp> 00074 #include <xalanc/XSLT/XalanElemTextLiteralAllocator.hpp> 00075 #include <xalanc/XSLT/XalanElemValueOfAllocator.hpp> 00076 #include <xalanc/XSLT/XalanElemVariableAllocator.hpp> 00077 #include "xalanc/XSLT/XalanMatchPatternDataAllocator.hpp" 00078 00079 00080 00081 XALAN_CPP_NAMESPACE_BEGIN 00082 00083 00084 00085 class XPathEnvSupport; 00086 class XPathFactory; 00087 class XPathProcessor; 00088 class XSLTEngineImpl; 00089 00090 00091 00098 class XALAN_XSLT_EXPORT StylesheetConstructionContextDefault : public StylesheetConstructionContext 00099 { 00100 public: 00101 00102 typedef XalanArrayAllocator<XalanDOMChar> XalanDOMCharVectorAllocatorType; 00103 typedef XalanArrayAllocator<const void*> PointerVectorAllocatorType; 00104 typedef XalanDOMCharVectorAllocatorType::size_type VectorAllocatorSizeType; 00105 00106 // Default size for vector allocation. 00107 enum { 00108 eDefaultXalanDOMCharVectorBlockSize = 1024, 00109 eDefaultAVTBlockSize = 128, 00110 eDefaultAVTPartSimpleBlockSize = 128, 00111 eDefaultAVTPartXPathBlockSize = 128, 00112 eDefaultXalanQNameByValueBlockSize = 32, 00113 eDefaultPointerVectorBlockSize = 512, 00114 eDefaultElemApplyTemplatesBlockSize = 10, 00115 eDefaultElemAttributeBlockSize = 10, 00116 eDefaultElemAttributeSetBlockSize = 10, 00117 eDefaultElemCallTemplateBlockSize = 10, 00118 eDefaultElemElementBlockSize = 10, 00119 eDefaultElemLiteralResultBlockSize = 20, 00120 eDefaultElemTemplateBlockSize = 10, 00121 eDefaultElemTextLiteralBlockSize = 20, 00122 eDefaultElemValueOfBlockSize = 10, 00123 eDefaultElemVariableBlockSize = 10, 00124 eDefaultMatchPatternDataBlockSize = 10 }; 00125 00126 /* 00127 * Construct an instance. If the stylesheet(s) constructed is/are meant to be reused (a.k.a. "compiled"), 00128 * the XObjectFactory and XPathFactory instance must exist for the lifetime of the construction context 00129 * and, therefore, for the lifetime of the stylesheet(s). Otherwise, XObject and XPath instance will be 00130 * destroyed when the corresponding factories are destryed, leaving pointers to destroyed objects in the. 00131 * stylesheet(s). 00132 * 00133 * @param processor a reference to an XSLTEngineImpl instance. Used for error reporting. 00134 * @param xpathFactory a reference to an XPathFactory instance. See comments above for important details. 00135 * @param theXalanDOMCharVectorAllocatorBlockSize The block size to use for allocating vectors of XalanDOMChars 00136 * @param theAVTAllocatorBlockSize The block size to use for allocating AVT instances. 00137 * @param theAVTPartSimpleAllocatorBlockSize The block size to use for allocating AVTPartSimple instances. 00138 * @param theAVTPartXPathAllocatorBlockSize The block size to use for allocating AVTPartXPath instances. 00139 * @param theXalanQNameByValueAllocatorBlockSize The block size to use for allocating XalanQNameByValue instances. 00140 * @param thePointerVectorAllocatorBlockSize The block size to use for allocating vectors of pointers. 00141 */ 00142 StylesheetConstructionContextDefault( 00143 MemoryManagerType& theManager, 00144 XSLTEngineImpl& processor, 00145 XPathFactory& xpathFactory, 00146 VectorAllocatorSizeType theXalanDOMCharVectorAllocatorBlockSize = eDefaultXalanDOMCharVectorBlockSize, 00147 XalanAVTAllocator::size_type theAVTAllocatorBlockSize = eDefaultAVTBlockSize, 00148 XalanAVTPartSimpleAllocator::size_type theAVTPartSimpleAllocatorBlockSize = eDefaultAVTPartSimpleBlockSize, 00149 XalanAVTPartXPathAllocator::size_type theAVTPartXPathAllocatorBlockSize = eDefaultAVTPartXPathBlockSize, 00150 XalanQNameByValueAllocator::size_type theXalanQNameByValueAllocatorBlockSize = eDefaultXalanQNameByValueBlockSize, 00151 VectorAllocatorSizeType thePointerVectorAllocatorBlockSize = eDefaultPointerVectorBlockSize); 00152 00153 virtual 00154 ~StylesheetConstructionContextDefault(); 00155 00156 00157 virtual void 00158 error( 00159 const XalanDOMString& msg, 00160 const XalanNode* sourceNode = 0, 00161 const ElemTemplateElement* styleNode = 0) const; 00162 00163 virtual void 00164 error( 00165 const XalanDOMString& msg, 00166 const XalanNode* sourceNode, 00167 const LocatorType* locator) const; 00168 00169 virtual void 00170 warn( 00171 const XalanDOMString& msg, 00172 const XalanNode* sourceNode = 0, 00173 const ElemTemplateElement* styleNode = 0) const; 00174 00175 virtual void 00176 warn( 00177 const XalanDOMString& msg, 00178 const XalanNode* sourceNode, 00179 const LocatorType* locator) const; 00180 00181 virtual void 00182 message( 00183 const XalanDOMString& msg, 00184 const XalanNode* sourceNode = 0, 00185 const ElemTemplateElement* styleNode = 0) const; 00186 00187 virtual void 00188 message( 00189 const XalanDOMString& msg, 00190 const XalanNode* sourceNode, 00191 const LocatorType* locator) const; 00192 00193 // These interfaces are inherited from StylesheetConstructionContext... 00194 00195 virtual void 00196 reset(); 00197 00198 virtual StylesheetRoot* 00199 create(const XalanDOMString& theBaseIdentifier); 00200 00201 virtual StylesheetRoot* 00202 create(const XSLTInputSource& theInputSource); 00203 00204 virtual Stylesheet* 00205 create( 00206 StylesheetRoot& theStylesheetRoot, 00207 const XalanDOMString& theBaseIdentifier); 00208 00209 virtual void 00210 destroy(StylesheetRoot* theStylesheetRoot); 00211 00212 virtual URLAutoPtrType 00213 getURLFromString(const XalanDOMString& urlString); 00214 00215 virtual XalanDOMString& 00216 getURLStringFromString(const XalanDOMString& urlString, 00217 XalanDOMString& theResult); 00218 00219 virtual URLAutoPtrType 00220 getURLFromString( 00221 const XalanDOMString& urlString, 00222 const XalanDOMString& base); 00223 00224 virtual XalanDOMString& 00225 getURLStringFromString( 00226 const XalanDOMString& urlString, 00227 const XalanDOMString& base, 00228 XalanDOMString& theResult); 00229 00230 virtual const XalanDOMString& 00231 getXSLTNamespaceURI() const; 00232 00233 virtual XPath* 00234 createMatchPattern( 00235 const LocatorType* locator, 00236 const XalanDOMString& str, 00237 const PrefixResolver& resolver, 00238 bool allowVariableReferences = true, 00239 bool allowKeyFunction = true); 00240 00241 virtual XPath* 00242 createMatchPattern( 00243 const LocatorType* locator, 00244 const XalanDOMChar* str, 00245 const PrefixResolver& resolver, 00246 bool allowVariableReferences = true, 00247 bool allowKeyFunction = true); 00248 00249 virtual XPath* 00250 createXPath( 00251 const LocatorType* locator, 00252 const XalanDOMString& str, 00253 const PrefixResolver& resolver, 00254 bool allowVariableReferences = true, 00255 bool allowKeyFunction = true); 00256 00257 virtual XPath* 00258 createXPath( 00259 const LocatorType* locator, 00260 const XalanDOMChar* str, 00261 const PrefixResolver& resolver, 00262 bool allowVariableReferences = true, 00263 bool allowKeyFunction = true); 00264 00265 virtual XPath* 00266 createXPath( 00267 const LocatorType* locator, 00268 const XalanDOMChar* str, 00269 XalanDOMString::size_type len, 00270 const PrefixResolver& resolver, 00271 bool allowVariableReferences = true, 00272 bool allowKeyFunction = true); 00273 00274 virtual const LocatorType* 00275 getLocatorFromStack() const; 00276 00277 virtual void 00278 pushLocatorOnStack(const LocatorType* locator); 00279 00280 virtual void 00281 popLocatorStack(); 00282 00283 virtual const XalanDOMString& 00284 getXalanXSLNameSpaceURL() const; 00285 00286 virtual XalanDocument* 00287 parseXML( 00288 const XalanDOMString& urlString, 00289 DocumentHandlerType* docHandler, 00290 XalanDocument* docToRegister); 00291 00292 virtual bool 00293 isXMLSpaceAttribute( 00294 const XalanDOMChar* theAttributeName, 00295 const Stylesheet& theStylesheet, 00296 const LocatorType* theLocator = 0); 00297 00298 virtual bool 00299 isXSLUseAttributeSetsAttribute( 00300 const XalanDOMChar* theAttributeName, 00301 const Stylesheet& theStylesheet, 00302 const LocatorType* theLocator = 0); 00303 00304 virtual bool 00305 isValidQName( 00306 const XalanDOMChar* theName, 00307 const Stylesheet& theStylesheet, 00308 const LocatorType* theLocator = 0); 00309 00310 virtual eElementToken 00311 getElementToken(const XalanDOMString& name) const; 00312 00313 virtual double 00314 getXSLTVersionSupported() const; 00315 00316 virtual const XalanDOMString& 00317 getPooledString(const XalanDOMString& theString); 00318 00319 virtual const XalanDOMString& 00320 getPooledString( 00321 const XalanDOMChar* theString, 00322 XalanDOMString::size_type theLength = XalanDOMString::npos); 00323 00324 virtual XalanDOMString& 00325 getCachedString(); 00326 00327 virtual bool 00328 releaseCachedString(XalanDOMString& theString); 00329 00330 virtual XalanDOMChar* 00331 allocateXalanDOMCharVector(XalanDOMString::size_type theLength); 00332 00333 virtual XalanDOMChar* 00334 allocateXalanDOMCharVector( 00335 const XalanDOMChar* theString, 00336 XalanDOMString::size_type theLength = XalanDOMString::npos, 00337 bool fTerminate = true); 00338 00339 virtual const AVT* 00340 createAVT( 00341 const LocatorType* locator, 00342 const XalanDOMChar* name, 00343 const XalanDOMChar* stringedValue, 00344 const PrefixResolver& resolver); 00345 00346 virtual const AVTPart* 00347 createAVTPart( 00348 const XalanDOMChar* theString, 00349 XalanDOMString::size_type theLength = XalanDOMString::npos); 00350 00351 virtual const AVTPart* 00352 createAVTPart( 00353 const LocatorType* locator, 00354 const XalanDOMChar* str, 00355 XalanDOMString::size_type len, 00356 const PrefixResolver& resolver); 00357 00358 virtual const AVT** 00359 allocateAVTPointerVector(size_type theLength); 00360 00361 virtual const AVTPart** 00362 allocateAVTPartPointerVector(size_type theLength); 00363 00364 virtual const XalanQName* 00365 createXalanQName( 00366 const XalanDOMString& qname, 00367 const NamespacesStackType& namespaces, 00368 const LocatorType* locator = 0, 00369 bool fUseDefault = false); 00370 00371 virtual const XalanQName* 00372 createXalanQName( 00373 const XalanDOMChar* qname, 00374 const NamespacesStackType& namespaces, 00375 const LocatorType* locator = 0, 00376 bool fUseDefault = false); 00377 00378 virtual const XalanQName** 00379 tokenizeQNames( 00380 size_type& count, 00381 const XalanDOMChar* qnameTokens, 00382 const NamespacesStackType& namespaces, 00383 const LocatorType* locator = 0, 00384 bool fUseDefault = false); 00385 00386 virtual ElemTemplateElement* 00387 createElement( 00388 int token, 00389 Stylesheet& stylesheetTree, 00390 const AttributeListType& atts, 00391 const LocatorType* locator = 0); 00392 00393 virtual ElemTemplateElement* 00394 createElement( 00395 int token, 00396 Stylesheet& stylesheetTree, 00397 const XalanDOMChar* name, 00398 const AttributeListType& atts, 00399 const LocatorType* locator = 0); 00400 00401 virtual ElemTemplateElement* 00402 createElement( 00403 Stylesheet& stylesheetTree, 00404 const XalanDOMChar* chars, 00405 XalanDOMString::size_type length, 00406 bool preserveSpace, 00407 bool disableOutputEscaping, 00408 const LocatorType* locator = 0); 00409 00410 virtual ElemTemplateElement* 00411 createElement( 00412 Stylesheet& stylesheetTree, 00413 const XalanDOMChar* name, 00414 const AttributeListType& atts, 00415 ExtensionNSHandler& handler, 00416 const LocatorType* locator = 0); 00417 00418 virtual const XalanMatchPatternData* 00419 createXalanMatchPatternData( 00420 const ElemTemplate& theTemplate, 00421 size_type thePosition, 00422 const XalanDOMString& theTargetString, 00423 const XPath& theMatchPattern, 00424 const XalanDOMString& thePatternString, 00425 XPath::eMatchScore thePriority); 00426 00427 static eElementToken 00428 getElementNameToken(const XalanDOMString& name); 00429 00430 typedef XalanVector<StylesheetRoot*> StylesheetVectorType; 00431 typedef XalanVector<ElemTemplateElement*> ElemTemplateElementVectorType; 00432 00433 private: 00434 00435 const AVT** 00436 doAllocateAVTPointerVector(size_type theSize) 00437 { 00438 assert(sizeof(AVT**) == sizeof(PointerVectorAllocatorType::value_type)); 00439 00440 #if defined(XALAN_OLD_STYLE_CASTS) 00441 return (const AVT**)m_pointerVectorAllocator.allocate(theSize); 00442 #else 00443 return reinterpret_cast<const AVT**>(m_pointerVectorAllocator.allocate(theSize)); 00444 #endif 00445 } 00446 00447 const AVTPart** 00448 doAllocateAVTPartPointerVector(size_type theSize) 00449 { 00450 assert(sizeof(AVTPart**) == sizeof(PointerVectorAllocatorType::value_type)); 00451 00452 #if defined(XALAN_OLD_STYLE_CASTS) 00453 return (const AVTPart**)m_pointerVectorAllocator.allocate(theSize); 00454 #else 00455 return reinterpret_cast<const AVTPart**>(m_pointerVectorAllocator.allocate(theSize)); 00456 #endif 00457 } 00458 00459 const XalanQName** 00460 doAllocateXalanQNamePointerVector(size_type theSize) 00461 { 00462 assert(sizeof(XalanQName**) == sizeof(PointerVectorAllocatorType::value_type)); 00463 00464 #if defined(XALAN_OLD_STYLE_CASTS) 00465 return (const XalanQName**)m_pointerVectorAllocator.allocate(theSize); 00466 #else 00467 return reinterpret_cast<const XalanQName**>(m_pointerVectorAllocator.allocate(theSize)); 00468 #endif 00469 } 00470 00471 00472 XSLTEngineImpl& m_processor; 00473 00474 XPathFactory& m_xpathFactory; 00475 00476 typedef XalanMemMgrAutoPtr<XPathProcessor, true> XPathProcessAutoPtr; 00477 00478 XPathProcessAutoPtr m_xpathProcessor; 00479 00480 StylesheetVectorType m_stylesheets; 00481 00482 XalanDOMStringPool m_stringPool; 00483 00484 XalanDOMCharVectorAllocatorType m_xalanDOMCharVectorAllocator; 00485 00486 mutable XalanDOMString m_tempBuffer; 00487 00488 XalanQNameByValue m_scratchQName; 00489 00490 XalanDOMStringCache m_stringCache; 00491 00492 XalanAVTAllocator m_avtAllocator; 00493 00494 XalanAVTPartSimpleAllocator m_avtPartSimpleAllocator; 00495 00496 XalanAVTPartXPathAllocator m_avtPartXPathAllocator; 00497 00498 XalanQNameByValueAllocator m_xalanQNameByValueAllocator; 00499 00500 const XalanQNameByReference m_useAttributeSetsQName; 00501 00502 PointerVectorAllocatorType m_pointerVectorAllocator; 00503 00504 ElemTemplateElementVectorType m_allocatedElements; 00505 00506 XalanElemApplyTemplatesAllocator m_elemApplyTemplatesAllocator; 00507 00508 XalanElemAttributeAllocator m_elemAttributeAllocator; 00509 00510 XalanElemAttributeSetAllocator m_elemAttributeSetAllocator; 00511 00512 XalanElemCallTemplateAllocator m_elemCallTemplateAllocator; 00513 00514 XalanElemElementAllocator m_elemElementAllocator; 00515 00516 XalanElemLiteralResultAllocator m_elemLiteralResultAllocator; 00517 00518 XalanElemTemplateAllocator m_elemTemplateAllocator; 00519 00520 XalanElemTextLiteralAllocator m_elemTextLiteralAllocator; 00521 00522 XalanElemValueOfAllocator m_elemValueOfAllocator; 00523 00524 XalanElemVariableAllocator m_elemVariableAllocator; 00525 00526 XalanMatchPatternDataAllocator m_matchPatternDataAllocator; 00527 00528 const XalanQNameByReference m_spaceAttrQName; 00529 00530 // Static strings for stylesheet compilation... 00531 00532 // The string "if" 00533 static const XalanDOMChar s_if[]; 00534 00535 // The string "key" 00536 static const XalanDOMChar s_key[]; 00537 00538 // The string "copy" 00539 static const XalanDOMChar s_copy[]; 00540 00541 // The string "sort" 00542 static const XalanDOMChar s_sort[]; 00543 00544 // The string "text" 00545 static const XalanDOMChar s_text[]; 00546 00547 // The string "when" 00548 static const XalanDOMChar s_when[]; 00549 00550 // The string "empty" 00551 static const XalanDOMChar s_empty[]; 00552 00553 // The string "param" 00554 static const XalanDOMChar s_param[]; 00555 00556 // The string "choose" 00557 static const XalanDOMChar s_choose[]; 00558 00559 // The string "import" 00560 static const XalanDOMChar s_import[]; 00561 00562 // The string "number" 00563 static const XalanDOMChar s_number[]; 00564 00565 // The string "output" 00566 static const XalanDOMChar s_output[]; 00567 00568 // The string "comment" 00569 static const XalanDOMChar s_comment[]; 00570 00571 // The string "copy-of" 00572 static const XalanDOMChar s_copyOf[]; 00573 00574 // The string "element" 00575 static const XalanDOMChar s_element[]; 00576 00577 // The string "include" 00578 static const XalanDOMChar s_include[]; 00579 00580 // The string "message" 00581 static const XalanDOMChar s_message[]; 00582 00583 // The string "fallback" 00584 static const XalanDOMChar s_fallback[]; 00585 00586 // The string "for-each" 00587 static const XalanDOMChar s_forEach[]; 00588 00589 // The string "template" 00590 static const XalanDOMChar s_template[]; 00591 00592 // The string "value-of" 00593 static const XalanDOMChar s_valueOf[]; 00594 00595 // The string "variable" 00596 static const XalanDOMChar s_variable[]; 00597 00598 // The string "attribute" 00599 static const XalanDOMChar s_attribute[]; 00600 00601 // The string "otherwise" 00602 static const XalanDOMChar s_otherwise[]; 00603 00604 // The string "transform" 00605 static const XalanDOMChar s_transform[]; 00606 00607 // The string "stylesheet" 00608 static const XalanDOMChar s_stylesheet[]; 00609 00610 // The string "with-param" 00611 static const XalanDOMChar s_withParam[]; 00612 00613 // The string "strip-space" 00614 static const XalanDOMChar s_stripSpace[]; 00615 00616 // The string "apply-imports" 00617 static const XalanDOMChar s_applyImports[]; 00618 00619 // The string "attribute-set" 00620 static const XalanDOMChar s_attributeSet[]; 00621 00622 // The string "call-template" 00623 static const XalanDOMChar s_callTemplate[]; 00624 00625 // The string "decimal-format" 00626 static const XalanDOMChar s_decimalFormat[]; 00627 00628 // The string "preserve-space" 00629 static const XalanDOMChar s_preserveSpace[]; 00630 00631 // The string "apply-templates" 00632 static const XalanDOMChar s_applyTemplates[]; 00633 00634 // The string "namespace-alias" 00635 static const XalanDOMChar s_namespaceAlias[]; 00636 00637 // The string "processing-instruction" 00638 static const XalanDOMChar s_processingInstruction[]; 00639 00640 // A struct for an array that maps stylesheet element names 00641 // to int tokens. 00642 struct ElementTokenTableEntry 00643 { 00644 const XalanDOMChar* m_name; 00645 00646 eElementToken m_token; 00647 }; 00648 00649 static const ElementTokenTableEntry s_elementTokenTable[]; 00650 00651 static const unsigned int s_elementTokenTableSize; 00652 00653 static const ElementTokenTableEntry& s_elementTokenTableLast; 00654 00655 static const ElementTokenTableEntry& s_elementTokenTableDummy; 00656 }; 00657 00658 00659 00660 XALAN_CPP_NAMESPACE_END 00661 00662 00663 00664 #endif // STYLESHEETCONSTRUCTIONCONTEXTDEFAULT_HEADER_GUARD_1357924680
Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.
Xalan-C++ XSLT Processor Version 1.10 |
|