22#include "icalvalueimpl.h"
23#include "icalerror_p.h"
33#define TMP_BUF_SIZE 1024
35LIBICAL_ICAL_EXPORT
struct icalvalue_impl *icalvalue_new_impl(icalvalue_kind kind)
37 struct icalvalue_impl *v;
54 memset(&(v->data), 0,
sizeof(v->data));
62 return (icalvalue *)icalvalue_new_impl(kind);
67 struct icalvalue_impl *clone;
69 clone = icalvalue_new_impl(old->kind);
75 memset(clone->id, 0, LIBICAL_ICALVALUE_ID_LENGTH);
76 strncpy(clone->id, old->id, LIBICAL_ICALVALUE_ID_LENGTH);
77 clone->kind = old->kind;
78 clone->size = old->size;
80 switch (clone->kind) {
81 case ICAL_ATTACH_VALUE:
82 case ICAL_BINARY_VALUE: {
87 clone->data.v_attach = old->data.v_attach;
88 if (clone->data.v_attach) {
94 case ICAL_QUERY_VALUE:
95 case ICAL_COLOR_VALUE:
96 case ICAL_STRING_VALUE:
98 case ICAL_CALADDRESS_VALUE:
100 case ICAL_XMLREFERENCE_VALUE:
101 case ICAL_URI_VALUE: {
102 if (old->data.v_string != 0) {
105 if (clone->data.v_string == 0) {
113 case ICAL_ACTION_VALUE: {
114 clone->data = old->data;
116 if (old->data.v_enum == ICAL_ACTION_X) {
118 if (old->x_value != 0) {
121 if (clone->x_value == 0) {
130 case ICAL_RECUR_VALUE: {
131 if (old->data.v_recur != 0) {
133 if (clone->data.v_recur == 0) {
142 if (old->x_value != 0) {
145 if (clone->x_value == 0) {
155 case ICAL_REQUESTSTATUS_VALUE: {
156 clone->data = old->data;
157 if (old->data.v_requeststatus.debug != 0) {
158 clone->data.v_requeststatus.debug =
icalmemory_strdup(old->data.v_requeststatus.debug);
159 if (clone->data.v_requeststatus.debug == 0) {
172 clone->data = old->data;
179static char *icalmemory_strdup_and_dequote(
const char *str)
196 for (p = str; !wroteNull && *p != 0; p++) {
260static char *icalmemory_strdup_and_quote(
const icalvalue *value,
const char *unquoted_str)
268 buf_sz = strlen(unquoted_str) + 1;
277 for (p = unquoted_str; *p != 0 && cnt < max_value_chars; p++, cnt++) {
349static icalvalue *icalvalue_new_enum(icalvalue_kind kind,
int x_type,
const char *str)
352 struct icalvalue_impl *value;
355 value = icalvalue_new_impl(kind);
356 value->data.v_enum = e;
359 value = icalvalue_new_impl(kind);
360 value->data.v_enum = x_type;
361 icalvalue_set_x(value, str);
373static bool simple_str_to_doublestr(
const char *from,
char *result,
int result_len,
char **to)
375 const char *start = NULL;
376 char *end = NULL, *cur = (
char *)from;
378 struct lconv *loc_data = localeconv();
383 if (!from || !result) {
388 while (*cur && isspace((
int)*cur)) {
397 while (*cur && (isdigit((
int)*cur) || *cur ==
'.' || *cur ==
'+' || *cur ==
'-')) {
401 len = (int)(ptrdiff_t)(end - start);
402 if (len + 1 >= result_len) {
404 len = result_len - 1;
411 for (i = 0; i < len; ++i) {
412 if (start[i] ==
'.' &&
413 loc_data && loc_data->decimal_point && loc_data->decimal_point[0] && loc_data->decimal_point[0] !=
'.') {
415 result[i] = loc_data->decimal_point[0];
417 result[i] = start[i];
425 if (sscanf(result,
"%lf", &dtest) != 1) {
431static void free_icalvalue_attach_data(
char *data,
void *user_data)
437static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
438 const char *str, icalproperty **error)
440 char temp[TMP_BUF_SIZE] = {};
441 icalparameter *errParam;
443 struct icalvalue_impl *value = 0;
445 icalerror_check_arg_rz(str != 0,
"str");
452 case ICAL_ATTACH_VALUE: {
460 value = icalvalue_new_attach(attach);
465#if defined(__GNUC__) && !defined(__clang__)
466#pragma GCC diagnostic push
467#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
469 case ICAL_BINARY_VALUE: {
470 char *dupStr = strdup(str);
478 value = icalvalue_new_attach(attach);
483#if defined(__GNUC__) && !defined(__clang__)
484#pragma GCC diagnostic pop
487 case ICAL_BOOLEAN_VALUE: {
488 if (!strcmp(str,
"TRUE")) {
489 value = icalvalue_new_boolean(1);
490 }
else if (!strcmp(str,
"FALSE")) {
491 value = icalvalue_new_boolean(0);
494 snprintf(temp,
sizeof(temp),
495 "Could not parse %s as a %s property",
497 errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
498 *error = icalproperty_vanew_xlicerror(temp, errParam, (
void *)0);
500 snprintf(temp, TMP_BUF_SIZE,
501 "icalvalue_new_from_string cannot parse value string (%s) for \'%s\'",
503 icalerror_warn(temp);
509 case ICAL_TRANSP_VALUE:
510 value = icalvalue_new_enum(kind, (
int)ICAL_TRANSP_X, str);
512 case ICAL_METHOD_VALUE:
513 value = icalvalue_new_enum(kind, (
int)ICAL_METHOD_X, str);
515 case ICAL_STATUS_VALUE:
516 value = icalvalue_new_enum(kind, (
int)ICAL_STATUS_X, str);
518 case ICAL_ACTION_VALUE:
519 value = icalvalue_new_enum(kind, (
int)ICAL_ACTION_X, str);
522 case ICAL_QUERY_VALUE:
523 value = icalvalue_new_query(str);
526 case ICAL_CLASS_VALUE:
527 value = icalvalue_new_enum(kind, (
int)ICAL_CLASS_X, str);
530 value = icalvalue_new_enum(kind, ICAL_CMD_X, str);
532 case ICAL_QUERYLEVEL_VALUE:
533 value = icalvalue_new_enum(kind, ICAL_QUERYLEVEL_X, str);
535 case ICAL_CARLEVEL_VALUE:
536 value = icalvalue_new_enum(kind, ICAL_CARLEVEL_X, str);
538 case ICAL_BUSYTYPE_VALUE:
539 value = icalvalue_new_enum(kind, ICAL_BUSYTYPE_X, str);
541 case ICAL_PROXIMITY_VALUE:
542 value = icalvalue_new_enum(kind, ICAL_PROXIMITY_X, str);
544 case ICAL_POLLMODE_VALUE:
545 value = icalvalue_new_enum(kind, ICAL_POLLMODE_X, str);
547 case ICAL_POLLCOMPLETION_VALUE:
548 value = icalvalue_new_enum(kind, ICAL_POLLCOMPLETION_X, str);
551 case ICAL_PARTICIPANTTYPE_VALUE:
552 value = icalvalue_new_enum(kind, ICAL_PARTICIPANTTYPE_X, str);
555 case ICAL_RESOURCETYPE_VALUE:
556 value = icalvalue_new_enum(kind, ICAL_RESOURCETYPE_X, str);
559 case ICAL_INTEGER_VALUE:
560 value = icalvalue_new_integer(atoi(str));
563 case ICAL_FLOAT_VALUE:
564 value = icalvalue_new_float((
float)atof(str));
567 case ICAL_UTCOFFSET_VALUE: {
568 int t, utcoffset, hours, minutes, seconds;
572 t = strtol(str, 0, 10);
574 if (strlen(str) < 7) {
578 minutes = (t - hours * 10000) / 100;
579 seconds = (t - hours * 10000 - minutes * 100);
580 utcoffset = hours * 3600 + minutes * 60 + seconds;
582 value = icalvalue_new_utcoffset(utcoffset);
587 case ICAL_TEXT_VALUE: {
588 char *dequoted_str = icalmemory_strdup_and_dequote(str);
590 value = icalvalue_new_text(dequoted_str);
595 case ICAL_STRING_VALUE:
596 value = icalvalue_new_string(str);
599 case ICAL_COLOR_VALUE:
600 value = icalvalue_new_color(str);
603 case ICAL_CALADDRESS_VALUE:
604 value = icalvalue_new_caladdress(str);
608 value = icalvalue_new_uri(str);
611 case ICAL_GEO_VALUE: {
618 goto geo_parsing_error;
621 while (cur && isspace((
int)*cur)) {
626 if (!cur || *cur !=
';') {
627 goto geo_parsing_error;
633 while (cur && isspace((
int)*cur)) {
638 goto geo_parsing_error;
640 value = icalvalue_new_geo(geo);
645 snprintf(temp,
sizeof(temp),
646 "Could not parse %s as a %s property",
648 errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
649 *error = icalproperty_vanew_xlicerror(temp, errParam, (
void *)0);
651 snprintf(temp, TMP_BUF_SIZE,
652 "icalvalue_new_from_string cannot parse value string (%s) for \'%s\'",
654 icalerror_warn(temp);
658 case ICAL_RECUR_VALUE: {
663 value = icalvalue_new_recur(rt);
669 case ICAL_DATE_VALUE:
670 case ICAL_DATETIME_VALUE: {
675 value = icalvalue_new_impl(kind);
676 value->data.v_time = tt;
683 case ICAL_DATETIMEPERIOD_VALUE: {
690 value = icalvalue_new_datetime(tt);
696 value = icalvalue_new_period(p);
702 case ICAL_DURATION_VALUE: {
706 value = icalvalue_new_duration(dur);
712 case ICAL_PERIOD_VALUE: {
718 value = icalvalue_new_period(p);
723 case ICAL_TRIGGER_VALUE: {
727 value = icalvalue_new_trigger(tr);
732 case ICAL_REQUESTSTATUS_VALUE: {
736 value = icalvalue_new_requeststatus(rst);
741 case ICAL_UID_VALUE: {
742 char *dequoted_str = icalmemory_strdup_and_dequote(str);
744 value = icalvalue_new_uid(dequoted_str);
749 case ICAL_XMLREFERENCE_VALUE:
750 value = icalvalue_new_xmlreference(str);
754 char *dequoted_str = icalmemory_strdup_and_dequote(str);
756 value = icalvalue_new_x(dequoted_str);
762 snprintf(temp, TMP_BUF_SIZE,
"Unknown type for \'%s\'", str);
764 errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
765 *error = icalproperty_vanew_xlicerror(temp, errParam, (
void *)0);
768 snprintf(temp, TMP_BUF_SIZE,
769 "icalvalue_new_from_string got an unknown value type (%s) for \'%s\'",
771 icalerror_warn(temp);
776#if defined(__GNUC__) && !defined(__clang__)
777#pragma GCC diagnostic push
778#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
780 if (error != 0 && *error == 0 && value == 0) {
781 snprintf(temp, TMP_BUF_SIZE,
"Failed to parse value: \'%s\'", str);
784 errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_VALUEPARSEERROR);
785 *error = icalproperty_vanew_xlicerror(temp, errParam, (
void *)0);
787#if defined(__GNUC__) && !defined(__clang__)
788#pragma GCC diagnostic pop
795 return icalvalue_new_from_string_with_error(kind, str, (icalproperty **)0);
800 icalerror_check_arg_rv((v != 0),
"value");
802 if (v->parent != 0) {
806 if (v->x_value != 0) {
811 case ICAL_BINARY_VALUE:
812 case ICAL_ATTACH_VALUE: {
813 if (v->data.v_attach) {
815 v->data.v_attach = NULL;
820 case ICAL_TEXT_VALUE:
823 case ICAL_CALADDRESS_VALUE:
829 case ICAL_STRING_VALUE:
832 case ICAL_COLOR_VALUE:
835 case ICAL_QUERY_VALUE: {
839 case ICAL_XMLREFERENCE_VALUE:
840 if (v->data.v_string != 0) {
842 v->data.v_string = 0;
846 case ICAL_RECUR_VALUE: {
847 if (v->data.v_recur != 0) {
849 v->data.v_recur = NULL;
854 case ICAL_REQUESTSTATUS_VALUE: {
855 if (v->data.v_requeststatus.debug != 0) {
857 v->data.v_requeststatus.debug = 0;
867 v->kind = ICAL_NO_VALUE;
870 memset(&(v->data), 0,
sizeof(v->data));
884static char *icalvalue_binary_as_ical_string_r(
const icalvalue *value)
888 icalerror_check_arg_rz((value != 0),
"value");
891 snprintf(str, 60,
"icalvalue_binary_as_ical_string is not implemented yet");
896static char *icalvalue_boolean_as_ical_string_r(
const icalvalue *value)
901 icalerror_check_arg_rz((value != 0),
"value");
904 data = icalvalue_get_integer(value);
906 strncpy(str, data ?
"TRUE" :
"FALSE", 6);
912#define MAX_INT_DIGITS 12
915static char *icalvalue_int_as_ical_string_r(
const icalvalue *value)
920 icalerror_check_arg_rz((value != 0),
"value");
923 data = icalvalue_get_integer(value);
925 snprintf(str, MAX_INT_DIGITS,
"%d", data);
930static char *icalvalue_utcoffset_as_ical_string_r(
const icalvalue *value)
936 icalerror_check_arg_rz((value != 0),
"value");
939 data = icalvalue_get_utcoffset(value);
941 if (abs(data) == data) {
948 m = (data - (h * 3600)) / 60;
949 s = (data - (h * 3600) - (m * 60));
955 snprintf(str, 9,
"%c%02d%02d%02d", sign, h, m, s);
957 snprintf(str, 9,
"%c%02d%02d", sign, h, m);
963static char *icalvalue_string_as_ical_string_r(
const icalvalue *value)
968 icalerror_check_arg_rz((value != 0),
"value");
969 data = value->data.v_string;
971 const size_t str_len = strlen(data) + 1;
974 strncpy(str, data, str_len);
975 str[str_len - 1] =
'\0';
980static char *icalvalue_recur_as_ical_string_r(
const icalvalue *value)
987static char *icalvalue_text_as_ical_string_r(
const icalvalue *value)
989 return icalmemory_strdup_and_quote(value, value->data.v_string);
992static char *icalvalue_attach_as_ical_string_r(
const icalvalue *value)
997 icalerror_check_arg_rz((value != 0),
"value");
999 a = icalvalue_get_attach(value);
1005 const size_t len_url = strlen(url) + 1;
1007 strncpy(str, url, len_url);
1008 str[len_url - 1] =
'\0';
1011 const char *data = 0;
1014 const size_t len_data = strlen(data) + 1;
1016 strncpy(str, data, len_data);
1017 str[len_data - 1] =
'\0';
1022static char *icalvalue_duration_as_ical_string_r(
const icalvalue *value)
1026 icalerror_check_arg_rz((value != 0),
"value");
1027 data = icalvalue_get_duration(value);
1032static void print_time_to_string(
char *str,
const struct icaltimetype *data)
1036#if defined(__GNUC__) && !defined(__clang__)
1037#pragma GCC diagnostic push
1038#pragma GCC diagnostic ignored "-Wstringop-truncation"
1045 snprintf(temp,
sizeof(temp),
"%02d%02d%02dZ", data->
hour, data->
minute, data->
second);
1046 strncat(str, temp, 7);
1048 snprintf(temp,
sizeof(temp),
"%02d%02d%02d", data->
hour, data->
minute, data->
second);
1049 strncat(str, temp, 6);
1052#if defined(__GNUC__) && !defined(__clang__)
1053#pragma GCC diagnostic pop
1058void print_date_to_string(
char *str,
const struct icaltimetype *data)
1060#if defined(__GNUC__) && !defined(__clang__)
1061#pragma GCC diagnostic push
1062#pragma GCC diagnostic ignored "-Wstringop-truncation"
1069 snprintf(temp,
sizeof(temp),
"%04d%02d%02d", data->
year, data->
month, data->
day);
1070 strncat(str, temp, 8);
1072#if defined(__GNUC__) && !defined(__clang__)
1073#pragma GCC diagnostic pop
1078static char *icalvalue_date_as_ical_string_r(
const icalvalue *value)
1083 icalerror_check_arg_rz((value != 0),
"value");
1084 data = icalvalue_get_date(value);
1089 print_date_to_string(str, &data);
1095void print_datetime_to_string(
char *str,
const struct icaltimetype *data)
1097#if defined(__GNUC__) && !defined(__clang__)
1098#pragma GCC diagnostic push
1099#pragma GCC diagnostic ignored "-Wstringop-truncation"
1101 char temp[20] = {0};
1105 print_date_to_string(str, data);
1107 strncat(str,
"T", 19);
1109 print_time_to_string(temp, data);
1110 strncat(str, temp, 19);
1113#if defined(__GNUC__) && !defined(__clang__)
1114#pragma GCC diagnostic pop
1119static char *icalvalue_datetime_as_ical_string_r(
const icalvalue *value)
1125 icalerror_check_arg_rz((value != 0),
"value");
1127 if (!(kind == ICAL_DATE_VALUE || kind == ICAL_DATETIME_VALUE)) {
1132 data = icalvalue_get_datetime(value);
1137 print_datetime_to_string(str, &data);
1142static char *icalvalue_float_as_ical_string_r(
const icalvalue *value)
1148 icalerror_check_arg_rz((value != 0),
"value");
1149 data = icalvalue_get_float(value);
1155 (void)setlocale(LC_NUMERIC,
"C");
1159 snprintf(str, 40,
"%f", data);
1162 (void)setlocale(LC_NUMERIC, old_locale);
1168static char *icalvalue_geo_as_ical_string_r(
const icalvalue *value)
1173 icalerror_check_arg_rz((value != 0),
"value");
1175 data = icalvalue_get_geo(value);
1177 snprintf(str, 80,
"%s;%s", data.lat, data.lon);
1182static char *icalvalue_datetimeperiod_as_ical_string_r(
const icalvalue *value)
1186 icalerror_check_arg_rz((value != 0),
"value");
1195static char *icalvalue_period_as_ical_string_r(
const icalvalue *value)
1199 icalerror_check_arg_rz((value != 0),
"value");
1200 data = icalvalue_get_period(value);
1205static char *icalvalue_trigger_as_ical_string_r(
const icalvalue *value)
1209 icalerror_check_arg_rz((value != 0),
"value");
1210 data = icalvalue_get_trigger(value);
1234 switch (value->kind) {
1235 case ICAL_ATTACH_VALUE:
1236 return icalvalue_attach_as_ical_string_r(value);
1238 case ICAL_BINARY_VALUE:
1239 return icalvalue_binary_as_ical_string_r(value);
1241 case ICAL_BOOLEAN_VALUE:
1242 return icalvalue_boolean_as_ical_string_r(value);
1244 case ICAL_INTEGER_VALUE:
1245 return icalvalue_int_as_ical_string_r(value);
1247 case ICAL_UTCOFFSET_VALUE:
1248 return icalvalue_utcoffset_as_ical_string_r(value);
1250 case ICAL_TEXT_VALUE:
1251 case ICAL_UID_VALUE:
1252 return icalvalue_text_as_ical_string_r(value);
1254 case ICAL_QUERY_VALUE:
1255 return icalvalue_string_as_ical_string_r(value);
1257 case ICAL_STRING_VALUE:
1258 case ICAL_COLOR_VALUE:
1259 case ICAL_URI_VALUE:
1260 case ICAL_CALADDRESS_VALUE:
1261 case ICAL_XMLREFERENCE_VALUE:
1262 return icalvalue_string_as_ical_string_r(value);
1264 case ICAL_DATE_VALUE:
1265 return icalvalue_date_as_ical_string_r(value);
1266 case ICAL_DATETIME_VALUE:
1267 return icalvalue_datetime_as_ical_string_r(value);
1268 case ICAL_DURATION_VALUE:
1269 return icalvalue_duration_as_ical_string_r(value);
1271 case ICAL_PERIOD_VALUE:
1272 return icalvalue_period_as_ical_string_r(value);
1273 case ICAL_DATETIMEPERIOD_VALUE:
1274 return icalvalue_datetimeperiod_as_ical_string_r(value);
1276 case ICAL_FLOAT_VALUE:
1277 return icalvalue_float_as_ical_string_r(value);
1279 case ICAL_GEO_VALUE:
1280 return icalvalue_geo_as_ical_string_r(value);
1282 case ICAL_RECUR_VALUE:
1283 return icalvalue_recur_as_ical_string_r(value);
1285 case ICAL_TRIGGER_VALUE:
1286 return icalvalue_trigger_as_ical_string_r(value);
1288 case ICAL_REQUESTSTATUS_VALUE:
1291 case ICAL_ACTION_VALUE:
1292 case ICAL_CMD_VALUE:
1293 case ICAL_QUERYLEVEL_VALUE:
1294 case ICAL_CARLEVEL_VALUE:
1295 case ICAL_METHOD_VALUE:
1296 case ICAL_STATUS_VALUE:
1297 case ICAL_TRANSP_VALUE:
1298 case ICAL_CLASS_VALUE:
1299 case ICAL_BUSYTYPE_VALUE:
1300 case ICAL_PROXIMITY_VALUE:
1301 case ICAL_POLLMODE_VALUE:
1302 case ICAL_POLLCOMPLETION_VALUE:
1303 case ICAL_PARTICIPANTTYPE_VALUE:
1304 case ICAL_RESOURCETYPE_VALUE:
1305 if (value->x_value != 0) {
1312 if (value->x_value != 0) {
1313 return icalmemory_strdup_and_quote(value, value->x_value);
1332 return ICAL_NO_VALUE;
1340 const struct icalvalue_impl *impl = (
struct icalvalue_impl *)value;
1342 icalerror_check_arg_rz((value != 0),
"value");
1344 if (strcmp(impl->id,
"val") == 0) {
1351static bool icalvalue_is_time(
const icalvalue *a)
1355 if (kind == ICAL_DATETIME_VALUE || kind == ICAL_DATE_VALUE) {
1364 icalerror_check_arg_rx((a != 0),
"a", ICAL_XLICCOMPARETYPE_NONE);
1365 icalerror_check_arg_rx((b != 0),
"b", ICAL_XLICCOMPARETYPE_NONE);
1369 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1373 case ICAL_ATTACH_VALUE: {
1378 return ICAL_XLICCOMPARETYPE_EQUAL;
1380 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1383 if (a->data.v_attach == b->data.v_attach) {
1384 return ICAL_XLICCOMPARETYPE_EQUAL;
1386 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1390 case ICAL_BINARY_VALUE: {
1391 if (a->data.v_attach == b->data.v_attach) {
1392 return ICAL_XLICCOMPARETYPE_EQUAL;
1394 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1398 case ICAL_BOOLEAN_VALUE: {
1399 if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)) {
1400 return ICAL_XLICCOMPARETYPE_EQUAL;
1402 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1406 case ICAL_FLOAT_VALUE: {
1407 if (a->data.v_float > b->data.v_float) {
1408 return ICAL_XLICCOMPARETYPE_GREATER;
1409 }
else if (a->data.v_float < b->data.v_float) {
1410 return ICAL_XLICCOMPARETYPE_LESS;
1412 return ICAL_XLICCOMPARETYPE_EQUAL;
1416 case ICAL_INTEGER_VALUE:
1417 case ICAL_UTCOFFSET_VALUE: {
1418 if (a->data.v_int > b->data.v_int) {
1419 return ICAL_XLICCOMPARETYPE_GREATER;
1420 }
else if (a->data.v_int < b->data.v_int) {
1421 return ICAL_XLICCOMPARETYPE_LESS;
1423 return ICAL_XLICCOMPARETYPE_EQUAL;
1427 case ICAL_DURATION_VALUE: {
1429 dur_b = b->data.v_duration;
1430 int a_days = (int)(7 * dur_a.
weeks + dur_a.
days) * (dur_a.
is_neg == 1 ? -1 : 1),
1431 b_days = (
int)(7 * dur_b.weeks + dur_b.days) * (dur_a.
is_neg == 1 ? -1 : 1);
1433 (dur_a.
is_neg == 1 ? -1 : 1),
1434 b_secs = (
int)(dur_b.seconds + 60 * (dur_b.minutes + 60 * dur_b.hours)) *
1435 (dur_b.is_neg == 1 ? -1 : 1);
1437 if (a_secs == b_secs) {
1438 if (a_days > b_days) {
1439 return ICAL_XLICCOMPARETYPE_GREATER;
1440 }
else if (a_days < b_days) {
1441 return ICAL_XLICCOMPARETYPE_LESS;
1443 return ICAL_XLICCOMPARETYPE_EQUAL;
1445 }
else if (a_days == b_days) {
1446 if (a_secs > b_secs) {
1447 return ICAL_XLICCOMPARETYPE_GREATER;
1449 return ICAL_XLICCOMPARETYPE_LESS;
1453 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1457 case ICAL_TEXT_VALUE:
1458 case ICAL_URI_VALUE:
1459 case ICAL_CALADDRESS_VALUE:
1460 case ICAL_TRIGGER_VALUE:
1461 case ICAL_DATE_VALUE:
1462 case ICAL_DATETIME_VALUE:
1463 case ICAL_DATETIMEPERIOD_VALUE:
1464 case ICAL_QUERY_VALUE:
1465 case ICAL_UID_VALUE:
1466 case ICAL_XMLREFERENCE_VALUE:
1467 case ICAL_RECUR_VALUE: {
1469 char *temp1, *temp2;
1475 r = strcmp(temp1, temp2);
1478 return ICAL_XLICCOMPARETYPE_GREATER;
1481 return ICAL_XLICCOMPARETYPE_LESS;
1487 return ICAL_XLICCOMPARETYPE_GREATER;
1489 return ICAL_XLICCOMPARETYPE_LESS;
1491 return ICAL_XLICCOMPARETYPE_EQUAL;
1495 case ICAL_METHOD_VALUE: {
1496 if (icalvalue_get_method(a) == icalvalue_get_method(b)) {
1497 return ICAL_XLICCOMPARETYPE_EQUAL;
1499 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1503 case ICAL_STATUS_VALUE: {
1504 if (icalvalue_get_status(a) == icalvalue_get_status(b)) {
1505 return ICAL_XLICCOMPARETYPE_EQUAL;
1507 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1511 case ICAL_TRANSP_VALUE: {
1512 if (icalvalue_get_transp(a) == icalvalue_get_transp(b)) {
1513 return ICAL_XLICCOMPARETYPE_EQUAL;
1515 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1519 case ICAL_ACTION_VALUE: {
1520 if (icalvalue_get_action(a) == icalvalue_get_action(b)) {
1521 return ICAL_XLICCOMPARETYPE_EQUAL;
1523 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1527 case ICAL_PERIOD_VALUE:
1528 case ICAL_GEO_VALUE:
1531 icalerror_warn(
"Comparison not implemented for value type");
1532 return ICAL_XLICCOMPARETYPE_NONE;
1540 (value->kind == ICAL_DATETIME_VALUE || value->kind == ICAL_DATE_VALUE) &&
1543 value->kind = ICAL_DATE_VALUE;
1545 value->kind = ICAL_DATETIME_VALUE;
1552 icalerror_check_arg_rv((value != 0),
"value");
1554 value->parent = property;
1559 return value->parent;
1565 icalvalue *value = 0;
1567 if ((szText == 0) || (szEncText == 0)) {
1577 ptr = icalvalue_text_as_ical_string_r(value);
1582 if ((
int)strlen(ptr) >= maxBufferLen) {
1588 strcpy(szEncText, ptr);
1602 if ((szText == 0) || (szDecText == 0) || (maxBufferLen <= 0)) {
1606 buf_sz = strlen(szText) + 1;
1613 for (p = szText; *p != 0; p++) {
1621 if (str_p - str > maxBufferLen) {
1628 if ((
int)strlen(str) >= maxBufferLen) {
1633 strcpy(szDecText, str);
icalattach * icalattach_new_from_data(const char *data, icalattach_free_fn_t free_fn, void *free_fn_data)
Creates new icalattach object from data.
void icalattach_unref(icalattach *attach)
Decrements reference count of the icalattach.
void icalattach_ref(icalattach *attach)
Increments reference count of the icalattach.
unsigned char * icalattach_get_data(icalattach *attach)
Returns the data of the icalattach object.
const char * icalattach_get_url(icalattach *attach)
Returns the URL of the icalattach object.
icalattach * icalattach_new_from_url(const char *url)
Creates new icalattach object from a URL.
bool icalattach_get_is_url(const icalattach *attach)
Determines if attach is an URL.
struct icalattach_impl icalattach
An iCal attach object representing a link to a document object.
bool icaldurationtype_is_bad_duration(struct icaldurationtype d)
Checks if a duration is a bad duration.
char * icaldurationtype_as_ical_string_r(struct icaldurationtype d)
struct icaldurationtype icaldurationtype_from_string(const char *str)
Creates a new icaldurationtype from a duration given as a string.
void icalerror_set_errno(icalerrorenum x)
Sets the icalerrno to a given error.
size_t icallimit_get(icallimits_kind kind)
Defines the interface for getting/setting internal library limits.
void icalmemory_free_buffer(void *buf)
Releases a buffer.
char * icalmemory_strdup(const char *s)
Creates a duplicate of a string.
void icalmemory_append_string(char **buf, char **pos, size_t *buf_size, const char *string)
Appends a string to a buffer.
void * icalmemory_new_buffer(size_t size)
Creates new buffer with the specified size.
void icalmemory_append_char(char **buf, char **pos, size_t *buf_size, char ch)
Appends a character to a buffer.
void icalmemory_add_tmp_buffer(void *buf)
Adds an externally allocated buffer to the ring.
Common memory management routines.
char * icalperiodtype_as_ical_string_r(struct icalperiodtype p)
Converts an icalperiodtype into an iCal-formatted string.
bool icalperiodtype_is_null_period(struct icalperiodtype p)
struct icalperiodtype icalperiodtype_from_string(const char *str)
Constructs a new icalperiodtype from str.
icalproperty_kind icalproperty_isa(const icalproperty *p)
bool icalproperty_get_allow_empty_properties(void)
char * icalproperty_enum_to_string_r(int e)
bool icalproperty_enum_belongs_to_property(icalproperty_kind kind, int e)
icalproperty_kind icalproperty_value_kind_to_kind(icalvalue_kind kind)
int icalproperty_kind_and_string_to_enum(const int kind, const char *str)
struct icalrecurrencetype * icalrecurrencetype_new_from_string(const char *str)
struct icalrecurrencetype * icalrecurrencetype_clone(struct icalrecurrencetype *recur)
void icalrecurrencetype_unref(struct icalrecurrencetype *recur)
char * icalrecurrencetype_as_string_r(struct icalrecurrencetype *recur)
bool icaltime_is_date(const struct icaltimetype t)
struct icaltimetype icaltime_from_string(const char *str)
bool icaltime_is_utc(const struct icaltimetype t)
bool icaltime_is_null_time(const struct icaltimetype t)
char * icaltime_as_ical_string_r(const struct icaltimetype tt)
Defines the data structure for representing date-times.
struct icaltriggertype icaltriggertype_from_string(const char *str)
bool icaltriggertype_is_bad_trigger(struct icaltriggertype tr)
struct icalreqstattype icalreqstattype_from_string(const char *str)
char * icalreqstattype_as_string_r(struct icalreqstattype stat)
icalproperty * icalvalue_get_parent(const icalvalue *value)
icalvalue_kind icalvalue_isa(const icalvalue *value)
bool icalvalue_is_valid(const icalvalue *value)
bool icalvalue_isa_value(void *value)
icalvalue * icalvalue_clone(const icalvalue *old)
icalvalue * icalvalue_new_from_string(icalvalue_kind kind, const char *str)
void icalvalue_set_parent(icalvalue *value, icalproperty *property)
icalparameter_xliccomparetype icalvalue_compare(const icalvalue *a, const icalvalue *b)
icalvalue * icalvalue_new(icalvalue_kind kind)
bool icalvalue_decode_ical_string(const char *szText, char *szDecText, int maxBufferLen)
void icalvalue_reset_kind(icalvalue *value)
void icalvalue_free(icalvalue *v)
char * icalvalue_as_ical_string_r(const icalvalue *value)
bool icalvalue_encode_ical_string(const char *szText, char *szEncText, int maxBufferLen)
const char * icalvalue_as_ical_string(const icalvalue *value)
Defines the data structure representing iCalendar parameter values.
bool icalvalue_kind_is_valid(const icalvalue_kind kind)
const char * icalvalue_kind_to_string(const icalvalue_kind kind)
struct icalperiodtype period