diff options
Diffstat (limited to 'libical/src/libical/icalvalue.c')
-rw-r--r-- | libical/src/libical/icalvalue.c | 71 |
1 files changed, 68 insertions, 3 deletions
diff --git a/libical/src/libical/icalvalue.c b/libical/src/libical/icalvalue.c index ec332a0f04..79eb8d827a 100644 --- a/libical/src/libical/icalvalue.c +++ b/libical/src/libical/icalvalue.c @@ -195,6 +195,64 @@ icalvalue* icalvalue_new_clone(icalvalue* value){ return new; } +char* strdup_and_dequote(char* str) +{ + char* p; + char* out = (char*)malloc(sizeof(char) * strlen(str) +1); + char* pout; + + if (out == 0){ + return 0; + } + + pout = out; + + for (p = str; *p!=0; p++){ + + if( *p == '\\') + { + p++; + switch(*p){ + case 0: + { + break; + *pout = '\0'; + } + case 'n': + { + *pout = '\n'; + break; + } + case 'N': + { + *pout = '\n'; + break; + } + case '\\': + case ',': + case ';': + { + *pout = *p; + break; + } + default: + { + *pout = ' '; + } + } + } else { + *pout = *p; + } + + pout++; + + } + + *pout = '\0'; + + return out; +} + icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,icalproperty** error) { @@ -285,7 +343,9 @@ icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,ic case ICAL_TEXT_VALUE: { - value = icalvalue_new_text(str); + char* dequoted_str = strdup_and_dequote(str); + value = icalvalue_new_text(dequoted_str); + free(dequoted_str); break; } @@ -311,7 +371,13 @@ icalvalue* icalvalue_new_from_string_with_error(icalvalue_kind kind,char* str,ic case ICAL_METHOD_VALUE: { icalproperty_method method = icalenum_string_to_method(str); - value = icalvalue_new_method(method); + + if(method == ICAL_METHOD_NONE){ + value = 0; + } else { + value = icalvalue_new_method(method); + } + break; } @@ -1812,7 +1878,6 @@ icalvalue_get_string(icalvalue* value) return ((struct icalvalue_impl*)value)->data.v_string; } - icalvalue* icalvalue_new_text (char* v) { |