xml/xmlexpatparser/src/expat-1.95.5/examples/outline.c
changeset 0 e35f40988205
equal deleted inserted replaced
-1:000000000000 0:e35f40988205
       
     1 /*****************************************************************
       
     2  * outline.c
       
     3  *
       
     4  * Copyright 1999, Clark Cooper
       
     5  * All rights reserved.
       
     6  *
       
     7  * This program is free software; you can redistribute it and/or
       
     8  * modify it under the terms of the license contained in the
       
     9  * COPYING file that comes with the expat distribution.
       
    10  *
       
    11  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
       
    12  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
       
    13  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
       
    14  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
       
    15  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
       
    16  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
       
    17  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
       
    18  *
       
    19  * Read an XML document from standard input and print an element
       
    20  * outline on standard output.
       
    21  */
       
    22 
       
    23 
       
    24 #include <stdio.h>
       
    25 #include <expat.h>
       
    26 
       
    27 #define BUFFSIZE        8192
       
    28 
       
    29 char Buff[BUFFSIZE];
       
    30 
       
    31 int Depth;
       
    32 
       
    33 static void
       
    34 start(void *data, const char *el, const char **attr)
       
    35 {
       
    36   int i;
       
    37 
       
    38   for (i = 0; i < Depth; i++)
       
    39     printf("  ");
       
    40 
       
    41   printf("%s", el);
       
    42 
       
    43   for (i = 0; attr[i]; i += 2) {
       
    44     printf(" %s='%s'", attr[i], attr[i + 1]);
       
    45   }
       
    46 
       
    47   printf("\n");
       
    48   Depth++;
       
    49 }
       
    50 
       
    51 static void
       
    52 end(void *data, const char *el)
       
    53 {
       
    54   Depth--;
       
    55 }
       
    56 
       
    57 int
       
    58 main(int argc, char *argv[])
       
    59 {
       
    60   XML_Parser p = XML_ParserCreate(NULL);
       
    61   if (! p) {
       
    62     fprintf(stderr, "Couldn't allocate memory for parser\n");
       
    63     exit(-1);
       
    64   }
       
    65 
       
    66   XML_SetElementHandler(p, start, end);
       
    67 
       
    68   for (;;) {
       
    69     int done;
       
    70     int len;
       
    71 
       
    72     len = fread(Buff, 1, BUFFSIZE, stdin);
       
    73     if (ferror(stdin)) {
       
    74       fprintf(stderr, "Read error\n");
       
    75       exit(-1);
       
    76     }
       
    77     done = feof(stdin);
       
    78 
       
    79     if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
       
    80       fprintf(stderr, "Parse error at line %d:\n%s\n",
       
    81               XML_GetCurrentLineNumber(p),
       
    82               XML_ErrorString(XML_GetErrorCode(p)));
       
    83       exit(-1);
       
    84     }
       
    85 
       
    86     if (done)
       
    87       break;
       
    88   }
       
    89   return 0;
       
    90 }