]> diplodocus.org Git - nmh/blobdiff - sbr/icalendar.l
new.c: Order two return statements to match comment.
[nmh] / sbr / icalendar.l
index dc75dacee1f606e5bbc8145ef4047cbf831b8921..3a6522ce61fb9f5bf0d1456bb21d82032c06a528 100644 (file)
 #include "h/mh.h"
 #include "h/icalendar.h"
 #include "sbr/icalparse.h"
+#include "sbr/base64.h"
 
 static char *unfold (char *, size_t *);
-static void destroy_icallex ();
+static void destroy_icallex(void);
 %}
 
 /*
@@ -257,14 +258,34 @@ folded-value         {VALUE-CHAR}*({fold}{VALUE-CHAR}*)+
 
 . {
     /* By default, flex will just pass unmatched text.  Catch it instead. */
-    inform("unexpected input: |%s|\n", icaltext);
+    contentline *clines = vevents.last->contentlines;
+    contentline *cline;
+
+    if (clines  &&  (cline = clines->last)) {
+        if (cline->unexpected == NULL) {
+            cline->unexpected = charstring_create (0);
+        }
+        charstring_append_cstring (cline->unexpected, icaltext);
+    }
 }
 
+<INITIAL>
 <<EOF>> {
+    /* See next rule for when start state is not INITIAL. */
     destroy_icallex ();
     yyterminate ();
 }
 
+<<EOF>> {
+    /* Missing a final newline after a token.  The input does not conform
+       to RFC 5545 ยง 3.1, which requires that each contentline end with a
+       CRLF.  (Assume that the token is at the end of a contentline.)  Be
+       liberal in what we accept by faking a newline here, and setting the
+       start state to terminate on the next call. */
+    BEGIN (INITIAL);
+    return ICAL_CRLF;
+}
+
 %%
 
 static char *
@@ -300,7 +321,7 @@ unfold (char *text, size_t *leng) {
  * with something other than flex.
  */
 static void
-destroy_icallex () {
+destroy_icallex(void) {
 #if defined FLEX_SCANNER  &&  defined YY_FLEX_SUBMINOR_VERSION
     /* Hack:  rely on fact that the the YY_FLEX_SUBMINOR_VERSION
        #define was added to flex (flex.skl v. 2.163) after