+ /* Add all recurrences */
+ rrule = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY);
+ while (rrule) {
+ recur = icalproperty_get_rrule(rrule);
+ iter = icalrecur_iterator_new(recur, cstart);
+
+ /* Add recurrence for this rrule */
+ while (1) {
+ istart = iend = icalrecur_iterator_next(iter);
+ if (icaltime_is_null_time(istart))
+ break; // no more instances
+ if (!icaltime_is_null_time(cend))
+ iend = icaltime_add(iend, length);
+
+ if (icaltime_compare(iend, start) <= 0)
+ continue; // instance ends before start time
+ if (icaltime_compare(istart, end) >= 0)
+ break; // instance begins after stop time
+
+ icalarray_append(array, &(ical_inst){
+ .cal = cal,
+ .comp = comp,
+ .start = istart,
+ .end = iend,
+ });
+ }
+
+ icalrecur_iterator_free(iter);
+ rrule = icalcomponent_get_next_property(comp, ICAL_RRULE_PROPERTY);
+ }