1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/***************************************************************** 2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * outline.c 3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * 4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Copyright 1999, Clark Cooper 5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * All rights reserved. 6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * 7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * This program is free software; you can redistribute it and/or 8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * modify it under the terms of the license contained in the 9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * COPYING file that comes with the expat distribution. 10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * 11b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 12b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 13b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 14b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 15b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 17b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * 19b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Read an XML document from standard input and print an element 20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * outline on standard output. 21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Must be used with Expat compiled for UTF-8 output. 22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */ 23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdio.h> 26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <expat.h> 27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 28d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#if defined(__amigaos__) && defined(__USE_INLINE__) 29d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include <proto/expat.h> 30d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#endif 31d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes 32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_LARGE_SIZE 33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "I64" 35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else 36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "ll" 37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else 39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "l" 40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif 41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define BUFFSIZE 8192 43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectchar Buff[BUFFSIZE]; 45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint Depth; 47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL 49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstart(void *data, const char *el, const char **attr) 50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ 51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project int i; 52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project for (i = 0; i < Depth; i++) 54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project printf(" "); 55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project printf("%s", el); 57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project for (i = 0; attr[i]; i += 2) { 59b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project printf(" %s='%s'", attr[i], attr[i + 1]); 60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 61b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project printf("\n"); 63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project Depth++; 64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} 65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 66b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL 67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectend(void *data, const char *el) 68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ 69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project Depth--; 70b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} 71b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 72b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint 73b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectmain(int argc, char *argv[]) 74b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{ 75b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project XML_Parser p = XML_ParserCreate(NULL); 76b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (! p) { 77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "Couldn't allocate memory for parser\n"); 78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project exit(-1); 79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 80b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project XML_SetElementHandler(p, start, end); 82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project for (;;) { 84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project int done; 85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project int len; 86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 87d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes len = (int)fread(Buff, 1, BUFFSIZE, stdin); 88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (ferror(stdin)) { 89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "Read error\n"); 90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project exit(-1); 91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project done = feof(stdin); 93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) { 95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n", 96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project XML_GetCurrentLineNumber(p), 97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project XML_ErrorString(XML_GetErrorCode(p))); 98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project exit(-1); 99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project 101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project if (done) 102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project break; 103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project } 104d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes XML_ParserFree(p); 105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project return 0; 106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project} 107