sfeed_opml_import.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_opml_import.c (2199B)
---
1 #include <stdio.h>
2 #include <strings.h>
3
4 #include "util.h"
5 #include "xml.h"
6
7 static XMLParser parser; /* XML parser state */
8 static char text[256], title[256], xmlurl[2048];
9
10 static void
11 printsafe(const char *s)
12 {
13 for (; *s; s++) {
14 if (ISCNTRL((unsigned char)*s))
15 continue;
16 else if (*s == '\\')
17 fputs("\\\\", stdout);
18 else if (*s == '\'')
19 fputs("'\\''", stdout);
20 else
21 putchar(*s);
22 }
23 }
24
25 static void
26 xmltagstart(XMLParser *p, const char *t, size_t tl)
27 {
28 text[0] = title[0] = xmlurl[0] = '\0';
29 }
30
31 static void
32 xmltagend(XMLParser *p, const char *t, size_t tl, int isshort)
33 {
34 if (strcasecmp(t, "outline"))
35 return;
36
37 if (xmlurl[0]) {
38 fputs("\tfeed '", stdout);
39 /* prefer title over text attribute */
40 if (title[0])
41 printsafe(title);
42 else if (text[0])
43 printsafe(text);
44 else
45 fputs("unnamed", stdout);
46 fputs("' '", stdout);
47 printsafe(xmlurl);
48 fputs("'\n", stdout);
49 }
50
51 text[0] = title[0] = xmlurl[0] = '\0';
52 }
53
54 static void
55 xmlattr(XMLParser *p, const char *t, size_t tl, const char *n, size_t nl,
56 const char *v, size_t vl)
57 {
58 if (strcasecmp(t, "outline"))
59 return;
60
61 if (!strcasecmp(n, "text"))
62 strlcat(text, v, sizeof(text));
63 else if (!strcasecmp(n, "title"))
64 strlcat(title, v, sizeof(title));
65 else if (!strcasecmp(n, "xmlurl"))
66 strlcat(xmlurl, v, sizeof(xmlurl));
67 }
68
69 static void
70 xmlattrentity(XMLParser *p, const char *t, size_t tl, const char *n, size_t nl,
71 const char *v, size_t vl)
72 {
73 char buf[8];
74 int len;
75
76 if ((len = xml_entitytostr(v, buf, sizeof(buf))) > 0)
77 xmlattr(p, t, tl, n, nl, buf, len);
78 else
79 xmlattr(p, t, tl, n, nl, v, vl);
80 }
81
82 int
83 main(void)
84 {
85 if (pledge("stdio", NULL) == -1)
86 err(1, "pledge");
87
88 parser.xmlattr = xmlattr;
89 parser.xmlattrentity = xmlattrentity;
90 parser.xmltagstart = xmltagstart;
91 parser.xmltagend = xmltagend;
92
93 fputs(
94 "#sfeedpath=\"$HOME/.sfeed/feeds\"\n"
95 "\n"
96 "# list of feeds to fetch:\n"
97 "feeds() {\n"
98 " # feed <name> <feedurl> [basesiteurl] [encoding]\n", stdout);
99 /* NOTE: GETNEXT is defined in xml.h for inline optimization */
100 xml_parse(&parser);
101 fputs("}\n", stdout);
102
103 checkfileerror(stdin, "<stdin>", 'r');
104 checkfileerror(stdout, "<stdout>", 'w');
105
106 return 0;
107 }