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 } 91