myxce/src/lib/window.c

126 lines
2.6 KiB
C

#include <errno.h>
#include <stdlib.h>
#include "utils.h"
#include "xce/errnox.h"
#include "xce/types.h"
static void kill_timewindow_time(xce_timewindow_time_t* t) { FREEUP(t); }
static void kill_timewindow_seg_config(xce_timewindow_seg_config_t* s)
{
if (s == NULL) {
return;
}
FREEUP(s->tz);
kill_timewindow_time(s->open);
kill_timewindow_time(s->close);
FREEUP(s);
}
static void kill_timewindow_config(xce_timewindow_config_t* w)
{
int i;
if (w == NULL) {
return;
}
if (w->segs != NULL) {
for (i = 0; i < w->nsegs; i++) {
xce_timewindow_seg_config_t* seg = w->segs[i];
kill_timewindow_seg_config(seg);
}
FREEUP(w->segs);
}
FREEUP(w);
}
void free_timewindow_config(xce_timewindow_config_t* w)
{
kill_timewindow_config(w);
}
static xce_timewindow_seg_config_t*
dup_timewindow_seg_config(xce_timewindow_seg_config_t* src)
{
xce_timewindow_seg_config_t* seg = NULL;
if (src == NULL) {
errno = EINVAL;
return NULL;
}
seg = (xce_timewindow_seg_config_t*)calloc(1, sizeof(*seg));
if (seg == NULL) {
errno = ENOMEM;
return NULL;
}
seg->tz = strdup(src->tz);
if (seg->tz == NULL) {
kill_timewindow_seg_config(seg);
errno = ENOMEM;
return NULL;
}
seg->open
= (xce_timewindow_time_t*)calloc(1, sizeof(xce_timewindow_time_t));
seg->close
= (xce_timewindow_time_t*)calloc(1, sizeof(xce_timewindow_time_t));
if ((seg->open == NULL) || (seg->close == NULL)) {
kill_timewindow_seg_config(seg);
errno = ENOMEM;
return NULL;
}
memcpy(seg->open, src->open, sizeof(xce_timewindow_time_t));
memcpy(seg->close, src->close, sizeof(xce_timewindow_time_t));
return seg;
}
xce_timewindow_config_t* dup_timewindow_config(xce_timewindow_config_t* src)
{
xce_timewindow_config_t* w;
int i;
if (src == NULL) {
errno = EINVAL;
return NULL;
}
w = (xce_timewindow_config_t*)calloc(1, sizeof(*w));
if (w == NULL) {
errno = ENOMEM;
return NULL;
}
w->segs = (xce_timewindow_seg_config_t**)calloc(
src->nsegs, sizeof(xce_timewindow_seg_config_t*));
if (w->segs == NULL) {
kill_timewindow_config(w);
errno = ENOMEM;
return NULL;
}
for (i = 0; i < src->nsegs; i++) {
w->segs[i] = dup_timewindow_seg_config(src->segs[i]);
if (w->segs[i] == NULL) {
kill_timewindow_config(w);
return NULL;
}
}
w->nsegs = src->nsegs;
return w;
}