#include "imap4d.h"
int
Ffmt(Fmt *f)
{
char *s, buf[128], buf2[128];
s = va_arg(f->args, char*);
if(strncmp("/imap", s, 5) && strncmp("/pop", s, 4)){
snprint(buf, sizeof buf, "/mail/box/%s/%s", username, s);
s = buf;
}
snprint(buf2, sizeof buf2, "%q", s);
return fmtstrcpy(f, buf2);
}
enum {
Qok = 0,
Qquote = 1<<0,
Qbackslash = 1<<1,
Qliteral = 1<<2,
};
static int
needtoquote(Rune r)
{
if(r >= 0x7f || r == '\n' || r == '\r')
return Qliteral;
if(r <= ' ')
return Qquote;
if(r == '\\' || r == '"')
return Qbackslash;
return Qok;
}
int
Zfmt(Fmt *f)
{
char *s, *t, buf[Pathlen], buf2[Pathlen];
int w, quotes, alt;
Rune r;
s = va_arg(f->args, char*);
alt = f->flags & FmtSharp;
if(s == 0 && !alt)
return fmtstrcpy(f, "NIL");
if(s == 0 || *s == 0)
return fmtstrcpy(f, "\"\"");
switch(f->r){
case 'Y':
s = decfs(buf, sizeof buf, s);
s = encmutf7(buf2, sizeof buf2, s);
break;
}
quotes = 0;
for(t = s; *t; t += w){
w = chartorune(&r, t);
quotes |= needtoquote(r);
if(quotes & Qliteral && alt)
ilog("[%s] bad at [%s] %.2ux\n", s, t, r);
}
if(alt){
if(!quotes)
return fmtstrcpy(f, s);
if(quotes & Qliteral)
return fmtstrcpy(f, "GOK");
}else if(quotes & Qliteral)
return fmtprint(f, "{%lud}\r\n%s", strlen(s), s);
fmtrune(f, '"');
for(t = s; *t; t += w){
w = chartorune(&r, t);
if(needtoquote(r) == Qbackslash)
fmtrune(f, '\\');
fmtrune(f, r);
}
return fmtrune(f, '"');
}
int
Xfmt(Fmt *f)
{
char *s, buf[Pathlen], buf2[Pathlen];
s = va_arg(f->args, char*);
if(s == 0)
return fmtstrcpy(f, "NIL");
s = decmutf7(buf2, sizeof buf2, s);
cleanname(s);
return fmtstrcpy(f, encfs(buf, sizeof buf, s));
}
static char *day[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
};
static char *mon[] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
int
Dfmt(Fmt *f)
{
char buf[128], *p, *e, *sgn, *fmt;
int off;
Tm *tm;
tm = va_arg(f->args, Tm*);
if(tm == nil)
tm = localtime(time(0));
sgn = "+";
if(tm->tzoff < 0)
sgn = "";
e = buf + sizeof buf;
p = buf;
off = (tm->tzoff/3600)*100 + (tm->tzoff/60)%60;
if((f->flags & FmtSharp) == 0){
/* rfc822 style */
fmt = "%.2d %s %.4d %.2d:%.2d:%.2d %s%.4d";
p = seprint(p, e, "%s, ", day[tm->wday]);
}else
fmt = "%2d-%s-%.4d %2.2d:%2.2d:%2.2d %s%4.4d";
seprint(p, e, fmt,
tm->mday, mon[tm->mon], tm->year + 1900, tm->hour, tm->min, tm->sec,
sgn, off);
if(f->r == L'δ')
fmtprint(f, "%s", buf);
return fmtprint(f, "%Z", buf);
}
|