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

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

From
Jay Soffian <jaysoffian@gmail.com>
Date
Feb 15, 2008, 02:21 UTC
Message-ID
<1203042077-11385-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>
---
It's been a while since I hacked C, so mucho scrutiny appreciated. The
mailinfo testsuite still passes, and this patch is followed by one which
adds a new test for this code, which also passes.
This is based off next, but mailinfo hasn't changed in a while, so it should apply cleanly to master (didn't test that though).
 builtin-mailinfo.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c
index 2600847..deaf92b 100644
--- a/builtin-mailinfo.c
+++ b/builtin-mailinfo.c
@@ -20,6 +20,13 @@ static enum  {
 static enum  {
 	TYPE_TEXT, TYPE_OTHER,
 } message_type;
+/* RFC 3676 Text/Plain Format and DelSp Parameters */
+static enum {
+	FORMAT_NONE, FORMAT_FIXED, FORMAT_FLOWED,
+} tp_format;
+static enum {
+	DELSP_NONE, DELSP_YES, DELSP_NO,
+} tp_delsp;
 
 static char charset[256];
 static int patch_lines;
@@ -193,6 +200,18 @@ 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 (slurp_attr(line, "format=", attr) && !strcasecmp(attr, "flowed")) {
+			tp_format = FORMAT_FLOWED;
+			if (slurp_attr(line, "delsp=", attr) && !strcasecmp(attr, "yes"))
+				tp_delsp = DELSP_YES;
+			else
+				tp_delsp = DELSP_NO;
+		}
+		else
+			tp_format = FORMAT_FIXED;
+	}
 	if (slurp_attr(line, "boundary=", boundary + 2)) {
 		memcpy(boundary, "--", 2);
 		if (content_top++ >= &content[MAX_BOUNDARIES]) {
@@ -681,6 +700,8 @@ again:
 	transfer_encoding = TE_DONTCARE;
 	charset[0] = 0;
 	message_type = TYPE_TEXT;
+	tp_format = FORMAT_NONE;
+	tp_delsp = DELSP_NONE;
 
 	/* slurp in this section's info */
 	while (read_one_header_line(line, sizeof(line), fin))
@@ -770,6 +791,24 @@ static int handle_filter(char *line, unsigned linesize)
 {
 	static int filter = 0;
 
+	if (tp_format == FORMAT_FLOWED && !!strcmp(line, "-- \n")) {
+		char *cp = line;
+		while (*cp == '>' && *cp != 0)
+			cp++;
+		if (*cp == ' ')
+			cp++;
+		line = cp;
+		if (!!strcmp(line, "-- \n")) {
+			while (*cp != '\n' && *cp !=0)
+				cp++;
+			if (cp > line && *cp == '\n' && *(cp-1) == ' ') {
+				if (tp_delsp == DELSP_YES)
+					*(cp-1) = '\0';
+				else
+					*cp = '\0';
+			}
+		}
+	}
 	/* filter tells us which part we left off on
 	 * a non-zero return indicates we hit a filter point
 	 */
@@ -818,6 +857,7 @@ static void handle_body(void)
 
 		switch (transfer_encoding) {
 		case TE_BASE64:
+		case TE_QP:
 		{
 			char *op = line;
 
-- 
1.5.4.1.1281.g75df
Next: Jay Soffian
Message 1 of 14 in “mailinfo: support rfc3676 (format=flowed) text/plain messages”
  1. 1/2 mailinfo: support rfc3676 (format=flowed) text/plain messagesJay Soffian, Feb 15, 2008
  2. 2/2 test mailinfo rfc3676 supportJay Soffian, Feb 15, 2008
  3. Johannes SchindelinFeb 15, 2008
  4. Jay SoffianFeb 15, 2008
  5. Johannes SchindelinFeb 15, 2008
  6. Jay SoffianFeb 15, 2008
  7. Jay SoffianFeb 15, 2008
  8. Johannes SchindelinFeb 16, 2008
  9. Junio C HamanoFeb 15, 2008
  10. Jay SoffianFeb 15, 2008
  11. Junio C HamanoFeb 16, 2008
  12. Jay SoffianFeb 16, 2008
  13. Junio C HamanoFeb 16, 2008
  14. Derek FawcusFeb 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.