summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/chaos_calendar/extconf.rb3
-rw-r--r--lib/chaos_calendar/gen.sh6
-rw-r--r--lib/chaos_calendar/ical_occurrences.c48
-rw-r--r--lib/chaos_calendar/ical_occurrences.i6
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 @@
1require 'mkmf'
2have_library('ical')
3create_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
3rm -f Makefile *.o *wrap.c*
4swig -ruby ical_occurrences.i
5ruby extconf.rb
6make
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
8VALUE 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