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]