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.
91 lines
2.0 KiB
C
91 lines
2.0 KiB
C
/*****************************************************************
|
|
* outline.c
|
|
*
|
|
* Copyright 1999, Clark Cooper
|
|
* All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the license contained in the
|
|
* COPYING file that comes with the expat distribution.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* Read an XML document from standard input and print an element
|
|
* outline on standard output.
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <expat.h>
|
|
|
|
#define BUFFSIZE 8192
|
|
|
|
char Buff[BUFFSIZE];
|
|
|
|
int Depth;
|
|
|
|
static void XMLCALL
|
|
start(void *data, const char *el, const char **attr)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < Depth; i++)
|
|
printf(" ");
|
|
|
|
printf("%s", el);
|
|
|
|
for (i = 0; attr[i]; i += 2) {
|
|
printf(" %s='%s'", attr[i], attr[i + 1]);
|
|
}
|
|
|
|
printf("\n");
|
|
Depth++;
|
|
}
|
|
|
|
static void XMLCALL
|
|
end(void *data, const char *el)
|
|
{
|
|
Depth--;
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
XML_Parser p = XML_ParserCreate(NULL);
|
|
if (! p) {
|
|
fprintf(stderr, "Couldn't allocate memory for parser\n");
|
|
exit(-1);
|
|
}
|
|
|
|
XML_SetElementHandler(p, start, end);
|
|
|
|
for (;;) {
|
|
int done;
|
|
int len;
|
|
|
|
len = fread(Buff, 1, BUFFSIZE, stdin);
|
|
if (ferror(stdin)) {
|
|
fprintf(stderr, "Read error\n");
|
|
exit(-1);
|
|
}
|
|
done = feof(stdin);
|
|
|
|
if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
|
|
fprintf(stderr, "Parse error at line %d:\n%s\n",
|
|
XML_GetCurrentLineNumber(p),
|
|
XML_ErrorString(XML_GetErrorCode(p)));
|
|
exit(-1);
|
|
}
|
|
|
|
if (done)
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|