diff options
Diffstat (limited to 'src/libical/icaltypes.c')
-rw-r--r-- | src/libical/icaltypes.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/libical/icaltypes.c b/src/libical/icaltypes.c new file mode 100644 index 00000000..957d1c1d --- /dev/null +++ b/src/libical/icaltypes.c @@ -0,0 +1,239 @@ +/* -*- Mode: C -*- + ====================================================================== + FILE: icaltypes.c + CREATOR: eric 16 May 1999 + + $Id: icaltypes.c,v 1.18 2008-01-15 23:17:42 dothebart Exp $ + $Locker: $ + + + (C) COPYRIGHT 2000, Eric Busboom <eric@softwarestudio.org> + http://www.softwarestudio.org + + This program is free software; you can redistribute it and/or modify + it under the terms of either: + + The LGPL as published by the Free Software Foundation, version + 2.1, available at: http://www.fsf.org/copyleft/lesser.html + + Or: + + The Mozilla Public License Version 1.0. You may obtain a copy of + the License at http://www.mozilla.org/MPL/ + + The original code is icaltypes.c + + ======================================================================*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "icaltypes.h" +#include "icalerror.h" +#include "icalmemory.h" +#include <stdlib.h> /* for malloc and abs() */ +#include <errno.h> /* for errno */ +#include <string.h> /* for icalmemory_strdup */ +#include <assert.h> + +#if defined(_MSC_VER) +#define snprintf _snprintf +#define strcasecmp stricmp +#endif + +#define TEMP_MAX 1024 + +#ifdef HAVE_PTHREAD + #include <pthread.h> + static pthread_mutex_t unk_token_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif + +static ical_unknown_token_handling unknownTokenHandling = ICAL_TREAT_AS_ERROR; + +int icaltriggertype_is_null_trigger(struct icaltriggertype tr) +{ + if(icaltime_is_null_time(tr.time) && + icaldurationtype_is_null_duration(tr.duration)){ + return 1; + } + + return 0; +} + +int icaltriggertype_is_bad_trigger(struct icaltriggertype tr) +{ + if(icaldurationtype_is_bad_duration(tr.duration)){ + return 1; + } + + return 0; +} + +struct icaltriggertype icaltriggertype_from_int(const int reltime) +{ + struct icaltriggertype tr; + + tr.time = icaltime_null_time(); + tr.duration = icaldurationtype_from_int(reltime); + + return tr; +} + +struct icaltriggertype icaltriggertype_from_string(const char* str) +{ + + + struct icaltriggertype tr, null_tr; + icalerrorstate es = ICAL_ERROR_DEFAULT; + icalerrorenum e; + + tr.time= icaltime_null_time(); + tr.duration = icaldurationtype_from_int(0); + + null_tr = tr; + + + /* Suppress errors so a failure in icaltime_from_string() does not cause an abort */ + es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR); + if(str == 0) goto error; + icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL); + e = icalerrno; + icalerror_set_errno(ICAL_NO_ERROR); + + tr.time = icaltime_from_string(str); + + if (icaltime_is_null_time(tr.time)){ + + tr.duration = icaldurationtype_from_string(str); + + if (icaldurationtype_is_bad_duration(tr.duration)) goto error; + } + + icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es); + icalerror_set_errno(e); + return tr; + + error: + icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es); + icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + return tr; + +} + + +struct icalreqstattype icalreqstattype_from_string(const char* str) +{ + const char *p1,*p2; + struct icalreqstattype stat; + short major=0, minor=0; + + icalerror_check_arg((str != 0),"str"); + + stat.code = ICAL_UNKNOWN_STATUS; + stat.debug = 0; + stat.desc = 0; + + /* Get the status numbers */ + + sscanf(str, "%hd.%hd",&major, &minor); + + if (major <= 0 || minor < 0){ + icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + return stat; + } + + stat.code = icalenum_num_to_reqstat(major, minor); + + if (stat.code == ICAL_UNKNOWN_STATUS){ + icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR); + return stat; + } + + + p1 = strchr(str,';'); + + if (p1 == 0){ +/* icalerror_set_errno(ICAL_BADARG_ERROR);*/ + return stat; + } + + /* Just ignore the second clause; it will be taken from inside the library + */ + + + + p2 = strchr(p1+1,';'); + if (p2 != 0 && *p2 != 0){ + stat.debug = p2+1; + } + + return stat; + +} + +const char* icalreqstattype_as_string(struct icalreqstattype stat) +{ + char *buf; + buf = icalreqstattype_as_string_r(stat); + icalmemory_add_tmp_buffer(buf); + return buf; +} + + +char* icalreqstattype_as_string_r(struct icalreqstattype stat) +{ + char *temp; + + icalerror_check_arg_rz((stat.code != ICAL_UNKNOWN_STATUS),"Status"); + + temp = (char*)icalmemory_new_buffer(TEMP_MAX); + + if (stat.desc == 0){ + stat.desc = icalenum_reqstat_desc(stat.code); + } + + if(stat.debug != 0){ + snprintf(temp,TEMP_MAX,"%d.%d;%s;%s", icalenum_reqstat_major(stat.code), + icalenum_reqstat_minor(stat.code), + stat.desc, stat.debug); + + } else { + snprintf(temp,TEMP_MAX,"%d.%d;%s", icalenum_reqstat_major(stat.code), + icalenum_reqstat_minor(stat.code), + stat.desc); + } + + return temp; +} + +ical_unknown_token_handling ical_get_unknown_token_handling_setting(void) +{ + ical_unknown_token_handling myHandling; + +#ifdef HAVE_PTHREAD + pthread_mutex_lock (&unk_token_mutex); +#endif + + myHandling = unknownTokenHandling; + +#ifdef HAVE_PTHREAD + pthread_mutex_unlock (&unk_token_mutex); +#endif + + return myHandling; +} + +void ical_set_unknown_token_handling_setting(ical_unknown_token_handling newSetting) +{ + +#ifdef HAVE_PTHREAD + pthread_mutex_lock (&unk_token_mutex); +#endif + + unknownTokenHandling = newSetting; + +#ifdef HAVE_PTHREAD + pthread_mutex_unlock (&unk_token_mutex); +#endif + +} |