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]