int item_tag_nesting;
char *author_or_creator;
char *author_url;
+ StrBuf *CData;
}rss_item;
ri->chardata = 0;
ri->chardata_len = 0;
}
+ FreeStrBuf(&ri->CData);
}
void rss_xml_start(void *data, const char *supplied_el, const char **attr) {
/*
* This callback stores up the data which appears in between tags.
*/
+void rss_xml_cdata_start(void *data) {
+ rsscollection *rssc = (rsscollection*) data;
+ rss_item *ri = rssc->Item;
+
+ ri->CData = NewStrBuf();
+}
+
+void rss_xml_cdata_end(void *data) {
+ rsscollection *rssc = (rsscollection*) data;
+ rss_item *ri = rssc->Item;
+
+ ri->description = SmashStrBuf(&ri->CData);
+}
void rss_xml_chardata(void *data, const XML_Char *s, int len) {
rsscollection *rssc = (rsscollection*) data;
rss_item *ri = rssc->Item;
int new_len;
char *new_buffer;
- old_len = ri->chardata_len;
- new_len = old_len + len;
- new_buffer = realloc(ri->chardata, new_len + 1);
- if (new_buffer != NULL) {
- memcpy(&new_buffer[old_len], s, len);
- new_buffer[new_len] = 0;
- ri->chardata = new_buffer;
- ri->chardata_len = new_len;
+ if (ri->CData != NULL) {
+ StrBufAppendBufPlain (ri->CData, s, len, 0);
+ } else {
+ old_len = ri->chardata_len;
+ new_len = old_len + len;
+ new_buffer = realloc(ri->chardata, new_len + 1);
+ if (new_buffer != NULL) {
+ memcpy(&new_buffer[old_len], s, len);
+ new_buffer[new_len] = 0;
+ ri->chardata = new_buffer;
+ ri->chardata_len = new_len;
+ }
}
}
-
-
/*
* Callback function for passing libcurl's output to expat for parsing
*/
XML_SetElementHandler(xp, rss_xml_start, rss_xml_end);
XML_SetCharacterDataHandler(xp, rss_xml_chardata);
XML_SetUserData(xp, &rssc);
+ XML_SetCdataSectionHandler(xp,
+ rss_xml_cdata_start,
+ rss_xml_cdata_end);
if (CtdlThreadCheckStop())
{
XML_ParserFree(xp);