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
@@ -33,55 +33,48 @@
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
-#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"
/* From Seth Alves, <alves@hungry.com> */
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)
{
int i;
int begin_flag = 0;
int time_flag = 0;
@@ -135,13 +128,13 @@ struct icaldurationtype icaldurationtype_from_string(const char* str)
if(digits != -1){
break;
}
if (begin_flag == 0) goto error;
/* 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;
break;
}
case 'H': {
if (time_flag == 0||week_flag == 1||d.hours !=0||digits ==-1)
@@ -184,18 +177,17 @@ struct icaldurationtype icaldurationtype_from_string(const char* str)
return d;
error:
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- memset(&d, 0, sizeof(struct icaldurationtype));
- return d;
-
+ return icaldurationtype_bad_duration();
}
#define TMP_BUF_SIZE 1024
+static
void append_duration_segment(char** buf, char** buf_ptr, size_t* buf_size,
char* sep, unsigned int value) {
char temp[TMP_BUF_SIZE];
sprintf(temp,"%d",value);
@@ -250,37 +242,35 @@ char* icaldurationtype_as_ical_string(struct icaldurationtype d)
append_duration_segment(&buf, &buf_ptr, &buf_size, "S",
d.seconds);
}
}
} else {
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PTS0");
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, "PT0S");
}
output_line = icalmemory_tmp_copy(buf);
icalmemory_free_buffer(buf);
return output_line;
}
-#endif
-
/* From Russel Steinthal */
int icaldurationtype_as_int(struct icaldurationtype dur)
{
return (int)( (dur.seconds +
(60 * dur.minutes) +
(60 * 60 * dur.hours) +
(60 * 60 * 24 * dur.days) +
(60 * 60 * 24 * 7 * dur.weeks))
* (dur.is_neg==1? -1 : 1) ) ;
}
-struct icaldurationtype icaldurationtype_null_duration()
+struct icaldurationtype icaldurationtype_null_duration(void)
{
struct icaldurationtype d;
memset(&d,0,sizeof(struct icaldurationtype));
return d;
@@ -292,12 +282,31 @@ int icaldurationtype_is_null_duration(struct icaldurationtype d)
return 1;
} else {
return 0;
}
}
+/* 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);
+}
struct icaltimetype icaltime_add(struct icaltimetype t,
struct icaldurationtype d)
{
int dt = icaldurationtype_as_int(d);
@@ -313,11 +322,11 @@ struct icaldurationtype icaltime_subtract(struct icaltimetype t1,
struct icaltimetype t2)
{
time_t t1t = icaltime_as_timet(t1);
time_t t2t = icaltime_as_timet(t2);
- return icaldurationtype_from_int(t1t-t2t);
+ return icaldurationtype_from_int((int)(t1t-t2t));
}