sfeed_xmlenc.c - sfeed - RSS and Atom parser
(HTM) git clone git://git.codemadness.org/sfeed
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
sfeed_xmlenc.c (1335B)
---
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <strings.h>
4
5 #include "util.h"
6 #include "xml.h"
7
8 static XMLParser parser;
9 static int tags;
10
11 static void
12 xmltagstart(XMLParser *p, const char *t, size_t tl)
13 {
14 /* optimization: try to find a processing instruction only at the
15 * start of the data at the first few starting tags. */
16 if (tags++ > 3)
17 exit(0);
18 }
19
20 static void
21 xmlattr(XMLParser *p, const char *t, size_t tl, const char *n, size_t nl,
22 const char *v, size_t vl)
23 {
24 if (strcasecmp(t, "?xml") || strcasecmp(n, "encoding"))
25 return;
26
27 for (; *v; v++) {
28 if (ISALPHA((unsigned char)*v) ||
29 ISDIGIT((unsigned char)*v) ||
30 *v == '.' || *v == ':' || *v == '-' || *v == '_')
31 putchar(TOLOWER((unsigned char)*v));
32 }
33 }
34
35 static void
36 xmlattrend(XMLParser *p, const char *t, size_t tl, const char *n, size_t nl)
37 {
38 if (strcasecmp(t, "?xml") || strcasecmp(n, "encoding"))
39 return;
40 putchar('\n');
41 exit(0);
42 }
43
44 int
45 main(void)
46 {
47 if (pledge("stdio", NULL) == -1)
48 err(1, "pledge");
49
50 parser.xmlattr = xmlattr;
51 parser.xmlattrentity = xmlattr; /* no entity conversion */
52 parser.xmlattrend = xmlattrend;
53 parser.xmltagstart = xmltagstart;
54
55 /* NOTE: GETNEXT is defined in xml.h for inline optimization */
56 xml_parse(&parser);
57
58 checkfileerror(stdin, "<stdin>", 'r');
59 checkfileerror(stdout, "<stdout>", 'w');
60
61 return 0;
62 }