#include <u.h>#include <libc.h>#include <bio.h>#include "feed.h"#include "xml.h" static char rssdate[] = "?WWW, ?DD ?MM YYYY hh:mm:ss ?Z"; static voidfreerss(Feed *f){ xmlfree(f->aux);} Feed *parserss(Biobuf *b){ Xelem *x, *i; Item *item; Xattr *a; Feed *f; if((x = xmlread(b, 0)) == nil) return nil; if((f = calloc(1, sizeof(*f))) == nil){ xmlfree(x); return nil; } f->aux = x; f->free = freerss; if((x = xmlget(x, "channel", nil)) == nil){ werrstr("no channel"); goto error; } for(i = x->ch; i != nil; i = i->next) f->nitems += strcmp(i->n, "item") == 0; if((f->items = calloc(f->nitems, sizeof(Item))) == nil) goto error; item = f->items - 1; for(i = x->ch; i != nil; i = i->next){ if(strcmp(i->n, "link") == 0) f->link = i->v; else if(strcmp(i->n, "title") == 0) f->title = i->v; else if(strcmp(i->n, "description") == 0) f->descr = i->v; else if(strcmp(i->n, "managingEditor") == 0) f->editor = i->v; else if(strcmp(i->n, "ttl") == 0) f->ttl = atoi(i->v); else if(strcmp(i->n, "image") == 0) f->image = (x = xmlget(i, "url", nil)) != nil ? x->v : nil; else if(strcmp(i->n, "item") == 0){ item++; for(x = i->ch; x != nil; x = x->next){ if(strcmp(x->n, "guid") == 0) item->guid = x->v; else if(strcmp(x->n, "link") == 0) item->link = x->v; else if(strcmp(x->n, "title") == 0) item->title = x->v; else if(strcmp(x->n, "description") == 0) item->descr = x->v; else if(strcmp(x->n, "author") == 0) item->author = x->v; else if(strcmp(x->n, "pubDate") == 0) tmparse(&item->published, rssdate, x->v, tzone, nil); else if(strcmp(x->n, "enclosure") == 0){ if((a = xmlgetattr(x->a, "url")) != nil){ item->nencls++; item->encls = realloc(item->encls, item->nencls*sizeof(char*)); item->encls[item->nencls-1] = a->v; } } } } } return f;error: freerss(f); return nil;}
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "feed.h"
#include "xml.h"
static char rssdate[] = "?WWW, ?DD ?MM YYYY hh:mm:ss ?Z";
static void
freerss(Feed *f)
{
xmlfree(f->aux);
}
Feed *
parserss(Biobuf *b)
{
Xelem *x, *i;
Item *item;
Xattr *a;
Feed *f;
if((x = xmlread(b, 0)) == nil)
return nil;
if((f = calloc(1, sizeof(*f))) == nil){
xmlfree(x);
return nil;
}
f->aux = x;
f->free = freerss;
if((x = xmlget(x, "channel", nil)) == nil){
werrstr("no channel");
goto error;
}
for(i = x->ch; i != nil; i = i->next)
f->nitems += strcmp(i->n, "item") == 0;
if((f->items = calloc(f->nitems, sizeof(Item))) == nil)
goto error;
item = f->items - 1;
for(i = x->ch; i != nil; i = i->next){
if(strcmp(i->n, "link") == 0) f->link = i->v;
else if(strcmp(i->n, "title") == 0) f->title = i->v;
else if(strcmp(i->n, "description") == 0) f->descr = i->v;
else if(strcmp(i->n, "managingEditor") == 0) f->editor = i->v;
else if(strcmp(i->n, "ttl") == 0) f->ttl = atoi(i->v);
else if(strcmp(i->n, "image") == 0) f->image = (x = xmlget(i, "url", nil)) != nil ? x->v : nil;
else if(strcmp(i->n, "item") == 0){
item++;
for(x = i->ch; x != nil; x = x->next){
if(strcmp(x->n, "guid") == 0) item->guid = x->v;
else if(strcmp(x->n, "link") == 0) item->link = x->v;
else if(strcmp(x->n, "title") == 0) item->title = x->v;
else if(strcmp(x->n, "description") == 0) item->descr = x->v;
else if(strcmp(x->n, "author") == 0) item->author = x->v;
else if(strcmp(x->n, "pubDate") == 0) tmparse(&item->published, rssdate, x->v, tzone, nil);
else if(strcmp(x->n, "enclosure") == 0){
if((a = xmlgetattr(x->a, "url")) != nil){
item->nencls++;
item->encls = realloc(item->encls, item->nencls*sizeof(char*));
item->encls[item->nencls-1] = a->v;
}
}
}
}
}
return f;
error:
freerss(f);
return nil;
}