RFC 3676 establishes two parameters (Format and DelSP) to be used with the Text/Plain media type. In the presence of these parameters, trailing whitespace is used to indicate flowed lines and a canonical quote indicator is used to indicate quoted lines. mailinfo now unfolds, unquotes, and un-space-stuffs such messages. Signed-off-by: Jay Soffian <jaysoffian@xxxxxxxxx> --- This is a bit simpler than the previous patch and incorporates most of Johannes' feedback. I also switched from enum's to int's since enum's were really overkill. builtin-mailinfo.c | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index 11f154b..0492baf 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -21,6 +21,10 @@ static enum { TYPE_TEXT, TYPE_OTHER, } message_type; +/* RFC 3676 Text/Plain Format and DelSp Parameters */ +static int message_format_is_flowed; +static int message_delsp_is_yes; + static char charset[256]; static int patch_lines; static char **p_hdr_data, **s_hdr_data; @@ -193,6 +197,15 @@ static int handle_content_type(char *line) if (strcasestr(line, "text/") == NULL) message_type = TYPE_OTHER; + else if (strcasestr(line, "text/plain")) { + char attr[256]; + if ((message_format_is_flowed = ( + slurp_attr(line, "format=", attr) && + !strcasecmp(attr, "flowed")))) + message_delsp_is_yes = ( + slurp_attr(line, "delsp=", attr) && + !strcasecmp(attr, "yes")); + } if (slurp_attr(line, "boundary=", boundary + 2)) { memcpy(boundary, "--", 2); if (content_top++ >= &content[MAX_BOUNDARIES]) { @@ -681,6 +694,8 @@ again: transfer_encoding = TE_DONTCARE; charset[0] = 0; message_type = TYPE_TEXT; + message_format_is_flowed = 0; + message_delsp_is_yes = 0; /* slurp in this section's info */ while (read_one_header_line(line, sizeof(line), fin)) @@ -770,6 +785,22 @@ static int handle_filter(char *line, unsigned linesize) { static int filter = 0; + if (message_format_is_flowed && strcmp(line, "-- \n")) { + /* strip quote markers */ + while (*line && *line == '>') + line++; + /* undo space-stuffing */ + if (*line == ' ') + line++; + if (strcmp(line, "-- \n")) { + char *cp = strchrnul(line, '\n'); + if (cp > line && *(cp-1) == ' ' && *cp == '\n') + /* line is flowed (wrapped); remove + * the \n or <space>\n if delsp is yes + */ + *(cp-(message_delsp_is_yes?1:0)) = '\0'; + } + } /* filter tells us which part we left off on * a non-zero return indicates we hit a filter point */ -- 1.5.4.1.1281.g75df - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html