Hi Ryan,
It sounds like you're mixing run-time libraries. See this FAQ for more
info:
http://xml.apache.org/xerces-c/faq-build.html#faq-12
Dave
|---------+--------------------------->
| | Ryan Sawatzky |
| | <[EMAIL PROTECTED]|
| | ox.com> |
| | |
| | 03/31/2003 06:54|
| | PM |
|---------+--------------------------->
>--------------------------------------------------------------------------------------------------------------------------------|
|
|
| To: [email protected]
|
| cc: (bcc: David N Bertoni/Cambridge/IBM)
|
| Subject: Re: Seg Fault when transcoding a XalanDOMString
|
>--------------------------------------------------------------------------------------------------------------------------------|
Hello Dave,
I have posted the code that calls the function below. First let me
explain some. The code that calls the below function is written in C
not C++. This is why the first parameter is a void pointer instead of a
XalanParsedSource pointer. But I am sure that the parameters passed
into the function are correct. The incomming array is actually a static
char array, and the length is computed by sizeof( array ).
-----Explaination of parameters in below function. -----
void *parsed_source = Really a XalanParsedSource pointer. This is the
same value as returned by a call to the XalanTransformer->parseSource()
function.
NLETS_XML_ID *id = This points to a structure on the stack, no dynamic
mem allocation.
#define XML_ID_LEN 40
typedef struct _NLETS_XML_ID_
{
char element[ XML_ID_LEN ];
char type[ 10 ];
} NLETS_XML_ID;
int IdentifyNletsDOM( void *parsed_source, NLETS_XML_ID *id, char
*err_buf, int err_len )
{
/* First of all, clear out the ID structure */
memset( id, NULL, sizeof( NLETS_XML_ID ) );
/* Convert the parsed source pointer */
XalanParsedSource *source = (XalanParsedSource*) parsed_source;
/* Grab the XML Document Root Node object */
XalanNode *node = (XalanNode*) source->getDocument();
if( node == NULL )
{
sprintf( err_buf, "The document is NULL" );
return 0;
}
/* Create a Xalan DOM String for comparison */
XalanDOMString *header_name = new XalanDOMString( "nletsHeader" );
if( header_name == NULL )
{
sprintf( err_buf, "Program out of memory" );
return 0;
}
/* Now we look for the NLETS Header element */
node = FindDOMElement( node, header_name );
/* Don't need the DOM String anymore so delete it */
delete header_name;
/* Make sure we found an nletsHeader node */
if( node == NULL )
{
sprintf( error_buf, "No <nletsHeader> element found" );
strncpy( err_buf, error_buf, err_len );
return 0;
}
/* Now node points to the NLETS Header element, so move to next
sibling */
node = getNextSiblingElement( node );
if( node == NULL )
{
sprintf( error_buf, "No message descriptor element" );
strncpy( err_buf, error_buf, err_len );
return 0;
}
/* Grab the name of the element */
ConvertDOMStringToCharArray( node->getNodeName(), id->element,
XML_ID_LEN );
rest of function.....
}
Also I ran into a similar problem in Xerces under Win2K when trying to
transcode a XMLString object. There are two ways to call the
XMLString::transcode() function. One allocated an array and then I had
to delete[] the returned array. This approach also seg faulted under
Win2K. I replaced that code by doing my own malloc() and free() of a
char array, and that seemed to have fixed the problem. I don't know if
that helps at all, but if there is a version of the
XalanDOMString::transcode() where the caller supplies a pre-allocated
char array, I could give that a try. Thanks again for your help.
--Ryan