2bba3d20f5
the use of modified default calling conventions in client code. To deal with this issue and generally clean up the mass of macros being used to support bits of the machinery, two new macros are being added: - XMLCALL, which expands to whatever is needed to nail down the calling convention for all calls across the library boundary. This must match the convention used for the system's malloc() implementation. - XMLIMPORT, defined to be whatever magic is needed to mark an entry point as imported from a dynamically loaded module (.dll, .so, .sl, whatever). These macros are used to define the XMLPARSEAPI macro already being used to define the API entry points. In addition, XMLCALL is used to define the types of callback functions, and all example code uses this explicitly in both the distributed applications and the documentation.
51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
/* This is simple demonstration of how to use expat. This program
|
|
reads an XML document from standard input and writes a line with
|
|
the name of each element to standard output indenting child
|
|
elements by one tab stop more than their parent element.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "expat.h"
|
|
|
|
static void XMLCALL
|
|
startElement(void *userData, const char *name, const char **atts)
|
|
{
|
|
int i;
|
|
int *depthPtr = userData;
|
|
for (i = 0; i < *depthPtr; i++)
|
|
putchar('\t');
|
|
puts(name);
|
|
*depthPtr += 1;
|
|
}
|
|
|
|
static void XMLCALL
|
|
endElement(void *userData, const char *name)
|
|
{
|
|
int *depthPtr = userData;
|
|
*depthPtr -= 1;
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
char buf[BUFSIZ];
|
|
XML_Parser parser = XML_ParserCreate(NULL);
|
|
int done;
|
|
int depth = 0;
|
|
XML_SetUserData(parser, &depth);
|
|
XML_SetElementHandler(parser, startElement, endElement);
|
|
do {
|
|
size_t len = fread(buf, 1, sizeof(buf), stdin);
|
|
done = len < sizeof(buf);
|
|
if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
|
|
fprintf(stderr,
|
|
"%s at line %d\n",
|
|
XML_ErrorString(XML_GetErrorCode(parser)),
|
|
XML_GetCurrentLineNumber(parser));
|
|
return 1;
|
|
}
|
|
} while (!done);
|
|
XML_ParserFree(parser);
|
|
return 0;
|
|
}
|