]> diplodocus.org Git - nmh/blobdiff - sbr/icalparse.y
- Fixed bcc to work with sendmail/pipe [Bug 55700].
[nmh] / sbr / icalparse.y
index dc58d4aa5cc2aeb9ad327aeb73123878868ee5fa..0213fa90a3f91583e01b9f3a90397c705bc8d012 100644 (file)
     */
 
 #include "h/mh.h"
+#include "sbr/error.h"
 #include "h/icalendar.h"
 #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 +63,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 +88,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 +139,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 +162,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 +174,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 +190,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 +212,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 +230,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 +242,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 +263,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 +291,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 +302,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 +322,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 +334,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. */