summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2018-05-23 16:24:48 +0200
committerLeah Neukirchen <leah@vuxu.org>2018-05-23 16:24:48 +0200
commitbcd258a8c87234d3c8b606dfeb608155e3d23a0d (patch)
tree4191431fdff8f4acaef62685ca27f0ad75fc9a88
parentb4df5b006b330c404a05a5dff0359f09cd2b4dde (diff)
downloadmblaze-bcd258a8c87234d3c8b606dfeb608155e3d23a0d.tar.gz
mblaze-bcd258a8c87234d3c8b606dfeb608155e3d23a0d.tar.xz
mblaze-bcd258a8c87234d3c8b606dfeb608155e3d23a0d.zip
maddr, mhdr: requote display names when needed
-rw-r--r--maddr.c31
-rw-r--r--mhdr.c31
2 files changed, 56 insertions, 6 deletions
diff --git a/maddr.c b/maddr.c
index d8ac123..3e43eca 100644
--- a/maddr.c
+++ b/maddr.c
@@ -14,6 +14,29 @@ static char defaulthflags[] = "from:sender:reply-to:to:cc:bcc:"
 static char *hflag = defaulthflags;
 
 void
+print_quoted(char *s)
+{
+	char *t;
+
+	for (t = s; *t; t++)
+                if ((unsigned char)*t < 32 || strchr("()<>[]:;@\\,.\"", *t))
+			goto quote;
+	
+	printf("%s", s);
+	return;
+
+quote:
+	putchar('"');
+	for (t = s; *t; t++) {
+		if (*t == '"' || *t == '\\')
+			putchar('\\');
+		putchar(*t);
+	}
+	putchar('"');
+
+}
+
+void
 addr(char *file)
 {
 	while (*file == ' ' || *file == '\t')
@@ -41,10 +64,12 @@ addr(char *file)
 				if (disp && addr && strcmp(disp, addr) == 0)
 					disp = 0;
 				if (disp && addr) {
-					if (aflag)
+					if (aflag) {
 						printf("%s\n", addr);
-					else
-						printf("%s <%s>\n", disp, addr);
+					} else {
+						print_quoted(disp);
+						printf(" <%s>\n", addr);
+					}
 				} else if (addr) {
 					printf("%s\n", addr);
 				}
diff --git a/mhdr.c b/mhdr.c
index 7836a84..d19093b 100644
--- a/mhdr.c
+++ b/mhdr.c
@@ -59,6 +59,29 @@ headerall(struct message *msg)
 }
 
 void
+print_quoted(char *s)
+{
+	char *t;
+
+	for (t = s; *t; t++)
+                if ((unsigned char)*t < 32 || strchr("()<>[]:;@\\,.\"", *t))
+			goto quote;
+	
+	printf("%s", s);
+	return;
+
+quote:
+	putchar('"');
+	for (t = s; *t; t++) {
+		if (*t == '"' || *t == '\\')
+			putchar('\\');
+		putchar(*t);
+	}
+	putchar('"');
+
+}
+
+void
 print_addresses(char *s)
 {
 	char *disp, *addr;
@@ -74,10 +97,12 @@ print_addresses(char *s)
 		if (Hflag && addr)
 			printf("%s\t", curfile);
 
-		if (disp && addr)
-			printf("%s <%s>\n", disp, addr);
-		else if (addr)
+		if (disp && addr) {
+			print_quoted(disp);
+			printf(" <%s>\n", addr);
+		} else if (addr) {
 			printf("%s\n", addr);
+		}
 	}
 }