Hey,

        I completely agree.

Cheers,

Gareth

On 8 Mar 2005, at 14:42, 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?

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]



--
Gareth Reakes, Managing Director      Parthenon Computing
+44-1865-811184                  http://www.parthcomp.com


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



Reply via email to