From ce14f22d4b3c76c518f2c3188028c396cf2525c8 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sun, 18 Jul 2010 22:44:45 +0100 Subject: [PATCH] Fix handling of first/second/third/fourth/last day/weekday/weekendday --- ews2ical.c | 65 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/ews2ical.c b/ews2ical.c index ce672bb..9296840 100644 --- a/ews2ical.c +++ b/ews2ical.c @@ -376,16 +376,15 @@ static int month_to_number(const char *month) 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; } @@ -721,17 +720,34 @@ int process_relativeyearlyrecurrence(xmlNode *xml_node, struct icalrecurrencetyp 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; } @@ -801,18 +817,33 @@ int process_relativemonthlyrecurrence(xmlNode *xml_node, struct icalrecurrencety 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) @@ -878,12 +909,12 @@ int process_weeklyrecurrence(xmlNode *xml_node, struct icalrecurrencetype *ical_ 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; -- 2.49.0