You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by Alberto Massari <am...@datadirect.com> on 2005/03/09 17:07:53 UTC

RE: [jira] Resolved: (XERCESC-1364) Cores when using XercesDOMParser::getSrcOffset()

At 09.42 08/03/2005 -0500, David Cargill wrote:
>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?

Done; if there is no current reader, it returns 0.

Alberto


>Undefined return value is one thing, crashing is another...
>
>Regards,
>David A. Cargill
>
>
>
>
>              "Bob Freitas"
>              <bfreitas@micromu
>              se.com>                                                    To
>                                        "Alberto Massari \(JIRA\)"
>              03/08/2005 05:29          <xe...@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:xerces-c-dev@xml.apache.org]
>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: xerces-c-dev-unsubscribe@xml.apache.org
>For additional commands, e-mail: xerces-c-dev-help@xml.apache.org
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
>For additional commands, e-mail: xerces-c-dev-help@xml.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org