2 /*======================================================================
4 CREATOR: eric 02 May 1999
9 (C) COPYRIGHT 2000, Eric Busboom, http://www.softwarestudio.org
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of either:
14 The LGPL as published by the Free Software Foundation, version
15 2.1, available at: http://www.fsf.org/copyleft/lesser.html
19 The Mozilla Public License Version 1.0. You may obtain a copy of
20 the License at http://www.mozilla.org/MPL/
22 The original code is icalvalue.c
25 Graham Davison (g.m.davison@computer.org)
28 ======================================================================*/
34 #include "icalerror.h"
35 #include "icalmemory.h"
36 #include "icalparser.h"
37 #include "icalenums.h"
38 #include "icalvalueimpl.h"
40 #include <stdlib.h> /* for malloc */
41 #include <stdio.h> /* for sprintf */
42 #include <string.h> /* For memset, others */
43 #include <stddef.h> /* For offsetof() macro */
45 #include <time.h> /* for mktime */
46 #include <stdlib.h> /* for atoi and atof */
47 #include <limits.h> /* for SHRT_MAX */
50 #include "icalmemory_strdup.h"
53 #define TMP_BUF_SIZE 1024
55 void print_datetime_to_string(char* str, struct icaltimetype *data);
56 void print_date_to_string(char* str, struct icaltimetype *data);
57 void print_time_to_string(char* str, struct icaltimetype *data);
58 void print_recur_to_string(char* str, struct icaltimetype *data);
61 struct icalvalue_impl* icalvalue_new_impl(icalvalue_kind kind){
63 struct icalvalue_impl* v;
65 if ( ( v = (struct icalvalue_impl*)
66 malloc(sizeof(struct icalvalue_impl))) == 0) {
67 icalerror_set_errno(ICAL_NEWFAILED_ERROR);
77 memset(&(v->data),0,sizeof(v->data));
86 icalvalue_new (icalvalue_kind kind)
88 return (icalvalue*)icalvalue_new_impl(kind);
91 icalvalue* icalvalue_new_clone(icalvalue* value){
93 struct icalvalue_impl* new;
94 struct icalvalue_impl* old = (struct icalvalue_impl*)value;
96 new = icalvalue_new_impl(old->kind);
103 strcpy(new->id, old->id);
104 new->kind = old->kind;
105 new->size = old->size;
109 /* The contents of the attach value may or may not be owned by the
111 case ICAL_ATTACH_VALUE:
112 case ICAL_BINARY_VALUE:
114 /* HACK ugh. I don't feel like impleenting this */
117 case ICAL_STRING_VALUE:
118 case ICAL_TEXT_VALUE:
119 case ICAL_CALADDRESS_VALUE:
122 if (old->data.v_string != 0) {
123 new->data.v_string=icalmemory_strdup(old->data.v_string);
125 if ( new->data.v_string == 0 ) {
133 case ICAL_RECUR_VALUE:
135 if(old->data.v_recur != 0){
136 new->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
138 if(new->data.v_recur == 0){
143 memcpy( new->data.v_recur, old->data.v_recur,
144 sizeof(struct icalrecurrencetype));
151 /* all of the other types are stored as values, not
152 pointers, so we can just copy the whole structure. */
154 new->data = old->data;
161 char* icalmemory_strdup_and_dequote(const char* str)
164 char* out = (char*)malloc(sizeof(char) * strlen(str) +1);
173 for (p = str; *p!=0; p++){
220 icalvalue* icalvalue_new_enum(icalvalue_kind kind, int x_type, const char* str)
222 int e = icalproperty_string_to_enum(str);
223 struct icalvalue_impl *value;
225 if(e != 0 && icalproperty_enum_belongs_to_property(
226 icalproperty_value_kind_to_kind(kind),e)) {
228 value = icalvalue_new_impl(kind);
229 value->data.v_enum = e;
231 /* Make it an X value */
232 value = icalvalue_new_impl(kind);
233 value->data.v_enum = x_type;
234 icalvalue_set_x(value,str);
241 icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,const char* str,icalproperty** error)
244 struct icalvalue_impl *value = 0;
246 icalerror_check_arg_rz(str!=0,"str");
254 case ICAL_ATTACH_VALUE:
255 case ICAL_BINARY_VALUE:
256 case ICAL_BOOLEAN_VALUE:
262 char temp[TMP_BUF_SIZE];
263 sprintf(temp,"%s Values are not implemented",
264 icalparameter_kind_to_string(kind));
265 *error = icalproperty_vanew_xlicerror(
267 icalparameter_new_xlicerrortype(
268 ICAL_XLICERRORTYPE_VALUEPARSEERROR),
275 case ICAL_TRANSP_VALUE:
276 value = icalvalue_new_enum(kind, ICAL_TRANSP_X,str);
278 case ICAL_METHOD_VALUE:
279 value = icalvalue_new_enum(kind, ICAL_METHOD_X,str);
281 case ICAL_STATUS_VALUE:
282 value = icalvalue_new_enum(kind, ICAL_STATUS_X,str);
284 case ICAL_ACTION_VALUE:
285 value = icalvalue_new_enum(kind, ICAL_ACTION_X,str);
287 case ICAL_CLASS_VALUE:
288 value = icalvalue_new_enum(kind, ICAL_CLASS_X,str);
292 case ICAL_INTEGER_VALUE:
294 value = icalvalue_new_integer(atoi(str));
298 case ICAL_FLOAT_VALUE:
300 value = icalvalue_new_float(atof(str));
304 case ICAL_UTCOFFSET_VALUE:
306 value = icalparser_parse_value(kind,str,(icalcomponent*)0);
310 case ICAL_TEXT_VALUE:
312 char* dequoted_str = icalmemory_strdup_and_dequote(str);
313 value = icalvalue_new_text(dequoted_str);
319 case ICAL_STRING_VALUE:
321 value = icalvalue_new_string(str);
325 case ICAL_CALADDRESS_VALUE:
327 value = icalvalue_new_caladdress(str);
333 value = icalvalue_new_uri(str);
344 char temp[TMP_BUF_SIZE];
345 sprintf(temp,"GEO Values are not implemented");
346 *error = icalproperty_vanew_xlicerror(
348 icalparameter_new_xlicerrortype(
349 ICAL_XLICERRORTYPE_VALUEPARSEERROR),
353 /*icalerror_warn("Parsing GEO properties is unimplmeneted");*/
358 case ICAL_RECUR_VALUE:
360 struct icalrecurrencetype rt;
361 rt = icalrecurrencetype_from_string(str);
362 value = icalvalue_new_recur(rt);
366 case ICAL_TIME_VALUE:
367 case ICAL_DATE_VALUE:
368 case ICAL_DATETIME_VALUE:
369 case ICAL_DATETIMEDATE_VALUE:
371 struct icaltimetype tt;
372 tt = icaltime_from_string(str);
373 if(!icaltime_is_null_time(tt)){
374 value = icalvalue_new_impl(kind);
375 value->data.v_time = tt;
380 case ICAL_DATETIMEPERIOD_VALUE:
382 struct icaltimetype tt;
383 struct icalperiodtype p;
384 tt = icaltime_from_string(str);
385 p = icalperiodtype_from_string(str);
387 if(!icaltime_is_null_time(tt)){
388 value = icalvalue_new_datetime(tt);
389 } else if (!icalperiodtype_is_null_period(p)){
390 value = icalvalue_new_period(p);
396 case ICAL_DURATION_VALUE:
398 struct icaldurationtype dur = icaldurationtype_from_string(str);
400 if(icaldurationtype_is_null_duration(dur)){
403 value = icalvalue_new_duration(dur);
409 case ICAL_PERIOD_VALUE:
411 struct icalperiodtype p;
412 p = icalperiodtype_from_string(str);
414 if(!icalperiodtype_is_null_period(p)){
415 value = icalvalue_new_period(p);
420 case ICAL_TRIGGER_VALUE:
422 struct icaltriggertype tr = icaltriggertype_from_string(str);
423 value = icalvalue_new_trigger(tr);
431 char temp[TMP_BUF_SIZE];
433 snprintf(temp,TMP_BUF_SIZE,"Unknown type for \'%s\'",str);
435 *error = icalproperty_vanew_xlicerror(
437 icalparameter_new_xlicerrortype(
438 ICAL_XLICERRORTYPE_VALUEPARSEERROR),
442 icalerror_warn("icalvalue_new_from_string got an unknown value type");
448 if (error != 0 && *error == 0 && value == 0){
449 char temp[TMP_BUF_SIZE];
451 snprintf(temp,TMP_BUF_SIZE,"Failed to parse value: \'%s\'",str);
453 *error = icalproperty_vanew_xlicerror(
455 icalparameter_new_xlicerrortype(
456 ICAL_XLICERRORTYPE_VALUEPARSEERROR),
465 icalvalue* icalvalue_new_from_string(icalvalue_kind kind,const char* str)
467 return icalvalue_new_from_string_with_error(kind,str,(icalproperty*)0);
473 icalvalue_free (icalvalue* value)
475 struct icalvalue_impl* v = (struct icalvalue_impl*)value;
477 icalerror_check_arg_rv((value != 0),"value");
479 #ifdef ICAL_FREE_ON_LIST_IS_ERROR
480 icalerror_assert( (v->parent ==0),"This value is still attached to a property");
489 free((char *)v->x_value);
493 case ICAL_BINARY_VALUE:
494 case ICAL_ATTACH_VALUE: {
495 /* HACK ugh. This will be tough to implement */
497 case ICAL_TEXT_VALUE:
498 case ICAL_CALADDRESS_VALUE:
501 if (v->data.v_string != 0) {
502 free((void*)v->data.v_string);
503 v->data.v_string = 0;
507 case ICAL_RECUR_VALUE:
509 if(v->data.v_recur != 0){
510 free((void*)v->data.v_recur);
522 v->kind = ICAL_NO_VALUE;
525 memset(&(v->data),0,sizeof(v->data));
531 icalvalue_is_valid (icalvalue* value)
533 /*struct icalvalue_impl* v = (struct icalvalue_impl*)value;*/
542 char* icalvalue_binary_as_ical_string(icalvalue* value) {
545 icalerror_check_arg_rz( (value!=0),"value");
547 str = (char*)icalmemory_tmp_buffer(60);
548 sprintf(str,"icalvalue_binary_as_ical_string is not implemented yet");
554 #define MAX_INT_DIGITS 12 /* Enough for 2^32 + sign*/
555 char* icalvalue_int_as_ical_string(icalvalue* value) {
558 char* str = (char*)icalmemory_tmp_buffer(MAX_INT_DIGITS);
560 icalerror_check_arg_rz( (value!=0),"value");
562 data = icalvalue_get_integer(value);
564 snprintf(str,MAX_INT_DIGITS,"%d",data);
569 char* icalvalue_utcoffset_as_ical_string(icalvalue* value)
573 char* str = (char*)icalmemory_tmp_buffer(9);
575 icalerror_check_arg_rz( (value!=0),"value");
577 data = icalvalue_get_utcoffset(value);
579 if (abs(data) == data){
586 m = (data - (h*3600))/ 60;
587 s = (data - (h*3600) - (m*60));
589 sprintf(str,"%c%02d%02d%02d",sign,abs(h),abs(m),abs(s));
594 char* icalvalue_string_as_ical_string(icalvalue* value) {
598 icalerror_check_arg_rz( (value!=0),"value");
599 data = ((struct icalvalue_impl*)value)->data.v_string;
601 str = (char*)icalmemory_tmp_buffer(strlen(data)+1);
609 char* icalvalue_recur_as_ical_string(icalvalue* value)
611 struct icalvalue_impl *impl = (struct icalvalue_impl*)value;
612 struct icalrecurrencetype *recur = impl->data.v_recur;
614 return icalrecurrencetype_as_string(recur);
617 char* icalvalue_text_as_ical_string(icalvalue* value) {
628 buf_sz = strlen(((struct icalvalue_impl*)value)->data.v_string)+1;
630 str_p = str = (char*)icalmemory_new_buffer(buf_sz);
636 for(p=((struct icalvalue_impl*)value)->data.v_string; *p!=0; p++){
640 icalmemory_append_string(&str,&str_p,&buf_sz,"\\n");
646 icalmemory_append_string(&str,&str_p,&buf_sz,"\\t");
651 icalmemory_append_string(&str,&str_p,&buf_sz,"\\r");
656 icalmemory_append_string(&str,&str_p,&buf_sz,"\\b");
661 icalmemory_append_string(&str,&str_p,&buf_sz,"\\f");
668 icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
669 icalmemory_append_char(&str,&str_p,&buf_sz,*p);
675 icalmemory_append_char(&str,&str_p,&buf_sz,'\\');
676 icalmemory_append_char(&str,&str_p,&buf_sz,*p);
682 icalmemory_append_char(&str,&str_p,&buf_sz,*p);
687 if (line_length > 65 && *p == ' '){
688 icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
693 if (line_length > 75){
694 icalmemory_append_string(&str,&str_p,&buf_sz,"\n ");
700 /* Assume the last character is not a '\0' and add one. We could
701 check *str_p != 0, but that would be an uninitialized memory
705 icalmemory_append_char(&str,&str_p,&buf_sz,'\0');
707 rtrn = icalmemory_tmp_copy(str);
709 icalmemory_free_buffer(str);
715 char* icalvalue_attach_as_ical_string(icalvalue* value) {
717 struct icalattachtype a;
720 icalerror_check_arg_rz( (value!=0),"value");
722 a = icalvalue_get_attach(value);
725 return icalvalue_binary_as_ical_string(value);
726 } else if (a.base64 != 0) {
727 str = (char*)icalmemory_tmp_buffer(strlen(a.base64)+1);
728 strcpy(str,a.base64);
730 } else if (a.url != 0){
731 return icalvalue_string_as_ical_string(value);
733 icalerrno = ICAL_MALFORMEDDATA_ERROR;
739 char* icalvalue_duration_as_ical_string(icalvalue* value) {
741 struct icaldurationtype data;
743 icalerror_check_arg_rz( (value!=0),"value");
744 data = icalvalue_get_duration(value);
746 return icaldurationtype_as_ical_string(data);
749 void print_time_to_string(char* str, struct icaltimetype *data)
753 if (data->is_utc == 1){
754 sprintf(temp,"%02d%02d%02dZ",data->hour,data->minute,data->second);
756 sprintf(temp,"%02d%02d%02d",data->hour,data->minute,data->second);
763 char* icalvalue_time_as_ical_string(icalvalue* value) {
765 struct icaltimetype data;
767 icalerror_check_arg_rz( (value!=0),"value");
768 data = icalvalue_get_time(value);
770 str = (char*)icalmemory_tmp_buffer(8);
773 print_time_to_string(str,&data);
778 void print_date_to_string(char* str, struct icaltimetype *data)
782 sprintf(temp,"%04d%02d%02d",data->year,data->month,data->day);
787 char* icalvalue_date_as_ical_string(icalvalue* value) {
789 struct icaltimetype data;
791 icalerror_check_arg_rz( (value!=0),"value");
792 data = icalvalue_get_date(value);
794 str = (char*)icalmemory_tmp_buffer(9);
797 print_date_to_string(str,&data);
802 void print_datetime_to_string(char* str, struct icaltimetype *data)
804 print_date_to_string(str,data);
806 print_time_to_string(str,data);
810 const char* icalvalue_datetime_as_ical_string(icalvalue* value) {
812 struct icaltimetype data;
814 icalvalue_kind kind = icalvalue_isa(value);
816 icalerror_check_arg_rz( (value!=0),"value");
819 if( !(kind == ICAL_DATETIMEDATE_VALUE ||
820 kind == ICAL_DATE_VALUE ||
821 kind == ICAL_DATETIME_VALUE ||
822 kind == ICAL_TIME_VALUE))
824 icalerror_set_errno(ICAL_BADARG_ERROR);
828 data = icalvalue_get_datetime(value);
830 str = (char*)icalmemory_tmp_buffer(20);
834 print_datetime_to_string(str,&data);
841 const char* icalvalue_datetimedate_as_ical_string(icalvalue* value) {
843 struct icaltimetype data;
844 icalerror_check_arg_rz( (value!=0),"value");
845 data = icalvalue_get_datetime(value);
847 if (data.is_date == 1){
848 return icalvalue_date_as_ical_string(value);
850 return icalvalue_datetime_as_ical_string(value);
855 char* icalvalue_float_as_ical_string(icalvalue* value) {
859 icalerror_check_arg_rz( (value!=0),"value");
860 data = icalvalue_get_float(value);
862 str = (char*)icalmemory_tmp_buffer(15);
864 sprintf(str,"%f",data);
869 char* icalvalue_geo_as_ical_string(icalvalue* value) {
871 struct icalgeotype data;
873 icalerror_check_arg_rz( (value!=0),"value");
875 data = icalvalue_get_geo(value);
877 str = (char*)icalmemory_tmp_buffer(25);
879 sprintf(str,"%f;%f",data.lat,data.lon);
884 const char* icalvalue_datetimeperiod_as_ical_string(icalvalue* value) {
885 struct icaldatetimeperiodtype dtp = icalvalue_get_datetimeperiod(value);
887 icalerror_check_arg_rz( (value!=0),"value");
889 if(!icaltime_is_null_time(dtp.time)){
890 return icaltime_as_ical_string(dtp.time);
892 return icalperiodtype_as_ical_string(dtp.period);
896 const char* icalvalue_period_as_ical_string(icalvalue* value) {
897 struct icalperiodtype data;
898 icalerror_check_arg_rz( (value!=0),"value");
899 data = icalvalue_get_period(value);
901 return icalperiodtype_as_ical_string(data);
905 char* icalvalue_trigger_as_ical_string(icalvalue* value) {
907 struct icaltriggertype data;
909 icalerror_check_arg_rz( (value!=0),"value");
910 data = icalvalue_get_trigger(value);
912 if(!icaltime_is_null_time(data.time)){
913 return icaltime_as_ical_string(data.time);
915 return icaldurationtype_as_ical_string(data.duration);
921 icalvalue_as_ical_string (icalvalue* value)
923 struct icalvalue_impl* v = (struct icalvalue_impl*)value;
933 case ICAL_ATTACH_VALUE:
934 return icalvalue_attach_as_ical_string(value);
936 case ICAL_BINARY_VALUE:
937 return icalvalue_binary_as_ical_string(value);
939 case ICAL_BOOLEAN_VALUE:
940 case ICAL_INTEGER_VALUE:
941 return icalvalue_int_as_ical_string(value);
943 case ICAL_UTCOFFSET_VALUE:
944 return icalvalue_utcoffset_as_ical_string(value);
946 case ICAL_TEXT_VALUE:
947 return icalvalue_text_as_ical_string(value);
949 case ICAL_STRING_VALUE:
951 case ICAL_CALADDRESS_VALUE:
952 return icalvalue_string_as_ical_string(value);
954 case ICAL_DATE_VALUE:
955 return icalvalue_date_as_ical_string(value);
956 case ICAL_DATETIME_VALUE:
957 return icalvalue_datetime_as_ical_string(value);
958 case ICAL_DATETIMEDATE_VALUE:
959 return icalvalue_datetimedate_as_ical_string(value);
960 case ICAL_DURATION_VALUE:
961 return icalvalue_duration_as_ical_string(value);
962 case ICAL_TIME_VALUE:
963 return icalvalue_time_as_ical_string(value);
965 case ICAL_PERIOD_VALUE:
966 return icalvalue_period_as_ical_string(value);
967 case ICAL_DATETIMEPERIOD_VALUE:
968 return icalvalue_datetimeperiod_as_ical_string(value);
970 case ICAL_FLOAT_VALUE:
971 return icalvalue_float_as_ical_string(value);
974 return icalvalue_geo_as_ical_string(value);
976 case ICAL_RECUR_VALUE:
977 return icalvalue_recur_as_ical_string(value);
979 case ICAL_TRIGGER_VALUE:
980 return icalvalue_trigger_as_ical_string(value);
982 case ICAL_ACTION_VALUE:
983 case ICAL_METHOD_VALUE:
984 case ICAL_STATUS_VALUE:
985 case ICAL_TRANSP_VALUE:
986 case ICAL_CLASS_VALUE:
988 return icalmemory_tmp_copy(v->x_value);
991 return icalproperty_enum_to_string(v->data.v_enum);
994 return icalmemory_tmp_copy(v->x_value);
1006 icalvalue_isa (icalvalue* value)
1008 struct icalvalue_impl* v = (struct icalvalue_impl*)value;
1011 return ICAL_NO_VALUE;
1019 icalvalue_isa_value (void* value)
1021 struct icalvalue_impl *impl = (struct icalvalue_impl *)value;
1023 icalerror_check_arg_rz( (value!=0), "value");
1025 if (strcmp(impl->id,"val") == 0) {
1033 int icalvalue_is_time(icalvalue* a) {
1034 icalvalue_kind kind = icalvalue_isa(a);
1036 if(kind == ICAL_DATETIMEDATE_VALUE ||
1037 kind == ICAL_DATETIME_VALUE ||
1038 kind == ICAL_DATE_VALUE ||
1039 kind == ICAL_TIME_VALUE ){
1047 icalparameter_xliccomparetype
1048 icalvalue_compare(icalvalue* a, icalvalue *b)
1050 struct icalvalue_impl *impla = (struct icalvalue_impl *)a;
1051 struct icalvalue_impl *implb = (struct icalvalue_impl *)b;
1053 icalerror_check_arg_rz( (a!=0), "a");
1054 icalerror_check_arg_rz( (b!=0), "b");
1056 /* Not the same type; they can only be unequal */
1057 if( ! (icalvalue_is_time(a) && icalvalue_is_time(b)) &&
1058 icalvalue_isa(a) != icalvalue_isa(b)){
1059 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1062 switch (icalvalue_isa(a)){
1064 case ICAL_ATTACH_VALUE:
1065 case ICAL_BINARY_VALUE:
1067 case ICAL_BOOLEAN_VALUE:
1069 if (icalvalue_get_boolean(a) == icalvalue_get_boolean(b)){
1070 return ICAL_XLICCOMPARETYPE_EQUAL;
1072 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1076 case ICAL_FLOAT_VALUE:
1078 if (impla->data.v_float > implb->data.v_float){
1079 return ICAL_XLICCOMPARETYPE_GREATER;
1080 } else if (impla->data.v_float < implb->data.v_float){
1081 return ICAL_XLICCOMPARETYPE_LESS;
1083 return ICAL_XLICCOMPARETYPE_EQUAL;
1087 case ICAL_INTEGER_VALUE:
1088 case ICAL_UTCOFFSET_VALUE:
1090 if (impla->data.v_int > implb->data.v_int){
1091 return ICAL_XLICCOMPARETYPE_GREATER;
1092 } else if (impla->data.v_int < implb->data.v_int){
1093 return ICAL_XLICCOMPARETYPE_LESS;
1095 return ICAL_XLICCOMPARETYPE_EQUAL;
1099 case ICAL_DURATION_VALUE:
1101 int a = icaldurationtype_as_int(impla->data.v_duration);
1102 int b = icaldurationtype_as_int(implb->data.v_duration);
1105 return ICAL_XLICCOMPARETYPE_GREATER;
1107 return ICAL_XLICCOMPARETYPE_LESS;
1109 return ICAL_XLICCOMPARETYPE_EQUAL;
1114 case ICAL_TEXT_VALUE:
1115 case ICAL_URI_VALUE:
1116 case ICAL_CALADDRESS_VALUE:
1117 case ICAL_TRIGGER_VALUE:
1118 case ICAL_DATE_VALUE:
1119 case ICAL_DATETIME_VALUE:
1120 case ICAL_DATETIMEDATE_VALUE:
1121 case ICAL_TIME_VALUE:
1122 case ICAL_DATETIMEPERIOD_VALUE:
1126 r = strcmp(icalvalue_as_ical_string(a),
1127 icalvalue_as_ical_string(b));
1130 return ICAL_XLICCOMPARETYPE_GREATER;
1132 return ICAL_XLICCOMPARETYPE_LESS;
1134 return ICAL_XLICCOMPARETYPE_EQUAL;
1140 case ICAL_METHOD_VALUE:
1142 if (icalvalue_get_method(a) == icalvalue_get_method(b)){
1143 return ICAL_XLICCOMPARETYPE_EQUAL;
1145 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1150 case ICAL_STATUS_VALUE:
1152 if (icalvalue_get_status(a) == icalvalue_get_status(b)){
1153 return ICAL_XLICCOMPARETYPE_EQUAL;
1155 return ICAL_XLICCOMPARETYPE_NOTEQUAL;
1160 case ICAL_PERIOD_VALUE:
1161 case ICAL_GEO_VALUE:
1162 case ICAL_RECUR_VALUE:
1166 icalerror_warn("Comparison not implemented for value type");
1167 return ICAL_XLICCOMPARETYPE_REGEX+1; /* HACK */
1173 void icalvalue_set_parent(icalvalue* value,
1174 icalproperty* property)
1176 struct icalvalue_impl* v = (struct icalvalue_impl*)value;
1178 v->parent = property;
1182 icalproperty* icalvalue_get_parent(icalvalue* value)
1184 struct icalvalue_impl* v = (struct icalvalue_impl*)value;
1192 /* The remaining interfaces are 'new', 'set' and 'get' for each of the value
1196 /* Everything below this line is machine generated. Do not edit. */