peiyongz 2003/07/31 10:05:03 Modified: c/src/xercesc/internal DGXMLScanner.cpp IGXMLScanner.cpp IGXMLScanner2.cpp SGXMLScanner.cpp XMLGrammarPoolImpl.cpp XMLGrammarPoolImpl.hpp Log: Grammar embed Grammar Description using getGrammar(URI) update GrammarDescription info Revision Changes Path 1.22 +11 -17 xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp Index: DGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- DGXMLScanner.cpp 24 Jul 2003 09:19:08 -0000 1.21 +++ DGXMLScanner.cpp 31 Jul 2003 17:05:03 -0000 1.22 @@ -923,9 +923,7 @@ { InputSource* sysIdSrc = resolveSystemId(sysId); Janitor<InputSource> janSysIdSrc(sysIdSrc); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(sysIdSrc->getSystemId()); - Janitor<XMLDTDDescription> janName(gramDesc); - Grammar* grammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId()); if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { @@ -981,10 +979,9 @@ unsigned int stringId = fGrammarResolver->getStringPool()->addOrFind(srcUsed->getSystemId()); const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(stringId); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->orphanGrammar(gramDesc); - gramDesc->setRootName(sysIdStr); - fGrammarResolver->putGrammar(gramDesc, fGrammar); + fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString); + ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr); + fGrammarResolver->putGrammar(fGrammar); } // In order to make the processing work consistently, we have to @@ -1686,8 +1683,7 @@ fValidator->reset(); fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->putGrammar(gramDesc, fDTDGrammar); + fGrammarResolver->putGrammar(fDTDGrammar); fGrammar = fDTDGrammar; fValidator->setGrammar(fGrammar); @@ -1708,10 +1704,9 @@ unsigned int sysId = fGrammarResolver->getStringPool()->addOrFind(src.getSystemId()); const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(sysId); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->orphanGrammar(gramDesc); - gramDesc->setRootName(sysIdStr); - fGrammarResolver->putGrammar(gramDesc, fGrammar); + fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString); + ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr); + fGrammarResolver->putGrammar(fGrammar); } // Handle the creation of the XML reader object for this input source. @@ -2044,8 +2039,7 @@ fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar); fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->putGrammar(gramDesc, fDTDGrammar); + fGrammarResolver->putGrammar(fDTDGrammar); fGrammar = fDTDGrammar; fRootGrammar = 0; fValidator->setGrammar(fGrammar); @@ -2291,7 +2285,7 @@ // check for duplicate namespace attributes: // by checking for qualified names with the same local part and with prefixes - // which have been bound to namespace names that are identical. + // which have been bound to namespace names that are identical. XMLAttr* loopAttr; for (int attrIndex=0; attrIndex < index; attrIndex++) { loopAttr = theAttrList->elementAt(attrIndex); @@ -2304,7 +2298,7 @@ , elemDecl->getFullName() ); } - } + } } } 1.20 +10 -15 xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp Index: IGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- IGXMLScanner.cpp 10 Jul 2003 19:47:23 -0000 1.19 +++ IGXMLScanner.cpp 31 Jul 2003 17:05:03 -0000 1.20 @@ -1328,9 +1328,7 @@ { InputSource* sysIdSrc = resolveSystemId(sysId); Janitor<InputSource> janSysIdSrc(sysIdSrc); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(sysIdSrc->getSystemId()); - Janitor<XMLDTDDescription> janName(gramDesc); - Grammar* grammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId()); if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) { @@ -1386,10 +1384,9 @@ unsigned int stringId = fGrammarResolver->getStringPool()->addOrFind(srcUsed->getSystemId()); const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(stringId); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->orphanGrammar(gramDesc); - gramDesc->setRootName(sysIdStr); - fGrammarResolver->putGrammar(gramDesc, fGrammar); + fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString); + ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr); + fGrammarResolver->putGrammar(fGrammar); } // In order to make the processing work consistently, we have to @@ -2855,8 +2852,7 @@ } fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->putGrammar(gramDesc, fDTDGrammar); + fGrammarResolver->putGrammar(fDTDGrammar); fGrammar = fDTDGrammar; fGrammarType = fGrammar->getGrammarType(); fValidator->setGrammar(fGrammar); @@ -2877,11 +2873,10 @@ unsigned int sysId = fGrammarResolver->getStringPool()->addOrFind(src.getSystemId()); const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(sysId); - - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->orphanGrammar(gramDesc); - gramDesc->setRootName(sysIdStr); - fGrammarResolver->putGrammar(gramDesc, fGrammar); + + fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString); + ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr); + fGrammarResolver->putGrammar(fGrammar); } // Handle the creation of the XML reader object for this input source. 1.29 +16 -17 xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp Index: IGXMLScanner2.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- IGXMLScanner2.cpp 24 Jul 2003 09:19:09 -0000 1.28 +++ IGXMLScanner2.cpp 31 Jul 2003 17:05:03 -0000 1.29 @@ -217,9 +217,7 @@ //if schema, see if we should lax or skip the validation of this attribute if (anyAttributeValidation(attWildCard, uriId, skipThisOne, laxThisOne)) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(getURIText(uriId)); - Janitor<XMLSchemaDescription> janName(gramDesc); - SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc); + SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(getURIText(uriId)); if (sGrammar && sGrammar->getGrammarType() == Grammar::SchemaGrammarType) { RefHashTableOf<XMLAttDef>* attRegistry = sGrammar->getAttributeDeclRegistry(); if (attRegistry) { @@ -457,7 +455,7 @@ // to the handler. We reuse its existing elements but expand it as // required. XMLAttr* curAttr; - + // check for duplicate namespace attributes: // by checking for qualified names with the same local part and with prefixes // which have been bound to namespace names that are identical. @@ -475,7 +473,7 @@ } } } - + if (retCount >= curAttListSize) { curAttr = new (fMemoryManager) XMLAttr @@ -889,8 +887,7 @@ fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar); fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager); - XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString); - fGrammarResolver->putGrammar(gramDesc, fDTDGrammar); + fGrammarResolver->putGrammar(fDTDGrammar); fGrammar = fDTDGrammar; fGrammarType = fGrammar->getGrammarType(); fRootGrammar = 0; @@ -1316,9 +1313,7 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uri); - Janitor<XMLSchemaDescription> janName(gramDesc); - Grammar* grammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* grammar = fGrammarResolver->getGrammar(uri); if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) { XSDDOMParser parser(0, fMemoryManager, 0); @@ -1420,9 +1415,7 @@ fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); } - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newUri); - Janitor<XMLSchemaDescription> janName(gramDesc); - grammar = fGrammarResolver->getGrammar(gramDesc); + grammar = fGrammarResolver->getGrammar(newUri); } if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) { @@ -1447,6 +1440,10 @@ } grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); + gramDesc->setLocationHints(srcToFill->getSystemId()); + TraverseSchema traverseSchema ( root @@ -1617,7 +1614,11 @@ DOMElement* root = document->getDocumentElement();// This is what we pass to TraverserSchema if (root != 0) { - SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); + gramDesc->setLocationHints(src.getSystemId()); + TraverseSchema traverseSchema ( root @@ -2627,9 +2628,7 @@ bool IGXMLScanner::switchGrammar(const XMLCh* const newGrammarNameSpace) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newGrammarNameSpace); - Janitor<XMLSchemaDescription> janName(gramDesc); - Grammar* tempGrammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* tempGrammar = fGrammarResolver->getGrammar(newGrammarNameSpace); if (!tempGrammar) { // This is a case where namespaces is on with a DTD grammar. 1.33 +12 -13 xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp Index: SGXMLScanner.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- SGXMLScanner.cpp 10 Jul 2003 19:47:23 -0000 1.32 +++ SGXMLScanner.cpp 31 Jul 2003 17:05:03 -0000 1.33 @@ -2055,9 +2055,7 @@ //if schema, see if we should lax or skip the validation of this attribute if (anyAttributeValidation(attWildCard, uriId, skipThisOne, laxThisOne)) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(getURIText(uriId)); - Janitor<XMLSchemaDescription> janName(gramDesc); - SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc); + SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(getURIText(uriId)); if (sGrammar && sGrammar->getGrammarType() == Grammar::SchemaGrammarType) { RefHashTableOf<XMLAttDef>* attRegistry = sGrammar->getAttributeDeclRegistry(); if (attRegistry) { @@ -3064,9 +3062,7 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uri); - Janitor<XMLSchemaDescription> janName(gramDesc); - Grammar* grammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* grammar = fGrammarResolver->getGrammar(uri); if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) { XSDDOMParser parser(0, fMemoryManager, 0); @@ -3168,9 +3164,7 @@ fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); } - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newUri); - Janitor<XMLSchemaDescription> janName(gramDesc); - grammar = fGrammarResolver->getGrammar(gramDesc); + grammar = fGrammarResolver->getGrammar(newUri); } if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) { @@ -3183,6 +3177,9 @@ } grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); + gramDesc->setLocationHints(srcToFill->getSystemId()); TraverseSchema traverseSchema ( @@ -3336,6 +3333,10 @@ if (root != 0) { SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager); + XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription(); + gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE); + gramDesc->setLocationHints(src.getSystemId()); + TraverseSchema traverseSchema ( root @@ -3989,9 +3990,7 @@ bool SGXMLScanner::switchGrammar(const XMLCh* const newGrammarNameSpace) { - XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newGrammarNameSpace); - Janitor<XMLSchemaDescription> janName(gramDesc); - Grammar* tempGrammar = fGrammarResolver->getGrammar(gramDesc); + Grammar* tempGrammar = fGrammarResolver->getGrammar(newGrammarNameSpace); if (!tempGrammar) { tempGrammar = fSchemaGrammar; 1.3 +15 -55 xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.cpp Index: XMLGrammarPoolImpl.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XMLGrammarPoolImpl.cpp 20 Jun 2003 22:19:30 -0000 1.2 +++ XMLGrammarPoolImpl.cpp 31 Jul 2003 17:05:03 -0000 1.3 @@ -56,6 +56,11 @@ /* * $Log$ + * Revision 1.3 2003/07/31 17:05:03 peiyongz + * Grammar embed Grammar Description + * using getGrammar(URI) + * update GrammarDescription info + * * Revision 1.2 2003/06/20 22:19:30 peiyongz * Stateless Grammar Pool :: Part I * @@ -90,26 +95,25 @@ :XMLGrammarPool(memMgr) ,fGrammarRegistry(0) { - fGrammarRegistry = new (memMgr) RefHashTableOf<GrammarEntry>(29, true, memMgr); + fGrammarRegistry = new (memMgr) RefHashTableOf<Grammar>(29, true, memMgr); } // ----------------------------------------------------------------------- // Implementation of Grammar Pool Interface // ----------------------------------------------------------------------- -void XMLGrammarPoolImpl::cacheGrammar(XMLGrammarDescription* const gramDesc - , Grammar* const gramToCache ) +void XMLGrammarPoolImpl::cacheGrammar(Grammar* const gramToCache ) { - if (!gramDesc || !gramToCache ) + if (!gramToCache ) return; - const XMLCh* grammarKey = gramDesc->getGrammarKey(); + const XMLCh* grammarKey = gramToCache->getGrammarDescription()->getGrammarKey(); if (fGrammarRegistry->containsKey(grammarKey)) { ThrowXML(RuntimeException, XMLExcepts::GC_ExistingGrammar); } - fGrammarRegistry->put((void*) grammarKey, new (getMemoryManager()) GrammarEntry(gramDesc, gramToCache)); + fGrammarRegistry->put((void*) grammarKey, gramToCache); } @@ -118,32 +122,16 @@ if (!gramDesc) return 0; - GrammarEntry* gramEntry = fGrammarRegistry->get(gramDesc->getGrammarKey()); + /*** + * This implementation simply use GrammarKey + */ + return fGrammarRegistry->get(gramDesc->getGrammarKey()); - if (!gramEntry) - return 0; - - return gramEntry->getGrammar(); } -Grammar* XMLGrammarPoolImpl::orphanGrammar(XMLGrammarDescription* const gramDesc) +Grammar* XMLGrammarPoolImpl::orphanGrammar(const XMLCh* const nameSpaceKey) { - if (!gramDesc) - return 0; - - GrammarEntry* gramEntry = fGrammarRegistry->orphanKey(gramDesc->getGrammarKey()); - - if (!gramEntry) - return 0; - - /*** - * Delete the grammarEntry but don't delete the grammar - */ - Grammar* theGram = gramEntry->getGrammar(); - gramEntry->nullGrammar(); - delete gramEntry; - - return theGram; + return fGrammarRegistry->orphanKey(nameSpaceKey); } void XMLGrammarPoolImpl::clear() @@ -182,32 +170,6 @@ XMLSchemaDescription* XMLGrammarPoolImpl::createSchemaDescription(const XMLCh* const targetNamespace) { return new (getMemoryManager()) XMLSchemaDescriptionImpl(targetNamespace, getMemoryManager()); -} - -// --------------------------------------------------------------------------- -// GrammarEntry: constructor and destructor -// --------------------------------------------------------------------------- -GrammarEntry::GrammarEntry(XMLGrammarDescription* const gramDesc - , Grammar* const grammar) -:fDescription(gramDesc) -,fGrammar(grammar) -{ -} - -/** - * - * A GrammarEntry is desctructed in two ways - * . from clear(), we need to destroy the GrammarDescription and Grammar - * . from orphanGrammar() - * - */ -GrammarEntry::~GrammarEntry() -{ - if (fDescription) - delete fDescription; - - if (fGrammar) - delete fGrammar; } XERCES_CPP_NAMESPACE_END 1.3 +8 -56 xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.hpp Index: XMLGrammarPoolImpl.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XMLGrammarPoolImpl.hpp 23 Jun 2003 21:06:21 -0000 1.2 +++ XMLGrammarPoolImpl.hpp 31 Jul 2003 17:05:03 -0000 1.3 @@ -56,6 +56,11 @@ /* * $Log$ + * Revision 1.3 2003/07/31 17:05:03 peiyongz + * Grammar embed Grammar Description + * using getGrammar(URI) + * update GrammarDescription info + * * Revision 1.2 2003/06/23 21:06:21 peiyongz * to solve unresolved symbol on Solaris * @@ -74,8 +79,6 @@ XERCES_CPP_NAMESPACE_BEGIN -class GrammarEntry; - class XMLUTIL_EXPORT XMLGrammarPoolImpl : public XMLGrammarPool { public : @@ -97,12 +100,10 @@ /** * cacheGrammar * - * @param gramDesc: the grammar description * @param gramToCache: the Grammar to be cached in the grammar pool * */ - virtual void cacheGrammar(XMLGrammarDescription* const gramDesc - , Grammar* const gramToCache); + virtual void cacheGrammar(Grammar* const gramToCache); /** @@ -120,11 +121,10 @@ * * grammar removed from the grammar pool and owned by the caller * - * @param gramDesc: the Grammar Description used to search for grammar - * cached in the grammar pool + * @param nameSpaceKey: Key sed to search for grammar in the grammar pool * */ - virtual Grammar* orphanGrammar(XMLGrammarDescription* const); + virtual Grammar* orphanGrammar(const XMLCh* const nameSpaceKey); /** * clear @@ -196,55 +196,9 @@ // container // // ----------------------------------------------------------------------- - RefHashTableOf<GrammarEntry>* fGrammarRegistry; + RefHashTableOf<Grammar>* fGrammarRegistry; }; - -/** - * Helper class, ought to be nested class - */ -class GrammarEntry : public XMemory -{ -public: - GrammarEntry(XMLGrammarDescription* const gramDesc - , Grammar* const grammar); - - ~GrammarEntry(); - - inline XMLGrammarDescription* getDescription() const; - - inline Grammar* getGrammar() const; - - inline void nullGrammar(); - - inline void nullDescription(); - -private: - - XMLGrammarDescription* fDescription; - Grammar* fGrammar; - -}; - -inline XMLGrammarDescription* GrammarEntry::getDescription() const -{ - return fDescription; -} - -inline Grammar* GrammarEntry::getGrammar() const -{ - return fGrammar; -} - -inline void GrammarEntry::nullGrammar() -{ - fGrammar = 0; -} - -inline void GrammarEntry::nullDescription() -{ - fDescription = 0; -} XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]