core/expat-2.0.1/examples/outline.c
changeset 300 b6d834208d33
parent 296 ea3dbc023c80
equal deleted inserted replaced
299:f06c5eba524d 300:b6d834208d33
       
     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  * Must be used with Expat compiled for UTF-8 output.
       
    22  */
       
    23 
       
    24 
       
    25 #include <stdio.h>
       
    26 #include <expat.h>
       
    27 
       
    28 #if defined(__amigaos__) && defined(__USE_INLINE__)
       
    29 #include <proto/expat.h>
       
    30 #endif
       
    31 
       
    32 #ifdef XML_LARGE_SIZE
       
    33 #if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
       
    34 #define XML_FMT_INT_MOD "I64"
       
    35 #else
       
    36 #define XML_FMT_INT_MOD "ll"
       
    37 #endif
       
    38 #else
       
    39 #define XML_FMT_INT_MOD "l"
       
    40 #endif
       
    41 
       
    42 #define BUFFSIZE        8192
       
    43 
       
    44 char Buff[BUFFSIZE];
       
    45 
       
    46 int Depth;
       
    47 
       
    48 static void XMLCALL
       
    49 start(void *data, const char *el, const char **attr)
       
    50 {
       
    51   int i;
       
    52 
       
    53   for (i = 0; i < Depth; i++)
       
    54     printf("  ");
       
    55 
       
    56   printf("%s", el);
       
    57 
       
    58   for (i = 0; attr[i]; i += 2) {
       
    59     printf(" %s='%s'", attr[i], attr[i + 1]);
       
    60   }
       
    61 
       
    62   printf("\n");
       
    63   Depth++;
       
    64 }
       
    65 
       
    66 static void XMLCALL
       
    67 end(void *data, const char *el)
       
    68 {
       
    69   Depth--;
       
    70 }
       
    71 
       
    72 int
       
    73 main(int argc, char *argv[])
       
    74 {
       
    75   XML_Parser p = XML_ParserCreate(NULL);
       
    76   if (! p) {
       
    77     fprintf(stderr, "Couldn't allocate memory for parser\n");
       
    78     exit(-1);
       
    79   }
       
    80 
       
    81   XML_SetElementHandler(p, start, end);
       
    82 
       
    83   for (;;) {
       
    84     int done;
       
    85     int len;
       
    86 
       
    87     len = (int)fread(Buff, 1, BUFFSIZE, stdin);
       
    88     if (ferror(stdin)) {
       
    89       fprintf(stderr, "Read error\n");
       
    90       exit(-1);
       
    91     }
       
    92     done = feof(stdin);
       
    93 
       
    94     if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
       
    95       fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",
       
    96               XML_GetCurrentLineNumber(p),
       
    97               XML_ErrorString(XML_GetErrorCode(p)));
       
    98       exit(-1);
       
    99     }
       
   100 
       
   101     if (done)
       
   102       break;
       
   103   }
       
   104   XML_ParserFree(p);
       
   105   return 0;
       
   106 }