Diffstat (limited to 'libical/src/libical/icalduration.c') (more/less context) (show whitespace changes)
-rw-r--r-- | libical/src/libical/icalduration.c | 43 |
1 files changed, 26 insertions, 17 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 @@ -35,16 +35,11 @@ #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" @@ -76,10 +71,8 @@ struct icaldurationtype icaldurationtype_from_int(int t) return dur; } -#ifndef ICAL_NO_LIBICAL -#include "icalvalue.h" struct icaldurationtype icaldurationtype_from_string(const char* str) { int i; @@ -137,9 +130,9 @@ struct icaldurationtype icaldurationtype_from_string(const char* str) } 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; } @@ -186,14 +179,13 @@ struct icaldurationtype icaldurationtype_from_string(const char* str) 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]; @@ -252,9 +244,9 @@ 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"); } output_line = icalmemory_tmp_copy(buf); icalmemory_free_buffer(buf); @@ -262,10 +254,8 @@ char* icaldurationtype_as_ical_string(struct icaldurationtype d) return output_line; } -#endif - /* From Russel Steinthal */ int icaldurationtype_as_int(struct icaldurationtype dur) { @@ -276,9 +266,9 @@ int icaldurationtype_as_int(struct icaldurationtype dur) (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)); @@ -294,8 +284,27 @@ int icaldurationtype_is_null_duration(struct icaldurationtype d) 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) @@ -315,9 +324,9 @@ struct icaldurationtype icaltime_subtract(struct icaltimetype t1, 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)); } |