X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/d60c3eab53ca38c4f3bd88b0cc5fda86a527514f..b47b562525f149f175c3d216feea20a6db2e9ff5:/sbr/icalparse.y?ds=inline diff --git a/sbr/icalparse.y b/sbr/icalparse.y index dc58d4aa..ef302001 100644 --- a/sbr/icalparse.y +++ b/sbr/icalparse.y @@ -38,7 +38,7 @@ #include "h/utils.h" static char *append (contentline *, const char *, const size_t); -static void new_input_line (contentline **); +static void new_content_line (contentline **); static void new_vevent (vevent *); static void free_param_names (param_list *); static void free_param_values (value_list *); @@ -62,7 +62,7 @@ contentline_list /* contentline = name *(";" param ) ":" value CRLF */ contentline : ICAL_NAME { - new_input_line (&vevents.last->contentlines); + new_content_line (&vevents.last->contentlines); append (vevents.last->contentlines->last, $1, strlen ($1)); vevents.last->contentlines->last->name = $1; } ICAL_COLON { @@ -87,7 +87,7 @@ contentline } } | ICAL_NAME { - new_input_line (&vevents.last->contentlines); + new_content_line (&vevents.last->contentlines); append (vevents.last->contentlines->last, $1, strlen ($1)); vevents.last->contentlines->last->name = $1; } param_list ICAL_COLON { @@ -138,13 +138,15 @@ param_value_list * Remove the contentline node (by setting its name to NULL). */ void -remove_contentline (contentline *node) { +remove_contentline (contentline *node) +{ free (node->name); node->name = NULL; } contentline * -add_contentline (contentline *node, const char *name) { +add_contentline (contentline *node, const char *name) +{ contentline *new_node; NEW0(new_node); @@ -159,7 +161,8 @@ add_contentline (contentline *node, const char *name) { * Remove the value from a value_list. */ void -remove_value (value_list *node) { +remove_value (value_list *node) +{ free (node->value); node->value = NULL; } @@ -170,19 +173,15 @@ remove_value (value_list *node) { */ contentline * find_contentline (contentline *contentlines, const char *name, - const char *val) { + const char *val) +{ contentline *node; for (node = contentlines; node; node = node->next) { /* node->name will be NULL if the line was "deleted". */ if (node->name && ! strcasecmp (name, node->name)) { - if (val && node->value) { - if (! strcasecmp (val, node->value)) { - return node; - } - } else { + if (!val || !node->value || !strcasecmp(val, node->value)) return node; - } } } @@ -190,7 +189,8 @@ find_contentline (contentline *contentlines, const char *name, } static char * -append (contentline *cline, const char *src, const size_t src_len) { +append (contentline *cline, const char *src, const size_t src_len) +{ if (src_len > 0) { const size_t len = cline->input_line_len + src_len; @@ -211,7 +211,8 @@ append (contentline *cline, const char *src, const size_t src_len) { } static void -new_input_line (contentline **cline) { +new_content_line (contentline **cline) +{ contentline *new_node; NEW0(new_node); @@ -228,7 +229,8 @@ new_input_line (contentline **cline) { } static void -new_vevent (vevent *event) { +new_vevent (vevent *event) +{ vevent *new_node, *node; NEW0(new_node); @@ -239,7 +241,8 @@ new_vevent (vevent *event) { } void -add_param_name (contentline *cline, char *name) { +add_param_name (contentline *cline, char *name) +{ param_list *new_node; param_list *p; @@ -259,7 +262,8 @@ add_param_name (contentline *cline, char *name) { * Add a value to the last parameter seen. */ void -add_param_value (contentline *cline, char *value) { +add_param_value (contentline *cline, char *value) +{ value_list *new_node; param_list *p; value_list *v; @@ -286,7 +290,8 @@ add_param_value (contentline *cline, char *value) { } void -free_contentlines (contentline *root) { +free_contentlines (contentline *root) +{ contentline *i, *next; for (i = root; i; i = next) { @@ -296,13 +301,15 @@ free_contentlines (contentline *root) { } free (i->value); free (i->input_line); + charstring_free (i->unexpected); next = i->next; free (i); } } static void -free_param_names (param_list *p) { +free_param_names (param_list *p) +{ param_list *next; for ( ; p; p = next) { @@ -314,7 +321,8 @@ free_param_names (param_list *p) { } static void -free_param_values (value_list *v) { +free_param_values (value_list *v) +{ value_list *next; for ( ; v; v = next) { @@ -325,12 +333,29 @@ free_param_values (value_list *v) { } static int -icalerror (const char *error) { +icalerror (const char *error) +{ + contentline *c; + charstring_t context = NULL; + + /* Find last chunk of unexpected text. */ + for (c = vevents.last->contentlines; c; c = c->next) { + if (c->unexpected) { + context = c->unexpected; + } + } + if (! strcmp ("syntax error, unexpected $end, expecting ICAL_NAME", error)) { /* Empty input: produce no output. */ } else { - adios (NULL, "%s", error); + if (context) { + inform ("%s after \"%s\"", error, charstring_buffer (context)); + } else { + inform ("%s", error); + } + parser_status = -1; + return -1; } return 0; /* The return value isn't used anyway. */