diff options
| -rw-r--r-- | lib/chaos_calendar/extconf.rb | 3 | ||||
| -rw-r--r-- | lib/chaos_calendar/gen.sh | 6 | ||||
| -rw-r--r-- | lib/chaos_calendar/ical_occurrences.c | 48 | ||||
| -rw-r--r-- | lib/chaos_calendar/ical_occurrences.i | 6 |
4 files changed, 63 insertions, 0 deletions
diff --git a/lib/chaos_calendar/extconf.rb b/lib/chaos_calendar/extconf.rb new file mode 100644 index 0000000..2eef938 --- /dev/null +++ b/lib/chaos_calendar/extconf.rb | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | require 'mkmf' | ||
| 2 | have_library('ical') | ||
| 3 | create_makefile('ical_occurrences') | ||
diff --git a/lib/chaos_calendar/gen.sh b/lib/chaos_calendar/gen.sh new file mode 100644 index 0000000..2f5351a --- /dev/null +++ b/lib/chaos_calendar/gen.sh | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | rm -f Makefile *.o *wrap.c* | ||
| 4 | swig -ruby ical_occurrences.i | ||
| 5 | ruby extconf.rb | ||
| 6 | make | ||
diff --git a/lib/chaos_calendar/ical_occurrences.c b/lib/chaos_calendar/ical_occurrences.c new file mode 100644 index 0000000..2f36d8c --- /dev/null +++ b/lib/chaos_calendar/ical_occurrences.c | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | #include <ruby.h> | ||
| 2 | #include <ical.h> | ||
| 3 | |||
| 4 | //#define RRULE "FREQ=MONTHLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11;BYDAY=-1WE;UNTIL=20091105T220000" | ||
| 5 | //#define RRULE "FREQ=DAILY;UNTIL=20991111T220000;VFOO" | ||
| 6 | //#define DTSTART "20000101T010000" | ||
| 7 | |||
| 8 | VALUE occurrences( char *dtstart, char *dtend, char *rrule ) { | ||
| 9 | VALUE occurr = rb_ary_new(); | ||
| 10 | |||
| 11 | icalerror_clear_errno(); | ||
| 12 | icalerror_set_error_state( ICAL_MALFORMEDDATA_ERROR, ICAL_ERROR_NONFATAL); | ||
| 13 | |||
| 14 | struct icalrecurrencetype recur = icalrecurrencetype_from_string( rrule ); | ||
| 15 | if( icalerrno != ICAL_NO_ERROR ) { | ||
| 16 | printf( "libical error: %i. -- 1\n", icalerrno ); | ||
| 17 | return occurr; | ||
| 18 | } | ||
| 19 | struct icaltimetype start = icaltime_from_string( dtstart ); | ||
| 20 | if( icalerrno != ICAL_NO_ERROR ) { | ||
| 21 | printf( "libical error: %i. -- 2\n", icalerrno ); | ||
| 22 | return occurr; | ||
| 23 | } | ||
| 24 | struct icaltimetype end = icaltime_from_string( dtend ); | ||
| 25 | if( icalerrno != ICAL_NO_ERROR ) { | ||
| 26 | printf( "libical error: %i. -- 3\n", icalerrno ); | ||
| 27 | return occurr; | ||
| 28 | } | ||
| 29 | |||
| 30 | icalrecur_iterator* ritr = icalrecur_iterator_new( recur, start ); | ||
| 31 | |||
| 32 | while(1) { | ||
| 33 | // char outbuf[1024] = {0}; | ||
| 34 | struct icaltimetype next = icalrecur_iterator_next(ritr); | ||
| 35 | |||
| 36 | if( icaltime_is_null_time(next) || ( icaltime_compare( next, end ) > 0 ) ) { | ||
| 37 | icalrecur_iterator_free(ritr); | ||
| 38 | return occurr; | ||
| 39 | } | ||
| 40 | |||
| 41 | rb_ary_push( occurr, rb_time_new( icaltime_as_timet( next ), 0 ) ); | ||
| 42 | // print_datetime_to_string( outbuf, &next ); | ||
| 43 | // rb_ary_push( occurr, rb_str_new2( outbuf ) ); | ||
| 44 | }; | ||
| 45 | |||
| 46 | icalrecur_iterator_free(ritr); | ||
| 47 | return occurr; | ||
| 48 | } | ||
diff --git a/lib/chaos_calendar/ical_occurrences.i b/lib/chaos_calendar/ical_occurrences.i new file mode 100644 index 0000000..5f7efd5 --- /dev/null +++ b/lib/chaos_calendar/ical_occurrences.i | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | %module ical_occurrences | ||
| 2 | |||
| 3 | %inline { | ||
| 4 | VALUE occurrences( char * dtstart, char * dtend, char * rrule ); | ||
| 5 | } | ||
| 6 | |||
