#include #include #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; }