Apache HTTPD
outline.c
Go to the documentation of this file.
1/* Read an XML document from standard input and print an element
2 outline on standard output.
3 Must be used with Expat compiled for UTF-8 output.
4 __ __ _
5 ___\ \/ /_ __ __ _| |_
6 / _ \\ /| '_ \ / _` | __|
7 | __// \| |_) | (_| | |_
8 \___/_/\_\ .__/ \__,_|\__|
9 |_| XML parser
10
11 Copyright (c) 2000 Clark Cooper <[email protected]>
12 Copyright (c) 2001-2003 Fred L. Drake, Jr. <[email protected]>
13 Copyright (c) 2005-2007 Steven Solie <[email protected]>
14 Copyright (c) 2005-2006 Karl Waclawek <[email protected]>
15 Copyright (c) 2016-2022 Sebastian Pipping <[email protected]>
16 Copyright (c) 2017 Rhodri James <[email protected]>
17 Licensed under the MIT license:
18
19 Permission is hereby granted, free of charge, to any person obtaining
20 a copy of this software and associated documentation files (the
21 "Software"), to deal in the Software without restriction, including
22 without limitation the rights to use, copy, modify, merge, publish,
23 distribute, sublicense, and/or sell copies of the Software, and to permit
24 persons to whom the Software is furnished to do so, subject to the
25 following conditions:
26
27 The above copyright notice and this permission notice shall be included
28 in all copies or substantial portions of the Software.
29
30 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
33 NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
34 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
35 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
36 USE OR OTHER DEALINGS IN THE SOFTWARE.
37*/
38
39#include <stdio.h>
40#include <expat.h>
41
42#ifdef XML_LARGE_SIZE
43# define XML_FMT_INT_MOD "ll"
44#else
45# define XML_FMT_INT_MOD "l"
46#endif
47
48#ifdef XML_UNICODE_WCHAR_T
49# define XML_FMT_STR "ls"
50#else
51# define XML_FMT_STR "s"
52#endif
53
54static void XMLCALL
55startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
56 int i;
57 int *const depthPtr = (int *)userData;
58
59 for (i = 0; i < *depthPtr; i++)
60 printf(" ");
61
63
64 for (i = 0; atts[i]; i += 2) {
65 printf(" %" XML_FMT_STR "='%" XML_FMT_STR "'", atts[i], atts[i + 1]);
66 }
67
68 printf("\n");
69 *depthPtr += 1;
70}
71
72static void XMLCALL
73endElement(void *userData, const XML_Char *name) {
74 int *const depthPtr = (int *)userData;
75 (void)name;
76
77 *depthPtr -= 1;
78}
79
80int
81main(void) {
83 int done;
84 int depth = 0;
85
86 if (! parser) {
87 fprintf(stderr, "Couldn't allocate memory for parser\n");
88 return 1;
89 }
90
91 XML_SetUserData(parser, &depth);
93
94 do {
95 void *const buf = XML_GetBuffer(parser, BUFSIZ);
96 if (! buf) {
97 fprintf(stderr, "Couldn't allocate memory for buffer\n");
99 return 1;
100 }
101
102 const size_t len = fread(buf, 1, BUFSIZ, stdin);
103
104 if (ferror(stdin)) {
105 fprintf(stderr, "Read error\n");
107 return 1;
108 }
109
110 done = feof(stdin);
111
112 if (XML_ParseBuffer(parser, (int)len, done) == XML_STATUS_ERROR) {
114 "Parse error at line %" XML_FMT_INT_MOD "u:\n%" XML_FMT_STR "\n",
118 return 1;
119 }
120 } while (! done);
121
123 return 0;
124}
const char apr_size_t len
Definition ap_regex.h:187
const XML_LChar * XML_ErrorString(enum XML_Error code)
Definition xmlparse.c:2429
#define XML_STATUS_ERROR
Definition expat.h:76
void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
Definition xmlparse.c:1691
enum XML_Error XML_GetErrorCode(XML_Parser parser)
Definition xmlparse.c:2318
XML_Parser XML_ParserCreate(const XML_Char *encoding)
Definition xmlparse.c:766
void XML_ParserFree(XML_Parser parser)
Definition xmlparse.c:1537
XML_Size XML_GetCurrentLineNumber(XML_Parser parser)
Definition xmlparse.c:2364
void XML_SetUserData(XML_Parser parser, void *userData)
Definition xmlparse.c:1637
enum XML_Status XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
Definition xmlparse.c:2037
void * XML_GetBuffer(XML_Parser parser, int len)
Definition xmlparse.c:2108
char XML_Char
#define XMLCALL
const unsigned char * buf
Definition util_md5.h:50
apr_xml_parser ** parser
Definition apr_xml.h:228
apr_size_t size
return NULL
Definition mod_so.c:359
int i
Definition mod_so.c:347
#define XML_FMT_INT_MOD
Definition outline.c:45
static void XMLCALL endElement(void *userData, const XML_Char *name)
Definition outline.c:73
static void XMLCALL startElement(void *userData, const XML_Char *name, const XML_Char **atts)
Definition outline.c:55
#define XML_FMT_STR
Definition outline.c:51
int main(void)
Definition outline.c:81
char * name