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 } |