Diffstat (limited to 'libical/src/libical/icalparser.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libical/src/libical/icalparser.c | 365 |
1 files changed, 179 insertions, 186 deletions
diff --git a/libical/src/libical/icalparser.c b/libical/src/libical/icalparser.c index b5824d5..5c4296b 100644 --- a/libical/src/libical/icalparser.c +++ b/libical/src/libical/icalparser.c @@ -1,2 +1,2 @@ -/* -*- Mode: C -*- +/* -*- Mode: C; tab-width: 4; c-basic-offset: 8; -*- ====================================================================== @@ -40,5 +40,3 @@ -#include "icalparser.h" #include "pvl.h" -#include "icalmemory.h" #include "icalerror.h" @@ -54,9 +52,24 @@ -int snprintf(char *str, size_t n, char const *fmt, ...); +#include "icalmemory.h" +#include "icalparser.h" + +#ifdef HAVE_WCTYPE_H +# include <wctype.h> +/* Some systems have an imcomplete implementation on wctype (FreeBSD, + * Darwin). Cope with that. */ +# ifndef HAVE_ISWSPACE +# define iswspace isspace +# endif +#else +# ifndef HAVE_ISWSPACE +# define iswspace isspace +# endif +#endif -extern icalvalue* icalparser_yy_value; -void set_parser_value_state(icalvalue_kind kind); -int ical_yyparse(void); +#ifdef WIN32 +#define snprintf _snprintf +#define strcasecmp stricmp +#endif -char* icalparser_get_next_char(char c, char *str); +char* icalparser_get_next_char(char c, char *str, int qm); char* icalparser_get_next_parameter(char* line,char** end); @@ -83,3 +96,3 @@ struct icalparser_impl void *line_gen_data; - + }; @@ -102,2 +115,3 @@ icalparser* icalparser_new(void) impl->buffer_full = 0; + impl->continuation_line = 0; impl->lineno = 0; @@ -112,10 +126,9 @@ void icalparser_free(icalparser* parser) { - struct icalparser_impl* impl = (struct icalparser_impl*)parser; icalcomponent *c; - if (impl->root_component != 0){ - icalcomponent_free(impl->root_component); + if (parser->root_component != 0){ + icalcomponent_free(parser->root_component); } - while( (c=pvl_pop(impl->components)) != 0){ + while( (c=pvl_pop(parser->components)) != 0){ icalcomponent_free(c); @@ -123,5 +136,5 @@ void icalparser_free(icalparser* parser) - pvl_free(impl->components); + pvl_free(parser->components); - free(impl); + free(parser); } @@ -130,5 +143,3 @@ void icalparser_set_gen_data(icalparser* parser, void* data) { - struct icalparser_impl* impl = (struct icalparser_impl*)parser; - - impl->line_gen_data = data; + parser->line_gen_data = data; } @@ -142,3 +153,3 @@ icalvalue* icalvalue_new_From_string_with_error(icalvalue_kind kind, -char* icalparser_get_next_char(char c, char *str) +char* icalparser_get_next_char(char c, char *str, int qm) { @@ -146,19 +157,19 @@ char* icalparser_get_next_char(char c, char *str) char* p; - for(p=str; *p!=0; p++){ - - if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){ - quote_mode =1; - continue; - } - - if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){ - quote_mode =0; - continue; - } - - if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){ - return p; - } + if (qm == 1) { + if ( quote_mode == 0 && *p=='"' && *(p-1) != '\\' ){ + quote_mode =1; + continue; + } + + if ( quote_mode == 1 && *p=='"' && *(p-1) != '\\' ){ + quote_mode =0; + continue; + } + } + + if (quote_mode == 0 && *p== c && *(p-1) != '\\' ){ + return p; + } @@ -169,6 +180,7 @@ char* icalparser_get_next_char(char c, char *str) -/* make a new tmp buffer out of a substring */ -char* make_segment(char* start, char* end) + +/** make a new tmp buffer out of a substring */ +static char* make_segment(char* start, char* end) { - char *buf; + char *buf, *tmp; size_t size = (size_t)end - (size_t)start; @@ -180,60 +192,13 @@ char* make_segment(char* start, char* end) *(buf+size) = 0; + + tmp = (buf+size); + while ( *tmp == '\0' || iswspace(*tmp) ) + { + *tmp = 0; + tmp--; + } return buf; - } -const char* input_buffer; -const char* input_buffer_p; -//#define min(a,b) ((a) < (b) ? (a) : (b)) - -int icalparser_flex_input(char* buf, int max_size) -{ - int n = max_size; // = min(max_size,strlen(input_buffer_p)); - if ( n < ((int )strlen(input_buffer_p)) ) - n = strlen(input_buffer_p); - if (n > 0){ - memcpy(buf, input_buffer_p, n); - input_buffer_p += n; - return n; - } else { - return 0; - } -} - -void icalparser_clear_flex_input(void) -{ - input_buffer_p = input_buffer+strlen(input_buffer); -} - -/* Call the flex/bison parser to parse a complex value */ - -icalvalue* icalparser_parse_value(icalvalue_kind kind, - const char* str, icalproperty** error) -{ - int r; - input_buffer_p = input_buffer = str; - - set_parser_value_state(kind); - icalparser_yy_value = 0; - - r = ical_yyparse(); - - /* Error. Parse failed */ - if( icalparser_yy_value == 0 || r != 0){ - - if(icalparser_yy_value !=0){ - icalvalue_free(icalparser_yy_value); - icalparser_yy_value = 0; - } - - return 0; - } - - if (error != 0){ - *error = 0; - } - - return icalparser_yy_value; -} @@ -245,4 +210,4 @@ char* icalparser_get_prop_name(char* line, char** end) - p = icalparser_get_next_char(';',line); - v = icalparser_get_next_char(':',line); + p = icalparser_get_next_char(';',line,1); + v = icalparser_get_next_char(':',line,1); if (p== 0 && v == 0) { @@ -264,5 +229,5 @@ char* icalparser_get_prop_name(char* line, char** end) + char* icalparser_get_param_name(char* line, char **end) { - char* next; @@ -270,3 +235,3 @@ char* icalparser_get_param_name(char* line, char **end) - next = icalparser_get_next_char('=',line); + next = icalparser_get_next_char('=',line,1); @@ -278,9 +243,18 @@ char* icalparser_get_param_name(char* line, char **end) *end = next+1; + if (**end == '"') { + *end = *end+1; + next = icalparser_get_next_char('"',*end,0); + if (next == 0) { + return 0; + } + + *end = make_segment(*end,next); + } + return str; - } + char* icalparser_get_next_paramvalue(char* line, char **end) { - char* next; @@ -288,3 +262,3 @@ char* icalparser_get_next_paramvalue(char* line, char **end) - next = icalparser_get_next_char(',',line); + next = icalparser_get_next_char(',',line,1); @@ -301,6 +275,7 @@ char* icalparser_get_next_paramvalue(char* line, char **end) } - } -/* A property may have multiple values, if the values are seperated by + +/** + A property may have multiple values, if the values are seperated by commas in the content line. This routine will look for the next @@ -320,3 +295,3 @@ char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind) - next = icalparser_get_next_char(',',p); + next = icalparser_get_next_char(',',p,1); @@ -342,2 +317,11 @@ char* icalparser_get_next_value(char* line, char **end, icalvalue_kind kind) } + /* ignore all , for query value. select dtstart, dtend etc ... */ + else if( kind == ICAL_QUERY_VALUE) { + if ( next != 0) { + p = next+1; + continue; + } + else + break; + } @@ -381,4 +365,4 @@ char* icalparser_get_next_parameter(char* line,char** end) - v = icalparser_get_next_char(':',line); - next = icalparser_get_next_char(';', line); + v = icalparser_get_next_char(':',line,1); + next = icalparser_get_next_char(';', line,1); @@ -388,3 +372,3 @@ char* icalparser_get_next_parameter(char* line,char** end) if (next == 0 || next > v) { - next = icalparser_get_next_char(':', line); + next = icalparser_get_next_char(':', line,1); } @@ -401,5 +385,7 @@ char* icalparser_get_next_parameter(char* line,char** end) -/* Get a single property line, from the property name through the - final new line, and include any continuation lines */ +/** + * Get a single property line, from the property name through the + * final new line, and include any continuation lines + */ char* icalparser_get_line(icalparser *parser, @@ -409,5 +395,3 @@ char* icalparser_get_line(icalparser *parser, char *line_p; - struct icalparser_impl* impl = (struct icalparser_impl*)parser; - size_t buf_size = impl->tmp_buf_size; - + size_t buf_size = parser->tmp_buf_size; @@ -417,3 +401,3 @@ char* icalparser_get_line(icalparser *parser, /* Read lines by calling line_gen_func and putting the data into - impl->temp. If the line is a continuation line ( begins with a + parser->temp. If the line is a continuation line ( begins with a space after a newline ) then append the data onto line and read @@ -431,3 +415,3 @@ char* icalparser_get_line(icalparser *parser, output. This may be left over from a previous call */ - if (impl->temp[0] != '\0' ) { + if (parser->temp[0] != '\0' ) { @@ -436,8 +420,8 @@ char* icalparser_get_line(icalparser *parser, read later, because the line is not finished */ - if (impl->temp[impl->tmp_buf_size-1] == 0 && - impl->temp[impl->tmp_buf_size-2] != '\n'&& - impl->temp[impl->tmp_buf_size-2] != 0 ){ - impl->buffer_full = 1; + if (parser->temp[parser->tmp_buf_size-1] == 0 && + parser->temp[parser->tmp_buf_size-2] != '\n'&& + parser->temp[parser->tmp_buf_size-2] != 0 ){ + parser->buffer_full = 1; } else { - impl->buffer_full = 0; + parser->buffer_full = 0; } @@ -445,5 +429,5 @@ char* icalparser_get_line(icalparser *parser, /* Copy the temp to the output and clear the temp buffer. */ - if(impl->continuation_line==1){ + if(parser->continuation_line==1){ /* back up the pointer to erase the continuation characters */ - impl->continuation_line = 0; + parser->continuation_line = 0; line_p--; @@ -456,15 +440,15 @@ char* icalparser_get_line(icalparser *parser, icalmemory_append_string(&line,&line_p,&buf_size, - impl->temp+1); + parser->temp+1); } else { - icalmemory_append_string(&line,&line_p,&buf_size,impl->temp); + icalmemory_append_string(&line,&line_p,&buf_size,parser->temp); } - impl->temp[0] = '\0' ; + parser->temp[0] = '\0' ; } - impl->temp[impl->tmp_buf_size-1] = 1; /* Mark end of buffer */ + parser->temp[parser->tmp_buf_size-1] = 1; /* Mark end of buffer */ /****** Here is where the routine gets string data ******************/ - if ((*line_gen_func)(impl->temp,impl->tmp_buf_size,impl->line_gen_data) + if ((*line_gen_func)(parser->temp,parser->tmp_buf_size,parser->line_gen_data) ==0){/* Get more data */ @@ -473,3 +457,3 @@ char* icalparser_get_line(icalparser *parser, any more data from the last call to line_ge_func*/ - if (impl->temp[0] == '\0'){ + if (parser->temp[0] == '\0'){ @@ -492,8 +476,7 @@ char* icalparser_get_line(icalparser *parser, - if ( line_p > line+1 && *(line_p-1) == '\n' - && (impl->temp[0] == ' ' || impl->temp[0] == '\t') ) { + if ( line_p > line+1 && *(line_p-1) == '\n' && parser->temp[0] == ' ') { - impl->continuation_line = 1; + parser->continuation_line = 1; - } else if ( impl->buffer_full == 1 ) { + } else if ( parser->buffer_full == 1 ) { @@ -521,2 +504,8 @@ char* icalparser_get_line(icalparser *parser, + while ( (*line_p == '\0' || iswspace(*line_p)) && line_p > line ) + { + *line_p = '\0'; + line_p--; + } + return line; @@ -525,3 +514,3 @@ char* icalparser_get_line(icalparser *parser, -void insert_error(icalcomponent* comp, char* text, +static void insert_error(icalcomponent* comp, char* text, char* message, icalparameter_xlicerrortype type) @@ -544,3 +533,4 @@ void insert_error(icalcomponent* comp, char* text, -int line_is_blank(char* line){ + +static int line_is_blank(char* line){ int i=0; @@ -566,4 +556,4 @@ icalcomponent* icalparser_parse(icalparser *parser, icalcomponent *root=0; - struct icalparser_impl *impl = (struct icalparser_impl*)parser; icalerrorstate es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR); + int cont; @@ -582,4 +572,4 @@ icalcomponent* icalparser_parse(icalparser *parser, - assert(impl->root_component == 0); - assert(pvl_count(impl->components) ==0); + assert(parser->root_component == 0); + assert(pvl_count(parser->components) ==0); @@ -608,6 +598,8 @@ icalcomponent* icalparser_parse(icalparser *parser, } + cont = 0; if(line != 0){ free(line); + cont = 1; } - } while ( line != 0); + } while ( cont ); @@ -623,3 +615,2 @@ icalcomponent* icalparser_add_line(icalparser* parser, { - char *p; char *str; @@ -633,3 +624,2 @@ icalcomponent* icalparser_add_line(icalparser* parser, - struct icalparser_impl *impl = (struct icalparser_impl*)parser; icalerror_check_arg_rz((parser != 0),"parser"); @@ -639,3 +629,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, { - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -657,3 +647,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, /* Could not get a property name */ - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); + icalcomponent *tail = pvl_data(pvl_tail(parser->components)); @@ -665,3 +655,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -675,2 +665,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, + if(strcmp(str,"BEGIN") == 0){ @@ -679,3 +670,4 @@ icalcomponent* icalparser_add_line(icalparser* parser, - impl->level++; + + parser->level++; str = icalparser_get_next_value(end,&end, value_kind); @@ -685,3 +677,6 @@ icalcomponent* icalparser_add_line(icalparser* parser, + if (comp_kind == ICAL_NO_COMPONENT){ + + c = icalcomponent_new(ICAL_XLICINVALID_COMPONENT); @@ -699,5 +694,5 @@ icalcomponent* icalparser_add_line(icalparser* parser, - pvl_push(impl->components,c); + pvl_push(parser->components,c); - impl->state = ICALPARSER_BEGIN_COMP; + parser->state = ICALPARSER_BEGIN_COMP; return 0; @@ -707,3 +702,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, - impl->level--; + parser->level--; str = icalparser_get_next_value(end,&end, value_kind); @@ -711,8 +706,8 @@ icalcomponent* icalparser_add_line(icalparser* parser, /* Pop last component off of list and add it to the second-to-last*/ - impl->root_component = pvl_pop(impl->components); + parser->root_component = pvl_pop(parser->components); - tail = pvl_data(pvl_tail(impl->components)); + tail = pvl_data(pvl_tail(parser->components)); if(tail != 0){ - icalcomponent_add_component(tail,impl->root_component); + icalcomponent_add_component(tail,parser->root_component); } @@ -722,17 +717,17 @@ icalcomponent* icalparser_add_line(icalparser* parser, /* Return the component if we are back to the 0th level */ - if (impl->level == 0){ + if (parser->level == 0){ icalcomponent *rtrn; - if(pvl_count(impl->components) != 0){ + if(pvl_count(parser->components) != 0){ /* There are still components on the stack -- this means that one of them did not have a proper "END" */ - pvl_push(impl->components,impl->root_component); - icalparser_clean(parser); /* may reset impl->root_component*/ + pvl_push(parser->components,parser->root_component); + icalparser_clean(parser); /* may reset parser->root_component*/ } - assert(pvl_count(impl->components) == 0); + assert(pvl_count(parser->components) == 0); - impl->state = ICALPARSER_SUCCESS; - rtrn = impl->root_component; - impl->root_component = 0; + parser->state = ICALPARSER_SUCCESS; + rtrn = parser->root_component; + parser->root_component = 0; return rtrn; @@ -740,3 +735,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, } else { - impl->state = ICALPARSER_END_COMP; + parser->state = ICALPARSER_END_COMP; return 0; @@ -749,4 +744,4 @@ icalcomponent* icalparser_add_line(icalparser* parser, - if(pvl_data(pvl_tail(impl->components)) == 0){ - impl->state = ICALPARSER_ERROR; + if(pvl_data(pvl_tail(parser->components)) == 0){ + parser->state = ICALPARSER_ERROR; return 0; @@ -769,3 +764,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, if (prop != 0){ - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); + icalcomponent *tail = pvl_data(pvl_tail(parser->components)); @@ -782,3 +777,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, } else { - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); + icalcomponent* tail = pvl_data(pvl_tail(parser->components)); @@ -788,3 +783,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -798,3 +793,2 @@ icalcomponent* icalparser_add_line(icalparser* parser, - p = 0; while(1) { @@ -816,3 +810,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, icalparameter_kind kind; - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); + icalcomponent *tail = pvl_data(pvl_tail(parser->components)); @@ -847,3 +841,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -857,3 +851,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; continue; @@ -887,3 +881,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -921,3 +915,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, icalproperty* clone = icalproperty_new_clone(prop); - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); + icalcomponent* tail = pvl_data(pvl_tail(parser->components)); @@ -935,3 +929,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, icalproperty_kind prop_kind = icalproperty_isa(prop); - icalcomponent* tail = pvl_data(pvl_tail(impl->components)); + icalcomponent* tail = pvl_data(pvl_tail(parser->components)); @@ -949,3 +943,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -963,3 +957,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, icalproperty_kind prop_kind = icalproperty_isa(prop); - icalcomponent *tail = pvl_data(pvl_tail(impl->components)); + icalcomponent *tail = pvl_data(pvl_tail(parser->components)); @@ -976,3 +970,3 @@ icalcomponent* icalparser_add_line(icalparser* parser, tail = 0; - impl->state = ICALPARSER_ERROR; + parser->state = ICALPARSER_ERROR; return 0; @@ -989,10 +983,10 @@ icalcomponent* icalparser_add_line(icalparser* parser, - if (pvl_data(pvl_tail(impl->components)) == 0 && - impl->level == 0){ + if (pvl_data(pvl_tail(parser->components)) == 0 && + parser->level == 0){ /* HACK. Does this clause ever get executed? */ - impl->state = ICALPARSER_SUCCESS; + parser->state = ICALPARSER_SUCCESS; assert(0); - return impl->root_component; + return parser->root_component; } else { - impl->state = ICALPARSER_IN_PROGRESS; + parser->state = ICALPARSER_IN_PROGRESS; return 0; @@ -1004,4 +998,3 @@ icalparser_state icalparser_get_state(icalparser* parser) { - struct icalparser_impl* impl = (struct icalparser_impl*) parser; - return impl->state; + return parser->state; @@ -1011,3 +1004,2 @@ icalcomponent* icalparser_clean(icalparser* parser) { - struct icalparser_impl* impl = (struct icalparser_impl*) parser; icalcomponent *tail; @@ -1019,3 +1011,3 @@ icalcomponent* icalparser_clean(icalparser* parser) - while((tail=pvl_data(pvl_tail(impl->components))) != 0){ + while((tail=pvl_data(pvl_tail(parser->components))) != 0){ @@ -1026,10 +1018,10 @@ icalcomponent* icalparser_clean(icalparser* parser) - impl->root_component = pvl_pop(impl->components); - tail=pvl_data(pvl_tail(impl->components)); + parser->root_component = pvl_pop(parser->components); + tail=pvl_data(pvl_tail(parser->components)); if(tail != 0){ - if(icalcomponent_get_parent(impl->root_component)!=0){ + if(icalcomponent_get_parent(parser->root_component)!=0){ icalerror_warn("icalparser_clean is trying to attach a component for the second time"); } else { - icalcomponent_add_component(tail,impl->root_component); + icalcomponent_add_component(tail,parser->root_component); } @@ -1039,3 +1031,3 @@ icalcomponent* icalparser_clean(icalparser* parser) - return impl->root_component; + return parser->root_component; @@ -1048,3 +1040,4 @@ struct slg_data { -char* string_line_generator(char *out, size_t buf_size, void *d) + +char* icalparser_string_line_generator(char *out, size_t buf_size, void *d) { @@ -1102,3 +1095,3 @@ icalcomponent* icalparser_parse_string(const char* str) - c = icalparser_parse(p,string_line_generator); + c = icalparser_parse(p,icalparser_string_line_generator); |