}
void calendar_spec_free(CalendarSpec *c) {
- assert(c);
+
+ if (!c)
+ return;
free_chain(c->year);
free_chain(c->month);
return 0;
}
-static bool chain_valid(CalendarComponent *c, int from, int to) {
+_pure_ static bool chain_valid(CalendarComponent *c, int from, int to) {
if (!c)
return true;
return true;
}
-bool calendar_spec_valid(CalendarSpec *c) {
+_pure_ bool calendar_spec_valid(CalendarSpec *c) {
assert(c);
if (c->weekdays_bits > 127)
errno = 0;
value = strtoul(*p, &e, 10);
- if (errno != 0)
+ if (errno > 0)
return -errno;
if (e == *p)
return -EINVAL;
if (*e == '/') {
repeat = strtoul(e+1, &ee, 10);
- if (errno != 0)
+ if (errno > 0)
return -errno;
if (ee == e+1)
return -EINVAL;
cc->value = value;
cc->repeat = 0;
- cc->next = NULL;
+ cc->next = *c;
*c = cc;
if (!c)
return -ENOMEM;
- if (strcasecmp(p, "hourly") == 0) {
+ if (strcaseeq(p, "minutely")) {
+ r = const_chain(0, &c->second);
+ if (r < 0)
+ goto fail;
+
+ } else if (strcaseeq(p, "hourly")) {
r = const_chain(0, &c->minute);
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcasecmp(p, "daily") == 0) {
+ } else if (strcaseeq(p, "daily")) {
r = const_chain(0, &c->hour);
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcasecmp(p, "monthly") == 0) {
+ } else if (strcaseeq(p, "monthly")) {
r = const_chain(1, &c->day);
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcasecmp(p, "weekly") == 0) {
+ } else if (strcaseeq(p, "annually") ||
+ strcaseeq(p, "yearly") ||
+ strcaseeq(p, "anually") /* backwards compatibility */ ) {
+
+ r = const_chain(1, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(1, &c->day);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->hour);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->minute);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->second);
+ if (r < 0)
+ goto fail;
+
+ } else if (strcaseeq(p, "weekly")) {
c->weekdays_bits = 1;
if (r < 0)
goto fail;
+ } else if (strcaseeq(p, "quarterly")) {
+
+ r = const_chain(1, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(4, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(7, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(10, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(1, &c->day);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->hour);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->minute);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->second);
+ if (r < 0)
+ goto fail;
+
+ } else if (strcaseeq(p, "biannually") ||
+ strcaseeq(p, "bi-annually") ||
+ strcaseeq(p, "semiannually") ||
+ strcaseeq(p, "semi-annually")) {
+
+ r = const_chain(1, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(7, &c->month);
+ if (r < 0)
+ goto fail;
+ r = const_chain(1, &c->day);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->hour);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->minute);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->second);
+ if (r < 0)
+ goto fail;
+
} else {
r = parse_weekdays(&p, c);
if (r < 0)
static int find_matching_component(const CalendarComponent *c, int *val) {
const CalendarComponent *n;
- int d;
+ int d = -1;
bool d_set = false;
int r;
if (t == (time_t) -1)
return -EINVAL;
-
*next = (usec_t) t * USEC_PER_SEC;
return 0;
}