summaryrefslogtreecommitdiffabout
path: root/libical/src/libical/icalduration.c
Side-by-side diff
Diffstat (limited to 'libical/src/libical/icalduration.c') (more/less context) (ignore whitespace changes)
-rw-r--r--libical/src/libical/icalduration.c89
1 files changed, 49 insertions, 40 deletions
diff --git a/libical/src/libical/icalduration.c b/libical/src/libical/icalduration.c
index 4468e0f..821a3b7 100644
--- a/libical/src/libical/icalduration.c
+++ b/libical/src/libical/icalduration.c
@@ -38,10 +38,5 @@
-#ifdef ICAL_NO_LIBICAL
-#define icalerror_set_errno(x)
-#define icalerror_check_arg_rv(x,y)
-#define icalerror_check_arg_re(x,y,z)
-#else
#include "icalerror.h"
#include "icalmemory.h"
-#endif
+#include "icalvalue.h"
@@ -53,30 +48,28 @@ struct icaldurationtype icaldurationtype_from_int(int t)
{
- struct icaldurationtype dur;
- int used = 0;
-
- dur = icaldurationtype_null_duration();
-
- if(t < 0){
- dur.is_neg = 1;
- t = -t;
- }
-
- if (t % (60 * 60 * 24 * 7) == 0) {
- dur.weeks = t / (60 * 60 * 24 * 7);
- } else {
- used += dur.weeks * (60 * 60 * 24 * 7);
- dur.days = (t - used) / (60 * 60 * 24);
- used += dur.days * (60 * 60 * 24);
- dur.hours = (t - used) / (60 * 60);
- used += dur.hours * (60 * 60);
- dur.minutes = (t - used) / (60);
- used += dur.minutes * (60);
- dur.seconds = (t - used);
- }
+ struct icaldurationtype dur;
+ int used = 0;
+
+ dur = icaldurationtype_null_duration();
+
+ if(t < 0){
+ dur.is_neg = 1;
+ t = -t;
+ }
+
+ if (t % (60 * 60 * 24 * 7) == 0) {
+ dur.weeks = t / (60 * 60 * 24 * 7);
+ } else {
+ used += dur.weeks * (60 * 60 * 24 * 7);
+ dur.days = (t - used) / (60 * 60 * 24);
+ used += dur.days * (60 * 60 * 24);
+ dur.hours = (t - used) / (60 * 60);
+ used += dur.hours * (60 * 60);
+ dur.minutes = (t - used) / (60);
+ used += dur.minutes * (60);
+ dur.seconds = (t - used);
+ }
- return dur;
+ return dur;
}
-#ifndef ICAL_NO_LIBICAL
-#include "icalvalue.h"
struct icaldurationtype icaldurationtype_from_string(const char* str)
@@ -140,3 +133,3 @@ struct icaldurationtype icaldurationtype_from_string(const char* str)
/* Get all of the digits, not one at a time */
- scan_size = sscanf((char*)(str+i),"%d",&digits);
+ scan_size = sscanf(&str[i],"%d",&digits);
if(scan_size == 0) goto error;
@@ -189,5 +182,3 @@ struct icaldurationtype icaldurationtype_from_string(const char* str)
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- memset(&d, 0, sizeof(struct icaldurationtype));
- return d;
-
+ return icaldurationtype_bad_duration();
}
@@ -195,2 +186,3 @@ struct icaldurationtype icaldurationtype_from_string(const char* str)
#define TMP_BUF_SIZE 1024
+static
void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size,
@@ -255,3 +247,3 @@ char* icaldurationtype_as_ical_string(struct icaldurationtype d)
} else {
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PTS0");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PT0S");
}
@@ -265,4 +257,2 @@ char* icaldurationtype_as_ical_string(struct icaldurationtype d)
-#endif
-
@@ -279,3 +269,3 @@ int icaldurationtype_as_int(struct icaldurationtype dur)
-struct icaldurationtype icaldurationtype_null_duration()
+struct icaldurationtype icaldurationtype_null_duration(void)
{
@@ -297,2 +287,21 @@ int icaldurationtype_is_null_duration(struct icaldurationtype d)
+/* in icalvalue_new_from_string_with_error, we should not call
+ icaldurationtype_is_null_duration() to see if there is an error
+ condition. Null duration is perfectly valid for an alarm.
+ We cannot depend on the caller to check icalerrno either,
+ following the philosophy of unix errno. we set the is_neg
+ to -1 to indicate that this is a bad duration.
+*/
+struct icaldurationtype icaldurationtype_bad_duration()
+{
+ struct icaldurationtype d;
+ memset(&d,0,sizeof(struct icaldurationtype));
+ d.is_neg = -1;
+ return d;
+}
+
+int icaldurationtype_is_bad_duration(struct icaldurationtype d)
+{
+ return (d.is_neg == -1);
+}
@@ -318,3 +327,3 @@ struct icaldurationtype icaltime_subtract(struct icaltimetype t1,
- return icaldurationtype_from_int(t1t-t2t);
+ return icaldurationtype_from_int((int)(t1t-t2t));