sfeed

simple feed reader - forked from git.codemadness.org/sfeed
git clone git://src.gearsix.net/sfeedsfeed.zip
Log | Files | Refs | Atom | README | LICENSE

sfeed_opml_import.c (raw) (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 }