Hi,
Shouldn't we add a guard so that if the user calls it after parse() it
doesn't abend?  Perhaps using the fParseInProgress flag?

Undefined return value is one thing, crashing is another...

Regards,
David A. Cargill



                                                                           
             "Bob Freitas"                                                 
             <[EMAIL PROTECTED]                                             
             se.com>                                                    To 
                                       "Alberto Massari \(JIRA\)"          
             03/08/2005 05:29          <xerces-c-dev@xml.apache.org>       
             AM                                                         cc 
                                                                           
                                                                   Subject 
             Please respond to         RE: [jira] Resolved: (XERCESC-1364) 
               xerces-c-dev            Cores when using                    
                                       XercesDOMParser::getSrcOffset()     
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           




Hi Alberto,

Thanks, at least I know now.  Could I suggest that maybe someone should
strengthen the doc there--make it just a bit more clear.

Thanks!

-----Original Message-----
From: Alberto Massari (JIRA) [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 08, 2005 1:43 AM
To: Bob Freitas
Subject: [jira] Resolved: (XERCESC-1364) Cores when using
XercesDOMParser::getSrcOffset()

     [ http://issues.apache.org/jira/browse/XERCESC-1364?page=history ]

Alberto Massari resolved XERCESC-1364:
--------------------------------------

    Resolution: Invalid

Bob,
the getSrcOffset API returns the offset in the source stream during the
parse phase; invoking it after parse() returns produces an undefined
behaviour.

Alberto

> Cores when using XercesDOMParser::getSrcOffset()
> ------------------------------------------------
>
>          Key: XERCESC-1364
>          URL: http://issues.apache.org/jira/browse/XERCESC-1364
>      Project: Xerces-C++
>         Type: Bug
>   Components: DOM
>     Versions: 2.6.0
>  Environment: Solaris 2.8, Ultra 5, gcc 3.3.2
>     Reporter: Bob Freitas

>
> I want to do some additional checking on the info in the XML document,
so naturally I am going to need to communicate to the end-user.  I was
planning on using the getSrcOffset() method to get an idea of where I
was parsing in the XML.    Unfortunately, the getSrcOffset() just cores
when I try to use it.  Here is more or less what I am doing in my code.
I had to cut and paste from a bunch of different objects to get it in
one place.  I tried to include everything pertinent:
> // in the header file
> xercesc::XercesDOMParser* parser;
> xercesc::DOMDocument* doc;
> DOMParseErrorHandler* saxErrorHandler; // home grown object
> typedef vector<xercesc::DOMNode*> ElementCollection;
> // basic flow of program, only in mine spread over multiple objects
> parser = new xercesc::XercesDOMParser();
> saxErrorHandler = new DOMParseErrorHandler();
> parser->setErrorHandler(saxErrorHandler);
> parser->setCalculateSrcOfs(true);
> ... do a bunch of my own stuff
> const char* fileName; // gets received as a parameter
>
> try
> {
>   parser->parse( fileName );
> }
> catch (const xercesc::XMLException& e)
> {
>   ... do a whole bunch of catches and stuff here
> }
>
> doc = parser->getDocument();
> xercesc::DOMElement* root = doc->getDocumentElement();
> ElementCollection eleColl;
> if ( !getChildren(doc, root, &eleColl) )
> {
>   return DOM_TREE_NO_READ; // defined in a separate enum
> }
>
> ElementCollection::iterator nodeIter;
> ElementCollection::iterator nodeIterEnd = eleColl.end();
> for(nodeIter = eleColl.begin(); nodeIter != nodeIterEnd; ++nodeIter)
> {
>   xercesc::DOMNode* node = *nodeIter;
>   xercesc::DOMElement* ele = (xercesc::DOMElement*)node;
>   const XMLCh* nodeName = ele->getNodeName();
>
>   ... look for my XML tags of interest and process them
>
>   unsigned int offset = parser->getSrcOffset();
>   // cores on the above statement, see below for gdb trace
>
>
> }
>
> bool getChildren(xercesc::DOMDocument* doc,
> xercesc::DOMElement* parent, ElementCollection* eleColl)
> {
>   if ( doc == NULL )
>   {
>     Log(ERROR, ("Unable to read DOM tree, doc is empty");
>     return false;
>   }
>   if ( parent == NULL )
>   {
>     Log(ERROR, (char*)"Unable to read DOM tree, parent element is
empty");
>     return false;
>   }
>   assert( eleColl != NULL );
>
>   xercesc::DOMTreeWalker* walker = doc->createTreeWalker(parent,
>     xercesc::DOMNodeFilter::SHOW_ELEMENT, NULL, true);
>   if ( walker == NULL )
>   {
>     Log(ERROR, (char*)"Unable to read DOM tree, error creating tree
walker");
>     return false;
>   }
>   xercesc::DOMNode* node;
>   if ( ( node=walker->firstChild() ) != NULL )
>   {
>     while ( node != NULL )
>     {
>       eleColl->push_back(node);
>       node = walker->nextSibling();
>     }
>   }
>   if ( walker != NULL )
>   {
>     walker->release();
>   }
>   return true;
> }
> ------------------------------------
> gdb trace after core:
> (gdb) bt 10
> #0  xercesc_2_6::XMLString::replicate(char const*,
xercesc_2_6::MemoryManager*)
>     (toRep=0xfef44320 "XMLReader.cpp", manager=0x82100008) at
XMLString.cpp:511
> #1  0xfee0dabc in xercesc_2_6::XMLException::XMLException(char const*,
unsigned, xercesc_2_6::MemoryManager*) (this=0x6f8d0,
>     srcFile=0xfef44320 "XMLReader.cpp", srcLine=400,
memoryManager=0x82100008)
>     at XMLException.cpp:146
> #2  0xfee14288 in xercesc_2_6::XMLReader::getSrcOffset() const
(this=0x6f8d0)
>     at
/tmp/xerces-c-src_2_6_0/include/xercesc/util/RuntimeException.hpp:30
> Current language:  auto; currently c++
> (gdb) quit

--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to