rss: convert to generic object payload
authorPhil Sutter <phil@nwl.cc>
Sun, 4 Oct 2009 17:14:30 +0000 (19:14 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 3 Nov 2009 22:23:22 +0000 (23:23 +0100)
src/core.c
src/rss.c
src/rss.h
src/text_object.h

index 2177355..2639ac8 100644 (file)
@@ -1554,8 +1554,7 @@ void free_text_objects(struct text_object *root, int internal)
 #endif
 #ifdef RSS
                        case OBJ_rss:
-                               free(data.rss.uri);
-                               free(data.rss.action);
+                               rss_free_obj_info(obj);
                                break;
 #endif
 #ifdef WEATHER
index 129823b..409bb1d 100644 (file)
--- a/src/rss.c
+++ b/src/rss.c
 #include <time.h>
 #include <assert.h>
 
+struct rss_data {
+       char uri[128];
+       char action[64];
+       int act_par;
+       float interval;
+       unsigned int nrspaces;
+};
+
 static ccurl_location_t *locations_head = 0;
 
 void rss_free_info(void)
@@ -150,31 +158,38 @@ static void rss_process_info(char *p, int p_max_size, char *uri, char *action, i
 
 void rss_scan_arg(struct text_object *obj, const char *arg)
 {
-       float interval = 0;
-       int argc, act_par = 0;
-       unsigned int nrspaces = 0;
-       char *uri = (char *) malloc(128 * sizeof(char));
-       char *action = (char *) malloc(64 * sizeof(char));
-
-       argc = sscanf(arg, "%127s %f %63s %d %u", uri, &interval, action,
-                       &act_par, &nrspaces);
+       int argc;
+       struct rss_data *rd;
+
+       rd = malloc(sizeof(struct rss_data));
+       memset(rd, 0, sizeof(struct rss_data));
+
+       argc = sscanf(arg, "%127s %f %63s %d %u", rd->uri, &rd->interval, rd->action,
+                       &rd->act_par, &rd->nrspaces);
        if (argc < 3) {
                NORM_ERR("wrong number of arguments for $rss");
+               free(rd);
                return;
        }
-       obj->data.rss.uri = uri;
-       obj->data.rss.interval = interval > 0 ? interval * 60 : 15*60;
-       obj->data.rss.action = action;
-       obj->data.rss.act_par = act_par;
-       obj->data.rss.nrspaces = nrspaces;
+       obj->data.opaque = rd;
 }
 
 void rss_print_info(struct text_object *obj, char *p, int p_max_size)
 {
-       if (!obj->data.rss.uri) {
+       struct rss_data *rd = obj->data.opaque;
+
+       if (!rd) {
                NORM_ERR("error processing RSS data");
                return;
        }
-       rss_process_info(p, p_max_size, obj->data.rss.uri, obj->data.rss.action,
-                       obj->data.rss.act_par, obj->data.rss.interval, obj->data.rss.nrspaces);
+       rss_process_info(p, p_max_size, rd->uri, rd->action,
+                       rd->act_par, rd->interval, rd->nrspaces);
+}
+
+void rss_free_obj_info(struct text_object *obj)
+{
+       if (obj->data.opaque) {
+               free(obj->data.opaque);
+               obj->data.opaque = NULL;
+       }
 }
index ff00d0a..c990481 100644 (file)
--- a/src/rss.h
+++ b/src/rss.h
@@ -5,6 +5,8 @@
 
 void rss_scan_arg(struct text_object *, const char *);
 void rss_print_info(struct text_object *, char *, int);
+void rss_free_obj_info(struct text_object *);
+
 void rss_free_info(void);
 
 #endif /*RSS_H_*/
index 4ba6278..da265cc 100644 (file)
@@ -493,15 +493,6 @@ struct text_object {
                        float interval;
                } curl;
 #endif
-#ifdef RSS
-               struct {
-                       char *uri;
-                       char *action;
-                       int act_par;
-                       float interval;
-                       unsigned int nrspaces;
-               } rss;
-#endif
 #ifdef WEATHER
                struct {
                        char *uri;