X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/3b640c422bd716ab7246d72b1ea3b35dff533e29..b46d49ba:/sbr/icalendar.l?ds=sidebyside diff --git a/sbr/icalendar.l b/sbr/icalendar.l index 016c6ebd..3a6522ce 100644 --- a/sbr/icalendar.l +++ b/sbr/icalendar.l @@ -1,5 +1,4 @@ -/* - * icalendar.l -- icalendar (RFC 5545) scanner +/* icalendar.l -- icalendar (RFC 5545) scanner * * This code is Copyright (c) 2014, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -12,9 +11,10 @@ #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); %} /* @@ -258,14 +258,34 @@ folded-value {VALUE-CHAR}*({fold}{VALUE-CHAR}*)+ . { /* By default, flex will just pass unmatched text. Catch it instead. */ - advise (NULL, "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); + } } + <> { + /* See next rule for when start state is not INITIAL. */ destroy_icallex (); yyterminate (); } +<> { + /* 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 * @@ -301,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