44 #ifndef _SSIZE_T_DEFINED
46 #define _SSIZE_T_DEFINED
50 #include <sys/types.h>
57 #if defined __cplusplus
73 static char *
xData_getTraceback( statusMessageReporting *smr, xData_element *element );
74 static char *
xData_getTraceback2( statusMessageReporting *smr, xData_rootElement *parentRoot,
int n );
90 ssize_t count,
n =
sizeof(
buffer ) - 1;
92 xData_document *doc = NULL;
96 f = open( fileName, O_RDONLY );
99 smr_setMessageError( smr, NULL, __FILE__, __LINE__, xData_errFileError,
"could not open file %s", fileName ); }
101 while( ( count = read( f, buffer, n ) ) > 0 ) {
110 "read failed with errno = %d for %s", errno, fileName );
113 if( ( doc != NULL ) && ( !
smr_isOk( smr ) ) ) {
127 xData_document *doc = NULL;
148 if( ( doc = (xData_document*) xData_malloc2( smr,
sizeof( xData_document ), 1,
"xData_document" ) ) != NULL ) {
159 XML_Parser xmlParser;
161 doc->status = xData_statusParsing;
162 doc->error = xData_errNone;
164 doc->err = (XML_Error) 0;
167 doc->fileName = NULL;
168 doc->xDataTypeOk_userFunction = func;
169 doc->xDataTypeOk_userData =
userData;
173 if( xmlParser == NULL ) {
174 smr_setMessageError( smr, NULL, __FILE__, __LINE__, xData_errXML_ParserCreate,
"XML_ParserCreate failed" ); }
178 doc->currentRoot = &(doc->root);
189 if( doc->xmlParser ) {
193 if(
smr_isOk( smr ) && (
XML_Parse( doc->xmlParser, NULL, 0, 1 ) == XML_STATUS_ERROR ) ) {
194 doc->status = xData_statusError;
196 "status = %d\nXML_Error code = %d\nXML_ErrorString = %s\nerror line, column = %d, %d", xData_errXMLParser,
197 doc->err,
XML_ErrorString( doc->err ), doc->err_line, doc->err_column );
200 doc->xmlParser = NULL;
201 if( doc->status != xData_statusError ) doc->status = xData_statusCompleted;
214 doc->fileName = (
char*)
xData_free( smr, doc->fileName );
226 if( element == NULL )
return( NULL );
227 for( ; element != NULL; element = next ) {
228 next = element->next;
240 element->childrenRoot.children = (xData_element*)
xData_parseFreeElement( smr, element->childrenRoot.children );
241 if( ( !strcmp( element->name,
"xData" ) ) && ( element->xDataTypeInfo.release != NULL ) ) element->xDataTypeInfo.release( smr,
242 &(element->xDataTypeInfo) );
245 if( element->attributes.attributes )
xData_free( smr, element->attributes.attributes );
246 if( element->text.text )
xData_free( smr, element->text.text );
253 if( doc->status != xData_statusParsing )
return( doc->status );
254 if(
XML_Parse( doc->xmlParser, s, strlen( s ), 0 ) == XML_STATUS_ERROR )
return( -1 );
262 xData_document *doc = (xData_document *) userData;
273 xData_document *doc = (xData_document *) userData;
276 if( !strcmp( name,
"xData" ) ) {
277 xData_element *element = doc->currentRoot->parentRoot->currentChild;
278 xData_text *text = &(element->text);
280 if( !strcmp( value, xData_oned_x_ID ) ) {
282 else if( !strcmp( value, xData_twod_xy_ID ) ) {
284 else if( !strcmp( value, xData_twod_xindex_y_ID ) ) {
286 else if( !strcmp( value, xData_twod_xShared_yHistogram_ID ) ) {
288 else if( !strcmp( value, xData_matrix_ID ) ) {
292 if( doc->xDataTypeOk_userFunction != NULL ) {
293 if( doc->xDataTypeOk_userFunction( value, doc, doc->xDataTypeOk_userData ) ) status = 1;
296 "Unsupported xData type = %s", value );
298 if( ( status == 0 ) && (
smr_isOk( doc->smr ) ) ) status = element->xDataTypeInfo.toData( doc->smr, &(element->xDataTypeInfo),
299 &(element->attributes), text->text );
301 doc->currentRoot->currentChild = NULL;
302 doc->currentRoot = doc->currentRoot->parentRoot;
312 xData_document *doc = (xData_document*) userData;
313 xData_text *text = &(doc->currentRoot->parentRoot->currentChild->text);
314 int needSize = text->length + len + 1, l;
318 if( needSize < 8 ) needSize = 8;
320 if( needSize > (
int) text->allocated ) {
321 if( text->allocated != 0 ) {
322 l = ( 20 * text->allocated ) / 100;
323 if( l < 100 ) l = 100;
325 if( needSize < ( (
int) text->allocated + l ) ) needSize = text->allocated + l;
327 text->allocated = needSize;
329 text->text = (
char*) xData_realloc2( doc->smr, text->text, text->allocated,
"text" );
332 p = &(text->text[text->length]);
333 strncpy( p, s, len );
341 xData_element *parentElement,
int depth ) {
344 re->parentElement = parentElement;
345 re->parentRoot = NULL;
346 if( parentElement != NULL ) re->parentRoot = parentElement->parentRoot;
348 re->numberOfElements = 0;
350 re->currentChild = NULL;
368 xData_document *doc = parentRoot->xData_doc;
369 xData_element *element;
370 int i,
n, status = 1;
373 const char **pAttris;
378 element = (xData_element*) xData_malloc2( doc->smr,
sizeof( xData_element ), 1,
"xData_element" );
379 if( element == NULL )
return( 1 );
381 element->ordinal = parentRoot->numberOfElements;
383 element->accessed = 0;
384 element->parentRoot = parentRoot;
386 element->next = NULL;
388 if( ( element->name = (
char*) xData_malloc2( doc->smr, strlen( name ) + 1, 0,
"name" ) ) == NULL ) {
392 strcpy( element->name, name );
398 for( i = 0, lens = 0, pAttris = attris; *pAttris; i++, pAttris++ ) lens += strlen( *pAttris ) + 1;
400 element->attributes.size = n *
sizeof( xData_attribute ) + lens;
401 element->attributes.number =
n;
402 element->attributes.attributes = NULL;
404 if( element->attributes.size ) {
406 if( ( element->attributes.attributes = (xData_attribute*) xData_malloc2( doc->smr, element->attributes.size, 0,
"attributes") ) == NULL ) {
409 a = element->attributes.attributes;
410 p = (
char *) &(element->attributes.attributes[n]);
411 for( i = 0, pAttris = attris; ( i <
n ) && status; i++, a++, pAttris++ ) {
412 lens = strlen( *pAttris ) + 1;
414 strcpy( p, *pAttris );
417 lens = strlen( *pAttris ) + 1;
419 strcpy( p, *pAttris );
421 if( !strcmp(
"index", a->name ) ) {
423 element->index = strtoll( a->value, &e, 10 );
426 element->index = strtol( a->value, &e, 10 );
430 smr_setMessageError( doc->smr, smrUser, __FILE__, __LINE__, -1,
"could not convert index attribute = %s to integer", a->value );
437 xData_free( smr, element->attributes.attributes );
444 element->textOffset = 0;
446 if( parentRoot->parentElement != NULL ) element->textOffset = parentRoot->parentElement->text.length;
447 if( parentRoot->currentChild == NULL ) {
448 parentRoot->children = element; }
450 parentRoot->currentChild->next = element;
452 parentRoot->numberOfElements++;
453 parentRoot->currentChild = element;
454 doc->currentRoot = &(element->childrenRoot);
464 return( xData_errNone );
471 return( doc->status == xData_statusError );
484 item->parentElement = element;
486 if( item->element == NULL ) {
487 item->mode = xData_itemModeText;
488 if( element->text.length == 0 ) item->mode = xData_itemModeEnd; }
490 item->mode = xData_itemModeElement;
491 if( 0 < item->element->textOffset ) item->mode = xData_itemModeText;
493 item->textOffset = 0;
494 item->textLength = element->text.length;
495 if( item->element != NULL ) item->textLength = item->element->textOffset;
496 item->text = element->text.text;
497 return( item->mode );
504 if( item->mode != xData_itemModeEnd ) {
505 if( item->mode == xData_itemModeText ) {
506 item->mode = xData_itemModeElement;
507 if( item->element == NULL ) item->mode = xData_itemModeEnd;
508 item->textOffset += item->textLength;
509 item->textLength = 0;
510 item->text = &(item->parentElement->text.text[item->textOffset]); }
512 item->element = item->element->next;
513 item->mode = xData_itemModeText;
514 if( item->element == NULL ) {
515 if( item->textOffset < item->parentElement->text.length ) {
516 item->textLength = item->parentElement->text.length - item->textOffset; }
518 item->mode = xData_itemModeEnd;
521 item->textLength = item->element->textOffset - item->textOffset;
525 return( item->mode );
535 for( i = 0; i < attributes->number; i++ ) {
536 if( !strcmp( attributes->attributes[i].name, name ) ) {
537 value = attributes->attributes[i].value;
556 attributes->number = 0;
557 attributes->size = 0;
558 attributes->attributes = NULL;
570 xData_attribute *d, *
s;
574 if( ( dest->attributes = (xData_attribute*) xData_malloc2( smr, src->size, 0,
"attributes" ) ) == NULL )
return( 1 );
575 dest->number = src->number;
576 dest->size = src->size;
577 d = dest->attributes;
579 p = (
char *) &(dest->attributes[src->number]);
580 for( i = 0; i < src->number; i++, s++, d++ ) {
581 lens = strlen( s->name ) + 1;
583 strcpy( p, s->name );
585 lens = strlen( s->value ) + 1;
587 strcpy( p, s->value );
598 return( attributes->number );
605 if( index >= attributes->number )
return( NULL );
606 return( &(attributes->attributes[index]) );
613 attributes->number = 0;
614 attributes->size = 0;
616 attributes->attributes = (xData_attribute*)
xData_free( smr, attributes->attributes );
632 xDT->status = xData_xDataType_Ok;
633 xDT->typeString = NULL;
634 xDT->element = element;
636 xDT->toString = NULL;
638 xDT->indexPresent = 1;
639 xDT->startPresent = 1;
641 xDT->lengthPresent = 1;
652 int xData_getCommonData( statusMessageReporting *smr, xData_element *element, xData_Int *index, xData_Int *start, xData_Int *end,
653 xData_Int *length ) {
655 if( element->xDataTypeInfo.typeString == NULL ) {
659 *index = element->xDataTypeInfo.index;
660 *start = element->xDataTypeInfo.start;
661 *end = element->xDataTypeInfo.end;
662 *length = element->xDataTypeInfo.length;
670 xDataType *xDT = &(element->xDataTypeInfo);
681 if( ( xDT->endPresent > 0 ) ) {
682 if( xDT->lengthPresent > 0 ) {
683 smr_setMessageError( smr, smrUser, __FILE__, __LINE__, 1,
"missing length (or end) in xData" );
686 xDT->end = xDT->length; }
688 if( xDT->lengthPresent > 0 ) xDT->length = xDT->end;
691 if( xDT->startPresent > 0 ) xDT->start = 0;
692 if( xDT->start < 0 ) {
696 if( xDT->end < xDT->start ) {
697 smr_setMessageError( smr, smrUser, __FILE__, __LINE__, 1,
"start = %d >= end = %d", xDT->start, xDT->end );
700 if( xDT->length < 0 ) {
701 smr_setMessageError( smr, smrUser, __FILE__, __LINE__, 1,
"length = %d < 0", xDT->length );
719 *n = strtol( value, &e, 10 );
722 "could not convert attribute %s's value = %s to an integer", name, value );
738 *d = strtod( value, &e );
741 "could not convert attribute %s's values = %s to a double", name, value );
753 xData_element *child;
765 xData_element *child;
766 xData_elementListItem *p;
767 xData_elementList *list = NULL;
770 size =
sizeof( xData_elementList ) + n *
sizeof( xData_elementListItem );
772 if( ( list = (xData_elementList*) xData_malloc2( smr, size, 0,
"list" ) ) != NULL ) {
774 p = list->items = (xData_elementListItem *) &(list[1]);
776 if( !strcmp( child->name, tagName ) ) {
778 p->sortString = NULL;
789 const char *sortAttributeName, xData_sortElementFunc sortFunction ) {
793 xData_elementListItem *p;
796 if( sortFunction == NULL ) {
800 if( sortAttributeName == NULL ) sortAttributeName =
"index";
802 qsort( list->items, list->n,
sizeof( xData_elementListItem ), sortFunction );
812 xData_elementList *list;
813 xData_element *xData = NULL;
818 1,
"element %s does not have sub-element named %s", element->fullName, name ); }
819 else if( list->n > 1 ) {
821 "element %s contains more than one sub-element named %s", element->fullName, name ); }
823 xData = list->items[0].element;
846 name = element->name;
847 size = strlen( name ) + 1;
862 if( parentRoot->parentRoot == NULL ) {
864 s = (
char*) xData_malloc2( smr, n + 1, 0,
"traceback string" );
867 name = parentRoot->parentElement->name;
868 size = strlen( name ) + 1;
882 const char *s1 = ((xData_elementListItem *) p1)->sortString, *s2 = ((xData_elementListItem *) p2)->sortString;
884 if( s2 == NULL )
return( -1 );
885 if( s1 == NULL )
return( 1 );
886 return( strcmp( s1, s2 ) );
893 xData_element *
e1 = ((xData_elementListItem *) p1)->element, *
e2 = ((xData_elementListItem *) p2)->element;
895 return( e1->index -
e2->index );
900 int xData_is_xDataType( statusMessageReporting *smr, xDataType *xDT,
char const *
const type,
int setMsg ) {
902 if( xDT->typeString == NULL ) {
904 "element %s not xData object", xDT->element->fullName ); }
905 else if( xDT->typeString != type ) {
907 "Element %s is not xData object of type %s", type );
909 return( xDT->typeString == type );
916 return( doc->fileName );
921 int xData_setFileName( statusMessageReporting *smr, xData_document *doc,
char const *fileName ) {
923 doc->fileName = (
char*)
xData_free( smr, doc->fileName );
924 if( fileName != NULL ) {
926 if( ( doc->fileName = (
char*) xData_malloc2( smr, strlen( fileName ) + 1, 0,
"doc->fileName" ) ) == NULL )
return( 1 );
927 strcpy( doc->fileName, fileName );
936 xData_rootElement* root = element->parentRoot;
938 while( root->parentRoot != NULL ) root = root->parentRoot;
939 return( root->xData_doc );
946 if( doc == NULL )
return( NULL );
947 return( &(doc->smrUserInterface ) );
962 doc->smrUserInterface.doc = doc;
970 doc->smrUserInterface.smrUserInterface = NULL;
971 doc->smrUserInterface.doc = NULL;
979 int size, fileNameSize = 0, elementSize = 0;
980 xData_smr *smrUserInterface = (xData_smr *) userData;
981 static const char lcl[] =
"\nat line %d and column %d", el[] =
"\nin element ", fl[] =
"\nof file ";
982 char str_lcl[
sizeof( lcl ) + 40];
983 xData_rootElement *currentRoot = smrUserInterface->doc->currentRoot;
985 if( smrUserInterface->doc->fileName != NULL ) fileNameSize = strlen( smrUserInterface->doc->fileName ) + strlen( fl );
986 if( currentRoot != NULL ) {
987 if( currentRoot->parentElement != NULL ) {
988 sprintf( str_lcl, lcl, (
int)currentRoot->parentElement->docInfo.line, (
int)currentRoot->parentElement->docInfo.column );
989 elementSize = strlen( str_lcl ) + strlen( currentRoot->parentElement->fullName ) + strlen( el );
992 size = fileNameSize + elementSize;
993 if( ( fileNameSize != 0 ) && ( elementSize != 0 ) ) size++;
994 if( ( size > 0 ) && ( str != NULL ) ) {
996 if( ( *str = (
char*) malloc( size + 1 ) ) == NULL )
return( -1 );
997 if( ( size != 0 ) && ( elementSize != 0 ) ) {
998 sprintf( *str,
"%s%s%s%s%s", str_lcl, el, currentRoot->parentElement->fullName, fl, smrUserInterface->doc->fileName ); }
999 else if( size != 0 ) {
1000 sprintf( *str,
"%s%s", fl, smrUserInterface->doc->fileName ); }
1002 sprintf( *str,
"%s%s%s", str_lcl, el, currentRoot->parentElement->fullName );
1010 int xData_stringTo_xData_Int( statusMessageReporting *smr,
void *smrUserInterface,
char const *c, xData_Int *value,
char const *endings,
char **e ) {
1014 int status = 1,
n =
sizeof( tmp );
1016 for( s = c; *s != 0; s++ )
if( !isspace( *s ) )
break;
1018 *value = strtol( s, e, 10 );
1022 if( *endings == 0 )
while( isspace( **e ) ) (*e)++;
1026 if( *endings == 0 ) {
1027 smr_setMessageError( smr, smrUserInterface, __FILE__, __LINE__, 1,
"integer string \"%s\" does not end with a '\\0'",
1030 if( strchr( endings, **e ) == NULL ) {
1031 smr_setMessageError( smr, smrUserInterface, __FILE__, __LINE__, 1,
"integer string \"%s\" does not end with a white space or a '\\0\'",
1044 int xData_stringTo_double( statusMessageReporting *smr,
void *smrUserInterface,
char const *c,
double *value,
char const *endings,
char **e ) {
1048 int status = 1,
n =
sizeof( tmp );
1050 for( s = c; *s != 0; s++ )
if( !isspace( *s ) )
break;
1051 *value = strtod( s, e );
1055 if( *endings == 0 )
while( isspace( **e ) ) (*e)++;
1059 if( *endings == 0 ) {
1060 smr_setMessageError( smr, smrUserInterface, __FILE__, __LINE__, 1,
"double string \"%s\" does not end with a '\\0'",
1063 if( strchr( endings, **e ) == NULL ) {
1064 smr_setMessageError( smr, smrUserInterface, __FILE__, __LINE__, 1,
"double string \"%s\" does not end with a white space or a '\\0\'",
1080 element->accessed += increment;
1081 return( element->accessed );
1089 return( element->accessed );
1096 if( strlen( In ) > size ) {
1097 strncpy( Out, In, size - 5 );
1099 strcat( Out,
" ..." );
1105 #if defined __cplusplus
xData_Int xData_convertAttributeTo_xData_Int(statusMessageReporting *smr, xData_element *element, const char *name, xData_Int *n)
int xData_init_2d_xy(statusMessageReporting *smr, xData_element *element)
static int xData_parseInitializeText(xData_document *doc, xData_text *text)
xData_element * xData_getOneElementByTagName(statusMessageReporting *smr, xData_element *element, char *name, int required)
static void xData_parseFreeElementItems(statusMessageReporting *smr, xData_element *element)
int xData_addToAccessed(statusMessageReporting *, xData_element *element, int increment)
int xData_initializeAttributionList(statusMessageReporting *, xData_attributionList *attributes)
XML_Size XMLCALL XML_GetCurrentLineNumber(XML_Parser parser)
int xData_stringTo_xData_Int(statusMessageReporting *smr, void *smrUserInterface, char const *c, xData_Int *value, char const *endings, char **e)
char const * xData_getFileName(xData_document *doc)
enum xData_itemMode xData_getNextItem(xData_item *item)
int xData_xDataTypeConvertAttributes(statusMessageReporting *smr, xData_element *element)
xData_element * xData_getElements_xDataElement(statusMessageReporting *smr, xData_element *element)
int xData_init_2d_xShared_yHistogram(statusMessageReporting *smr, xData_element *element)
static void XMLCALL xData_parseEndElement(void *userData, const char *name)
int xData_getCommonData(statusMessageReporting *smr, xData_element *element, xData_Int *index, xData_Int *start, xData_Int *end, xData_Int *length)
xData_element * xData_getNextElement(xData_element *element)
static enum xData_errorCodes xData_parseGetCurrentPosition(xData_document *doc, xData_docInfo *docInfo)
const XML_LChar *XMLCALL XML_ErrorString(enum XML_Error code)
XML_Size XMLCALL XML_GetCurrentColumnNumber(XML_Parser parser)
xData_document * xData_parseReadFile(statusMessageReporting *smr, const char *fileName, xData_xDataTypeOk func, void *userData)
xData_attribute * xData_attributeByIndex(xData_attributionList *attributes, int index)
int smr_setMessageError(statusMessageReporting *smr, void *userInterface, const char *file, int line, int code, const char *fmt,...)
const char * xData_getAttributesValueInElement(xData_element *element, const char *name)
static void XMLCALL xData_parseStartElement(void *userData, const char *name, const char **attris)
char * xData_getAttributesValue(xData_attributionList *attributes, const char *name)
XML_Parser XMLCALL XML_ParserCreate(const XML_Char *encodingName)
int xData_init_2d_xindex_y(statusMessageReporting *smr, xData_element *element)
void * xData_get_smrUserInterfaceFromDocument(xData_document *doc)
int xData_getAccessed(statusMessageReporting *, xData_element *element)
xData_elementList * xData_getElementsByTagNameAndSort(statusMessageReporting *smr, xData_element *element, const char *tagName, const char *sortAttributeName, xData_sortElementFunc sortFunction)
xData_element * xData_getFirstElement(xData_element *element)
xData_element * xData_getDocumentsElement(xData_document *doc)
static void XMLCALL xData_parseCharacterData(void *userData, const XML_Char *s, int len)
void * xData_parseFree(statusMessageReporting *smr, xData_document *doc)
static char * xData_getTraceback2(statusMessageReporting *smr, xData_rootElement *parentRoot, int n)
int smr_isOk(statusMessageReporting *smr)
static int xData_elementList_defaultSorter(void const *p1, void const *p2)
int xData_parseIsError(xData_document *doc)
void XMLCALL XML_SetUserData(XML_Parser parser, void *p)
static int xData_smrUserInterfaceInitialize(xData_document *doc)
static int xData_smrUserInterface(void *userData, char **smr)
static void * xData_parseFreeElement(statusMessageReporting *smr, xData_element *element)
xData_document * xData_parseMalloc(statusMessageReporting *smr, xData_xDataTypeOk func, void *userData)
static void xData_parseInitializeRootElement(xData_document *doc, xData_rootElement *re, xData_element *parentElement, int depth)
enum XML_Error XMLCALL XML_GetErrorCode(XML_Parser parser)
xData_elementList * xData_getElementsByTagName(statusMessageReporting *smr, xData_element *element, const char *tagName)
int xData_numberOfElementsByTagName(statusMessageReporting *, xData_element *element, const char *tagName)
static char const * xData_shortStringForMessage(size_t size, char *Out, char const *In)
int xData_is_xDataType(statusMessageReporting *smr, xDataType *xDT, char const *const type, int setMsg)
static int xData_init_xDataTypeNone(xDataType *xDT, xData_element *element)
int xData_releaseAttributionList(statusMessageReporting *smr, xData_attributionList *attributes)
int xData_parseInitialize(statusMessageReporting *smr, xData_document *doc, xData_xDataTypeOk func, void *userData)
void XMLCALL XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
xData_document * xData_getElementsDocument(xData_element *element)
void * xData_free(statusMessageReporting *, void *p)
int xData_init_1d_x(statusMessageReporting *smr, xData_element *element)
enum xData_itemMode xData_getFirstItem(xData_element *element, xData_item *item)
static int xData_parseAddElementToRoot(statusMessageReporting *smr, xData_rootElement *parentRoot, const char *name, const char **attris)
int xData_stringTo_double(statusMessageReporting *smr, void *smrUserInterface, char const *c, double *value, char const *endings, char **e)
void * xData_get_smrUserInterfaceFromElement(xData_element *element)
static int xData_smrUserInterfaceFree(xData_document *doc)
int xData_copyAttributionList(statusMessageReporting *smr, xData_attributionList *dest, xData_attributionList *src)
void XMLCALL XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler)
int xData_setFileName(statusMessageReporting *smr, xData_document *doc, char const *fileName)
int xData_convertAttributeToDouble(statusMessageReporting *smr, xData_element *element, const char *name, double *d)
int xData_parse(xData_document *doc, const char *s)
int xData_init_matrix(statusMessageReporting *smr, xData_element *element)
enum XML_Status XMLCALL XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
static char * xData_getTraceback(statusMessageReporting *smr, xData_element *element)
static int xData_elementList_indexSorter(void const *p1, void const *p2)
void XMLCALL XML_ParserFree(XML_Parser parser)
int xData_attributeListLength(xData_attributionList *attributes)
xData_document * xData_parseString(statusMessageReporting *smr, const char *str, xData_xDataTypeOk func, void *userData)
int xData_parseEndOfXML(statusMessageReporting *smr, xData_document *doc)
void xData_freeElementList(statusMessageReporting *smr, xData_elementList *list)