git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] mailinfo: support rfc3676 (format=flowed) text/plain messages

From
Jay Soffian <jaysoffian@gmail.com>
Date
Feb 15, 2008, 21:53 UTC
Message-ID
<1203112418-25199-2-git-send-email-jaysoffian@gmail.com>
In-Reply-To
<1203112418-25199-1-git-send-email-jaysoffian@gmail.com>

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@gmail.com>
---
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
Previous: Jay SoffianNext: Jay Soffian
Message 2 of 8 in “mailinfo: ensure handle_filter gets only one line at a time”
  1. 1/3 mailinfo: ensure handle_filter gets only one line at a timeJay Soffian, Feb 15, 2008
  2. 2/3 mailinfo: support rfc3676 (format=flowed) text/plain messagesJay Soffian, Feb 15, 2008
  3. 3/3 test mailinfo rfc3676 supportJay Soffian, Feb 15, 2008
  4. Junio C HamanoFeb 15, 2008
  5. Jay SoffianFeb 15, 2008
  6. Junio C HamanoFeb 16, 2008
  7. Junio C HamanoFeb 16, 2008
  8. Jay SoffianFeb 16, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.