126 lines
2.6 KiB
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;
|
|
}
|