sfeed

simple feed reader - forked from git.codemadness.org/sfeed
git clone git://src.gearsix.net/sfeed
Log | Files | Refs | Atom | README | 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 }