sfeed

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

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