implement Datefmt; include "sys.m"; sys: Sys; include "draw.m"; include "daytime.m"; daytime: Daytime; include "arg.m"; arg: Arg; Datefmt: module { init: fn(ctxt: ref Draw->Context, argv: list of string); }; usage() { sys->fprint(sys->fildes(2), "usage: %s [-t seconds] format", arg->progname()); } init(nil: ref Draw->Context, argv: list of string) { sys = load Sys Sys->PATH; daytime = load Daytime Daytime->PATH; arg = load Arg Arg->PATH; now := daytime->now(); arg->init(argv); while((opt := arg->opt()) != 0) case opt { 't' => now = int arg->arg(); * => usage(); } argv = arg->argv(); if (len argv != 1) usage(); t := daytime->local(now); sys->print("%s", format_t(hd argv, t)); } format_t(format: string, t: ref daytime->Tm): string { outb: string; j: int; for (i := 0; i < len format; i++) { if(format[i] != '%') outb=outb+sys->sprint("%c", format[i]); else case format[++i] { # There's a lot of these. I've started with what seems to be the most useful, # plus some unix common extensions, plus some new extensions. # C89: aAbBc d HIj mM p S U wWxXyY Z% # here: dD F HIj mMn prR StTu w yYzZ% α # OS X: aAbBcCdDeEFgGhHIjklmMnOprRsStTuUvVwWxXyYzZ%+ # There's no local-dependent stuff here, like OS X's E and O. # Fundamental elements. 'S' => outb+=sys->sprint("%.2d", t.sec); 'M' => outb+=sys->sprint("%.2d", t.min); 'H' => outb+=sys->sprint("%.2d", t.hour); 'd' => outb+=sys->sprint("%.2d", t.mday); 'm' => outb+=sys->sprint("%.2d", t.mon+1); 'y' => outb+=sys->sprint("%.2d", t.year%100); 'Y' => outb+=sys->sprint("%.4d", t.year+1900); 'w' => outb+=sys->sprint("%d", t.wday); 'j' => outb+=sys->sprint("%d", t.yday); 'Z' => outb+=sys->sprint("%s", t.zone); 'z' => outb+=sys->sprint("%d", t.tzoff); # Derived elements. 'D' => outb+=format_t("%m/%d/%y", t); 'F' => outb+=format_t("%Y-%m-%d", t); 'I' => j = t.hour%12; if (j == 0) j=12; outb+=sys->sprint("%.2d", j); 'p' => if (t.hour < 12) outb+="am"; else outb+="pm"; 'R' => outb+=format_t("%H:%M", t); 'r' => outb+=format_t("%I:%M:%S %p", t); 'T' => outb+=format_t("%H:%M:%S", t); 'u' => j =t.wday; if (j == 0) j = 7; outb+=sys->sprint("%d", j); # Non-standard additions. 'α' => outb+=format_t("%Y-%m-%dT%H:%M:%S", t); # Literals and other. '%' => outb+="%"; 'n' => outb+="\n"; 't' => outb+=" "; * => ; } } return outb; }