Libical API Documentation  3.0
icalrecur.h
Go to the documentation of this file.
1 /*======================================================================
2  FILE: icalrecur.h
3  CREATOR: eric 20 March 2000
4 
5  (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
6 
7  This library is free software; you can redistribute it and/or modify
8  it under the terms of either:
9 
10  The LGPL as published by the Free Software Foundation, version
11  2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
12 
13  Or:
14 
15  The Mozilla Public License Version 2.0. You may obtain a copy of
16  the License at https://www.mozilla.org/MPL/
17 ========================================================================*/
18 
66 #ifndef ICALRECUR_H
67 #define ICALRECUR_H
68 
69 #include "libical_ical_export.h"
70 #include "icalarray.h"
71 #include "icaltime.h"
72 
73 /*
74  * Recurrence enumerations
75  */
76 
77 typedef enum icalrecurrencetype_frequency
78 {
79  /* These enums are used to index an array, so don't change the
80  order or the integers */
81 
82  ICAL_SECONDLY_RECURRENCE = 0,
83  ICAL_MINUTELY_RECURRENCE = 1,
84  ICAL_HOURLY_RECURRENCE = 2,
85  ICAL_DAILY_RECURRENCE = 3,
86  ICAL_WEEKLY_RECURRENCE = 4,
87  ICAL_MONTHLY_RECURRENCE = 5,
88  ICAL_YEARLY_RECURRENCE = 6,
89  ICAL_NO_RECURRENCE = 7
90 } icalrecurrencetype_frequency;
91 
92 typedef enum icalrecurrencetype_weekday
93 {
94  ICAL_NO_WEEKDAY,
95  ICAL_SUNDAY_WEEKDAY,
96  ICAL_MONDAY_WEEKDAY,
97  ICAL_TUESDAY_WEEKDAY,
98  ICAL_WEDNESDAY_WEEKDAY,
99  ICAL_THURSDAY_WEEKDAY,
100  ICAL_FRIDAY_WEEKDAY,
101  ICAL_SATURDAY_WEEKDAY
102 } icalrecurrencetype_weekday;
103 
104 typedef enum icalrecurrencetype_skip
105 {
106  ICAL_SKIP_BACKWARD = 0,
107  ICAL_SKIP_FORWARD,
108  ICAL_SKIP_OMIT,
109  ICAL_SKIP_UNDEFINED
110 } icalrecurrencetype_skip;
111 
112 enum icalrecurrence_array_max_values
113 {
114  ICAL_RECURRENCE_ARRAY_MAX = 0x7f7f,
115  ICAL_RECURRENCE_ARRAY_MAX_BYTE = 0x7f
116 };
117 
118 /*
119  * Recurrence enumerations conversion routines.
120  */
121 
122 LIBICAL_ICAL_EXPORT icalrecurrencetype_frequency icalrecur_string_to_freq(const char *str);
123 LIBICAL_ICAL_EXPORT const char *icalrecur_freq_to_string(icalrecurrencetype_frequency kind);
124 
125 LIBICAL_ICAL_EXPORT icalrecurrencetype_skip icalrecur_string_to_skip(const char *str);
126 LIBICAL_ICAL_EXPORT const char *icalrecur_skip_to_string(icalrecurrencetype_skip kind);
127 
128 LIBICAL_ICAL_EXPORT const char *icalrecur_weekday_to_string(icalrecurrencetype_weekday kind);
129 LIBICAL_ICAL_EXPORT icalrecurrencetype_weekday icalrecur_string_to_weekday(const char *str);
130 
135 /* See RFC 5545 Section 3.3.10, RECUR Value, and RFC 7529
136  * for an explanation of the values and fields in struct icalrecurrencetype.
137  *
138  * The maximums below are based on lunisolar leap years (13 months)
139  */
140 #define ICAL_BY_SECOND_SIZE 62 /* 0 to 60 */
141 #define ICAL_BY_MINUTE_SIZE 61 /* 0 to 59 */
142 #define ICAL_BY_HOUR_SIZE 25 /* 0 to 23 */
143 #define ICAL_BY_MONTH_SIZE 14 /* 1 to 13 */
144 #define ICAL_BY_MONTHDAY_SIZE 32 /* 1 to 31 */
145 #define ICAL_BY_WEEKNO_SIZE 56 /* 1 to 55 */
146 #define ICAL_BY_YEARDAY_SIZE 386 /* 1 to 385 */
147 #define ICAL_BY_SETPOS_SIZE ICAL_BY_YEARDAY_SIZE /* 1 to N */
148 #define ICAL_BY_DAY_SIZE 7*(ICAL_BY_WEEKNO_SIZE-1)+1 /* 1 to N */
149 
152 {
153  icalrecurrencetype_frequency freq;
154 
155  /* until and count are mutually exclusive. */
156  struct icaltimetype until;
157  int count;
158 
159  short interval;
160 
161  icalrecurrencetype_weekday week_start;
162 
163  /* The BY* parameters can each take a list of values. Here I
164  * assume that the list of values will not be larger than the
165  * range of the value -- that is, the client will not name a
166  * value more than once.
167 
168  * Each of the lists is terminated with the value
169  * ICAL_RECURRENCE_ARRAY_MAX unless the list is full.
170  */
171 
172  short by_second[ICAL_BY_SECOND_SIZE];
173  short by_minute[ICAL_BY_MINUTE_SIZE];
174  short by_hour[ICAL_BY_HOUR_SIZE];
175  short by_day[ICAL_BY_DAY_SIZE];
185  short by_month_day[ICAL_BY_MONTHDAY_SIZE];
186  short by_year_day[ICAL_BY_YEARDAY_SIZE];
187  short by_week_no[ICAL_BY_WEEKNO_SIZE];
188  short by_month[ICAL_BY_MONTH_SIZE];
196  short by_set_pos[ICAL_BY_SETPOS_SIZE];
197 
198  /* For RSCALE extension (RFC 7529) */
199  char *rscale;
200  icalrecurrencetype_skip skip;
201 };
202 
203 #define ICALRECURRENCETYPE_INITIALIZER { \
204  ICAL_NO_RECURRENCE, /* freq */ \
205  ICALTIMETYPE_INITIALIZER, /* until */ \
206  0, /* count */ \
207  1, /* interval */ \
208  ICAL_MONDAY_WEEKDAY, /* week_start */ \
209  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_second */ \
210  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_minute */ \
211  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_hour */ \
212  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_day */ \
213  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_month_day */ \
214  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_year_day */ \
215  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_week_no */ \
216  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_month */ \
217  { ICAL_RECURRENCE_ARRAY_MAX_BYTE }, /* by_set_pos */ \
218  NULL, /* rscale */ \
219  ICAL_SKIP_OMIT /* skip */ \
220 }
221 
222 LIBICAL_ICAL_EXPORT int icalrecurrencetype_rscale_is_supported(void);
223 
224 LIBICAL_ICAL_EXPORT icalarray *icalrecurrencetype_rscale_supported_calendars(void);
225 
226 LIBICAL_ICAL_EXPORT void icalrecurrencetype_clear(struct icalrecurrencetype *r);
227 
228 /*
229  * Routines to decode the day values of the by_day array
230  */
231 
245 LIBICAL_ICAL_EXPORT enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day);
246 
253 LIBICAL_ICAL_EXPORT int icalrecurrencetype_day_position(short day);
254 
255 /*
256  * Routines to decode the 'month' element of the by_month array
257  */
258 
259 LIBICAL_ICAL_EXPORT int icalrecurrencetype_month_is_leap(short month);
260 
261 LIBICAL_ICAL_EXPORT int icalrecurrencetype_month_month(short month);
262 
263 /*
264  * Recurrence rule parser
265  */
266 
268 LIBICAL_ICAL_EXPORT struct icalrecurrencetype icalrecurrencetype_from_string(const char *str);
269 
270 LIBICAL_ICAL_EXPORT char *icalrecurrencetype_as_string(struct icalrecurrencetype *recur);
271 
272 LIBICAL_ICAL_EXPORT char *icalrecurrencetype_as_string_r(struct icalrecurrencetype *recur);
273 
274 /*
275  * Recurrence iteration routines
276  */
277 
279 
281 LIBICAL_ICAL_EXPORT icalrecur_iterator *icalrecur_iterator_new(struct icalrecurrencetype rule,
282  struct icaltimetype dtstart);
283 
291 LIBICAL_ICAL_EXPORT int icalrecur_iterator_set_start(icalrecur_iterator *impl,
292  struct icaltimetype start);
293 
295 LIBICAL_ICAL_EXPORT struct icaltimetype icalrecur_iterator_next(icalrecur_iterator *);
296 
298 LIBICAL_ICAL_EXPORT void icalrecur_iterator_free(icalrecur_iterator *);
299 
310 LIBICAL_ICAL_EXPORT int icalrecur_expand_recurrence(const char *rule, time_t start,
311  int count, time_t *array);
312 
313 #endif
An array of arbitrarily-sized elements which grows dynamically as elements are added.
int icalrecur_expand_recurrence(const char *rule, time_t start, int count, time_t *array)
Fills an array with the 'count' number of occurrences generated by the rrule.
Definition: icalrecur.c:3244
struct icalrecurrencetype icalrecurrencetype_from_string(const char *str)
Definition: icalrecur.c:555
void icalrecur_iterator_free(icalrecur_iterator *)
Definition: icalrecur.c:2065
struct icaltimetype icalrecur_iterator_next(icalrecur_iterator *)
Definition: icalrecur.c:2933
icalrecur_iterator * icalrecur_iterator_new(struct icalrecurrencetype rule, struct icaltimetype dtstart)
Definition: icalrecur.c:1952
enum icalrecurrencetype_weekday icalrecurrencetype_day_day_of_week(short day)
Decodes a day to a weekday.
Definition: icalrecur.c:3210
int icalrecurrencetype_day_position(short day)
Decodes a day to a position of the weekday.
Definition: icalrecur.c:3215
int icalrecur_iterator_set_start(icalrecur_iterator *impl, struct icaltimetype start)
Definition: icalrecur.c:3168
#define ICAL_BY_SECOND_SIZE
Definition: icalrecur.h:140
struct icaltimetype is a pseudo-object that abstracts time handling.
Definition: icalarray.h:36
Definition: icalrecur.c:925
Definition: icalrecur.h:152
short by_day[7 *(56 -1)+1]
Encoded value.
Definition: icalrecur.h:175
short by_month[14]
Encoded value.
Definition: icalrecur.h:188
Definition: icaltime.h:105
int month
Definition: icaltime.h:107