#include <stdio.h>
#include <string.h>
-#include "list.h"
-#include "lp.h"
-
-char *time_to_str(time_t t)
-{
- char *str;
- struct tm *tm;
- size_t ret;
-
- tm = localtime(&t);
-
- if (!tm)
- return NULL;
-
- str = malloc(strlen("YYYY-MM-DDThh:mm:ss") + 1);
- ret = strftime(str, strlen("YYYY-MM-DDThh:mm:ss") + 1, "%FT%T", tm);
-
- if (ret)
- return str;
-
- free(str);
- return NULL;
-}
+#include <list.h>
+#include <lp.h>
+#include <ptime.h>
struct distro_series *distro_series_new(const char *name,
const char *version,
void bpph_list_free(struct bpph **list)
{
- struct bpph **l_cur = list;
+ struct bpph **cur;
- while (*l_cur) {
- bpph_free(*l_cur);
- l_cur++;
- }
+ if (list) {
+ cur = list;
- free(list);
+ while (*cur) {
+ bpph_free(*cur);
+ cur++;
+ }
+
+ free(list);
+ }
}
char *get_archive_url(const char *owner, const char *ppa)
void distro_arch_series_list_free(struct distro_arch_series **list)
{
+ struct distro_arch_series **cur;
+
if (list) {
- while (*list) {
- distro_arch_series_free(*list);
- list++;
+ cur = list;
+ while (*cur) {
+ distro_arch_series_free(*cur);
+ cur++;
}
free(list);
}
struct bpph **bpph_list_add(struct bpph **list, struct bpph *new)
{
- struct bpph **cur, *bpph;
+ struct bpph **cur, *bpph, **result;
if (list)
for (cur = list; *cur; cur++) {
return list;
}
- return (struct bpph **)list_add((void **)list, new);
+ result = (struct bpph **)list_add((void **)list, new);
+
+ free(list);
+
+ return result;
}
struct bpph **bpph_list_append_list(struct bpph **list1, struct bpph **list2)
return n;
}
+struct daily_download_total *ddt_clone(struct daily_download_total *ddt)
+{
+ struct daily_download_total *new;
+
+ new = malloc(sizeof(struct daily_download_total));
+
+ new->date = ddt->date;
+ new->count = ddt->count;
+
+ return new;
+}
+
+struct daily_download_total **
+ddts_clone(struct daily_download_total **ddts)
+{
+ int n, i;
+ struct daily_download_total **new;
+
+ n = ddts_length(ddts);
+
+ new = malloc((n + 1) * sizeof(struct daily_download_total *));
-struct daily_download_total **add_total
+ for (i = 0; i < n; i++)
+ new[i] = ddt_clone(ddts[i]);
+
+ new[n] = NULL;
+
+ return new;
+}
+
+/*
+ Return a newly allocated list with an additional ddt.
+ All ddts are cloned.
+ */
+static struct daily_download_total **add_ddt
(struct daily_download_total **totals, struct daily_download_total *total)
{
- struct daily_download_total **cur;
+ struct daily_download_total **cur, **ddts, **result;
struct daily_download_total *item;
if (totals) {
}
}
- item = malloc(sizeof(struct daily_download_total));
- memcpy(item, total, sizeof(struct daily_download_total));
+ ddts = ddts_clone(totals);
- return (struct daily_download_total **)
- list_add((void **)totals, (void *)item);
-}
+ result = (struct daily_download_total **)
+ list_add((void **)ddts, ddt_clone((void *)total));
+ free(ddts);
+
+ return result;
+}
struct daily_download_total **
ddts_merge(struct daily_download_total **ddts1,
struct daily_download_total **ddts, **cur, **tmp;
if (ddts1) {
- ddts = malloc((ddts_length(ddts1) + 1)
- * sizeof(struct daily_download_total *));
- memcpy(ddts, ddts1, (ddts_length(ddts1) + 1) * sizeof(void *));
+ ddts = ddts_clone(ddts1);
} else {
ddts = malloc(sizeof(struct daily_download_total *));
ddts[0] = NULL;
if (ddts2)
for (cur = ddts2; *cur; cur++) {
- tmp = add_total(ddts, *cur);
- if (tmp != ddts)
+ tmp = add_ddt(ddts, *cur);
+ if (tmp != ddts) {
+ daily_download_total_list_free(ddts);
ddts = tmp;
+ }
}
return ddts;