Home | History | Annotate | Download | only in examples
      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 }
    107