some cleanup
[ppastats.git] / src / ppastats.c
index 5fb0be1..74ed02b 100644 (file)
@@ -161,8 +161,7 @@ static struct arch_stats *get_arch_stats(struct distro_stats *distro,
 static struct daily_download_total **add_total
 (struct daily_download_total **totals, struct daily_download_total *total)
 {
-       struct daily_download_total **cur, **result;
-       struct daily_download_total *item;
+       struct daily_download_total **cur, **result, *item;
 
        if (totals) {
                cur = totals;
@@ -180,26 +179,24 @@ static struct daily_download_total **add_total
                }
        }
 
-       item = malloc(sizeof(struct daily_download_total));
-       memcpy(item, total, sizeof(struct daily_download_total));
-
        result = (struct daily_download_total **)list_add((void **)totals,
-                                                         (void *)item);
-
-       free(totals);
+                                                         ddt_clone(total));
 
        return result;
 }
 
-struct daily_download_total **add_totals
+static struct daily_download_total **add_totals
 (struct daily_download_total **total1, struct daily_download_total **total2)
 {
-       struct daily_download_total **cur, **result;
+       struct daily_download_total **cur, **result, **tmp;
 
        result = total1;
        cur = total2;
        while (*cur) {
-               result = add_total(result, *cur);
+               tmp = add_total(result, *cur);
+               if (result != total1 && result != tmp)
+                       free(result);
+               result = tmp;
                cur++;
        }
 
@@ -213,6 +210,7 @@ pkg_add_distro(struct package_stats *pkg,
               struct daily_download_total **ddts)
 {
        struct distro_stats **pkg_distros, *pkg_distro, **tmp;
+       struct daily_download_total **tmp_ddts;
 
        pkg_distros = pkg->distros;
        pkg_distro = NULL;
@@ -236,7 +234,11 @@ pkg_add_distro(struct package_stats *pkg,
        }
 
        pkg_distro->download_count += distro_count;
-       pkg_distro->ddts = add_totals(pkg_distro->ddts, ddts);
+
+       tmp_ddts = add_totals(pkg_distro->ddts, ddts);
+       if (pkg_distro->ddts && pkg_distro->ddts != tmp_ddts)
+               free(pkg_distro->ddts);
+       pkg_distro->ddts = tmp_ddts;
 }
 
 struct ppa_stats *
@@ -255,7 +257,7 @@ create_ppa_stats(const char *owner,
        struct distro_stats *distro;
        struct arch_stats *arch;
        int count;
-       struct daily_download_total **totals;
+       struct daily_download_total **totals, **tmp;
 
        ppa_url = get_archive_url(owner, ppa_name);
        history = get_bpph_list(ppa_url, package_status, ws_size);
@@ -290,18 +292,24 @@ create_ppa_stats(const char *owner,
                        = get_distro_series(arch_series->distroseries_link);
 
                ppa->download_count += count;
-               ppa->daily_download_totals
-                       = add_totals(ppa->daily_download_totals, totals);
+               tmp = add_totals(ppa->daily_download_totals, totals);
+               if (ppa->daily_download_totals != tmp)
+                       free(ppa->daily_download_totals);
+               ppa->daily_download_totals = tmp;
 
                pkg = get_package_stats(ppa, pkg_name);
                pkg->download_count += count;
-               pkg->daily_download_totals
-                       = add_totals(pkg->daily_download_totals, totals);
+               tmp = add_totals(pkg->daily_download_totals, totals);
+               if (pkg->daily_download_totals != tmp)
+                       free(pkg->daily_download_totals);
+               pkg->daily_download_totals = tmp;
 
                version = get_version_stats(pkg, pkg_version);
                version->download_count += count;
-               version->daily_download_totals
-                       = add_totals(version->daily_download_totals, totals);
+               tmp = add_totals(version->daily_download_totals, totals);
+               if (version->daily_download_totals != tmp)
+                       free(version->daily_download_totals);
+               version->daily_download_totals = tmp;
 
                distro = get_distro_stats(version, distro_series->name);
                distro->download_count += count;