tutf in subject - plan9port - [fork] Plan 9 from user space
(HTM) git clone git://src.adamsgaard.dk/plan9port
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 3d038c325b6c5ac906092c81d282afa5bfefabc6
(DIR) parent 0b10ae3815e71a7125b29ae5ae71479549619cdc
(HTM) Author: rsc <devnull@localhost>
Date: Fri, 31 Mar 2006 17:51:10 +0000
utf in subject
Diffstat:
M src/cmd/upas/marshal/marshal.c | 54 ++++++++++++++++++++++++++++++-
1 file changed, 53 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/src/cmd/upas/marshal/marshal.c b/src/cmd/upas/marshal/marshal.c
t@@ -134,6 +134,8 @@ void freealiases(Alias*);
int doublequote(Fmt*);
int mountmail(void);
int nprocexec;
+int rfc2047fmt(Fmt*);
+char* mksubject(char*);
int rflag, lbflag, xflag, holding, nflag, Fflag, eightflag, dflag;
int pgpflag = 0;
t@@ -207,6 +209,7 @@ threadmain(int argc, char **argv)
quotefmtinstall();
fmtinstall('Z', doublequote);
+ fmtinstall('U', rfc2047fmt);
threadwaitchan();
ARGBEGIN{
t@@ -487,7 +490,10 @@ readheaders(Biobuf *in, int *fp, String **sp, Addr **top, int strict)
break;
}
}
- if(top==nil || hdrtype!=Hbcc){
+ if(hdrtype == Hsubject){
+ s_append(s, mksubject(s_to_c(sline)));
+ s_append(s, "\n");
+ }else if(top==nil || hdrtype!=Hbcc){
s_append(s, s_to_c(sline));
s_append(s, "\n");
}
t@@ -1865,3 +1871,49 @@ mountmail(void)
return -1;
return 0;
}
+
+int
+rfc2047fmt(Fmt *fmt)
+{
+ char *s, *p;
+
+ s = va_arg(fmt->args, char*);
+ if(s == nil)
+ return fmtstrcpy(fmt, "");
+ for(p=s; *p; p++)
+ if((uchar)*p >= 0x80)
+ goto hard;
+ return fmtstrcpy(fmt, s);
+
+hard:
+ fmtprint(fmt, "=?utf-8?q?");
+ for(p=s; *p; p++){
+ if(*p == ' ')
+ fmtrune(fmt, '_');
+ else if(*p == '_' || *p == '\t' || *p == '=' || *p == '?' || (uchar)*p >= 0x80)
+ fmtprint(fmt, "=%.2uX", (uchar)*p);
+ else
+ fmtrune(fmt, (uchar)*p);
+ }
+ fmtprint(fmt, "?=");
+ return 0;
+}
+
+char*
+mksubject(char *line)
+{
+ char *p, *q;
+ static char buf[1024];
+
+ p = strchr(line, ':')+1;
+ while(*p == ' ')
+ p++;
+ for(q=p; *q; q++)
+ if((uchar)*q >= 0x80)
+ goto hard;
+ return line;
+
+hard:
+ snprint(buf, sizeof buf, "Subject: %U", p);
+ return buf;
+}