Introduction
Introduction Statistics Contact Development Disclaimer Help
sfeed_opml_import.c - sfeed - RSS and Atom parser
git clone git://git.codemadness.org/sfeed
Log
Files
Refs
README
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, siz…
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"…
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 }
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.