fprintf(stderr, "Unrecognised month name '%s'\n", month);
return 0;
}
-static int weekday_to_number(const char *day)
+static int weekday_to_number(const char *day, int accept)
{
static char *days[] = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday",
- /* "Day", "Weekday", "WeekendDay" */
-
+ "Day", "Weekday", "WeekendDay"
};
int daynr;
- for (daynr = 0; daynr < 7; daynr++) {
+ for (daynr = 0; daynr < accept; daynr++) {
if (!strcmp(day, days[daynr]))
return daynr + 1;
}
if (!weeknr)
return -1;
- daynr = weekday_to_number(weekday);
+ daynr = weekday_to_number(weekday, 10);
if (!daynr)
return -1;
icalrecurrencetype_clear(ical_recur);
ical_recur->freq = ICAL_YEARLY_RECURRENCE;
ical_recur->by_month[0] = monthnr;
- if (weeknr > 0)
- ical_recur->by_day[0] = daynr + (weeknr * 8);
- else
- ical_recur->by_day[0] = -8 - daynr;
+
+
+ if (daynr < 8) {
+ if (weeknr > 0)
+ ical_recur->by_day[0] = daynr + (weeknr * 8);
+ else
+ ical_recur->by_day[0] = -8 - daynr;
+ } else if (daynr == 8) { /* Day */
+ ical_recur->by_month_day[0] = weeknr;
+ } else if (daynr == 9) { /* Weekday */
+ ical_recur->by_day[0] = 2;
+ ical_recur->by_day[1] = 3;
+ ical_recur->by_day[2] = 4;
+ ical_recur->by_day[3] = 5;
+ ical_recur->by_day[4] = 6;
+ ical_recur->by_set_pos[0] = weeknr;
+ } else if (daynr == 10) { /* WeekendDay */
+ ical_recur->by_day[0] = 1;
+ ical_recur->by_day[1] = 7;
+ ical_recur->by_set_pos[0] = weeknr;
+ }
return 0;
}
if (!weeknr)
return -1;
- daynr = weekday_to_number(weekday);
+ daynr = weekday_to_number(weekday, 10);
if (!daynr)
return -1;
icalrecurrencetype_clear(ical_recur);
ical_recur->freq = ICAL_MONTHLY_RECURRENCE;
ical_recur->interval = intervalnr;
- if (weeknr > 0)
- ical_recur->by_day[0] = daynr + (weeknr * 8);
- else
- ical_recur->by_day[0] = -8 - daynr;
-
+ if (daynr < 8) {
+ if (weeknr > 0)
+ ical_recur->by_day[0] = daynr + (weeknr * 8);
+ else
+ ical_recur->by_day[0] = -8 - daynr;
+ } else if (daynr == 8) { /* Day */
+ ical_recur->by_month_day[0] = weeknr;
+ } else if (daynr == 9) { /* Weekday */
+ ical_recur->by_day[0] = 2;
+ ical_recur->by_day[1] = 3;
+ ical_recur->by_day[2] = 4;
+ ical_recur->by_day[3] = 5;
+ ical_recur->by_day[4] = 6;
+ ical_recur->by_set_pos[0] = weeknr;
+ } else if (daynr == 10) { /* WeekendDay */
+ ical_recur->by_day[0] = 1;
+ ical_recur->by_day[1] = 7;
+ ical_recur->by_set_pos[0] = weeknr;
+ }
+
return 0;
}
int process_absolutemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_recur)
fprintf(stderr, "Failed to parse Interval '%s'\n", interval);
return -1;
}
- daynr = weekday_to_number(weekday);
+ daynr = weekday_to_number(weekday, 7);
if (!daynr)
return -1;
if (firstday)
- firstdaynr = weekday_to_number(firstday);
+ firstdaynr = weekday_to_number(firstday, 7);
else
firstdaynr = 0;