#include #include #include #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; }