summaryrefslogtreecommitdiffabout
path: root/libical/src/libical/icalparser.c
Side-by-side diff
Diffstat (limited to 'libical/src/libical/icalparser.c') (more/less context) (ignore whitespace changes)
-rw-r--r--libical/src/libical/icalparser.c365
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);