diff options
Diffstat (limited to 'calendar/cal-util')
-rw-r--r-- | calendar/cal-util/cal-recur.c | 98 | ||||
-rw-r--r-- | calendar/cal-util/test-recur.c | 21 |
2 files changed, 80 insertions, 39 deletions
diff --git a/calendar/cal-util/cal-recur.c b/calendar/cal-util/cal-recur.c index 1fdb515502..74a0dbf6f7 100644 --- a/calendar/cal-util/cal-recur.c +++ b/calendar/cal-util/cal-recur.c @@ -1082,6 +1082,12 @@ generate_instances_for_chunk (CalComponent *comp, start_tm.tm_isdst = -1; start_time = mktime (&start_tm); + if (start_time == -1) { + g_warning ("mktime failed - time_t out of range?"); + finished = TRUE; + break; + } + if (start_time < comp_dtstart || (interval_end_time != -1 && start_time >= interval_end_time)) @@ -1107,6 +1113,12 @@ generate_instances_for_chunk (CalComponent *comp, end_tm.tm_isdst = -1; end_time = mktime (&end_tm); + if (end_time == -1) { + g_warning ("mktime failed - time_t out of range?"); + finished = TRUE; + break; + } + if (end_time < interval_start_time) continue; @@ -1426,12 +1438,18 @@ cal_obj_generate_set_yearly (RecurData *recur_data, occs_arrays[num_occs_arrays++] = occs; } - /* Add all the arrays together. */ - occs = occs_arrays[0]; - for (i = 1; i < num_occs_arrays; i++) { - occs2 = occs_arrays[i]; - g_array_append_vals (occs, occs2->data, occs2->len); - g_array_free (occs2, TRUE); + /* Add all the arrays together. If no filters were used we just + create an array with one element. */ + if (num_occs_arrays > 0) { + occs = occs_arrays[0]; + for (i = 1; i < num_occs_arrays; i++) { + occs2 = occs_arrays[i]; + g_array_append_vals (occs, occs2->data, occs2->len); + g_array_free (occs2, TRUE); + } + } else { + occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime)); + g_array_append_vals (occs, occ, 1); } /* Now expand BYHOUR, BYMINUTE & BYSECOND. */ @@ -1720,6 +1738,7 @@ cal_obj_remove_exceptions (GArray *occs, for (i = 0; i < occs_len; i++) { occ = &g_array_index (occs, CalObjTime, i); keep_occ = TRUE; + /* If the occurrence is a duplicate of the previous one, skip it. */ if (prev_occ @@ -1747,7 +1766,9 @@ cal_obj_remove_exceptions (GArray *occs, to one that matches or follows this occurrence. */ while (ex_occ) { - cmp = cal_obj_date_only_compare_func (ex_occ, occ); + cmp = cal_obj_time_compare_func (ex_occ, occ); + /* I'm pretty sure this is wrong. */ + /*cmp = cal_obj_date_only_compare_func (ex_occ, occ);*/ if (cmp > 0) break; @@ -3257,41 +3278,50 @@ cal_obj_time_compare_func (const void *arg1, const void *arg2) { CalObjTime *cotime1, *cotime2; + gint retval; cotime1 = (CalObjTime*) arg1; cotime2 = (CalObjTime*) arg2; if (cotime1->year < cotime2->year) - return -1; - if (cotime1->year > cotime2->year) - return 1; - - if (cotime1->month < cotime2->month) - return -1; - if (cotime1->month > cotime2->month) - return 1; + retval = -1; + else if (cotime1->year > cotime2->year) + retval = 1; + + else if (cotime1->month < cotime2->month) + retval = -1; + else if (cotime1->month > cotime2->month) + retval = 1; + + else if (cotime1->day < cotime2->day) + retval = -1; + else if (cotime1->day > cotime2->day) + retval = 1; + + else if (cotime1->hour < cotime2->hour) + retval = -1; + else if (cotime1->hour > cotime2->hour) + retval = 1; + + else if (cotime1->minute < cotime2->minute) + retval = -1; + else if (cotime1->minute > cotime2->minute) + retval = 1; + + else if (cotime1->second < cotime2->second) + retval = -1; + else if (cotime1->second > cotime2->second) + retval = 1; - if (cotime1->day < cotime2->day) - return -1; - if (cotime1->day > cotime2->day) - return 1; - - if (cotime1->hour < cotime2->hour) - return -1; - if (cotime1->hour > cotime2->hour) - return 1; - - if (cotime1->minute < cotime2->minute) - return -1; - if (cotime1->minute > cotime2->minute) - return 1; + else + retval = 0; - if (cotime1->second < cotime2->second) - return -1; - if (cotime1->second > cotime2->second) - return 1; +#if 0 + g_print ("%s - ", cal_obj_time_to_string (cotime1)); + g_print ("%s : %i\n", cal_obj_time_to_string (cotime2), retval); +#endif - return 0; + return retval; } static gint diff --git a/calendar/cal-util/test-recur.c b/calendar/cal-util/test-recur.c index 01a1719903..620e65c185 100644 --- a/calendar/cal-util/test-recur.c +++ b/calendar/cal-util/test-recur.c @@ -33,8 +33,12 @@ #include <cal-util/cal-recur.h> +/* Since events can recur infinitely, we set a limit to the number of + occurrences we output. */ +#define MAX_OCCURRENCES 1000 + static void usage (void); -static icalcomponent* scan_vcs_file (char *filename); +static icalcomponent* scan_ics_file (char *filename); static char* get_line (char *s, size_t size, void *data); @@ -59,7 +63,7 @@ main (int argc, filename = argv[1]; - icalcomp = scan_vcs_file (filename); + icalcomp = scan_ics_file (filename); if (icalcomp) generate_occurrences (icalcomp); @@ -76,7 +80,7 @@ usage (void) static icalcomponent* -scan_vcs_file (char *filename) +scan_ics_file (char *filename) { FILE *fp; icalcomponent *icalcomp; @@ -115,6 +119,7 @@ generate_occurrences (icalcomponent *icalcomp) { icalcomponent *tmp_icalcomp; CalComponent *comp; + gint occurrences; for (tmp_icalcomp = icalcomponent_get_first_component (icalcomp, ICAL_ANY_COMPONENT); tmp_icalcomp; @@ -137,7 +142,9 @@ generate_occurrences (icalcomponent *icalcomp) g_print ("%s\n\n", icalcomponent_as_ical_string (tmp_icalcomp)); cal_recur_generate_instances (comp, -1, -1, - occurrence_cb, NULL); + occurrence_cb, &occurrences); + + g_print ("%s\n\n", icalcomponent_as_ical_string (tmp_icalcomp)); } } @@ -149,6 +156,9 @@ occurrence_cb (CalComponent *comp, gpointer data) { char start[32], finish[32]; + gint *occurrences; + + occurrences = (gint*) data; strcpy (start, ctime (&instance_start)); start[24] = '\0'; @@ -157,5 +167,6 @@ occurrence_cb (CalComponent *comp, g_print ("%s - %s\n", start, finish); - return TRUE; + (*occurrences)++; + return (*occurrences == MAX_OCCURRENCES) ? FALSE : TRUE; } |