1implement Date; 2 3include "sys.m"; 4 sys: Sys; 5 6include "draw.m"; 7include "daytime.m"; 8include "arg.m"; 9 10Date: module 11{ 12 init: fn(ctxt: ref Draw->Context, argv: list of string); 13}; 14 15usage() 16{ 17 sys->fprint(sys->fildes(2), "usage: date [-un] [seconds]\n"); 18 raise "fail:usage"; 19} 20 21nomod(m: string) 22{ 23 sys->fprint(sys->fildes(2), "date: cannot load %s: %r", m); 24 raise "fail:load"; 25} 26 27init(nil: ref Draw->Context, argv: list of string) 28{ 29 sys = load Sys Sys->PATH; 30 daytime := load Daytime Daytime->PATH; 31 if (daytime == nil) 32 nomod(Daytime->PATH); 33 arg := load Arg Arg->PATH; 34 if (arg == nil) 35 nomod(Arg->PATH); 36 nflag := uflag := 0; 37 arg->init(argv); 38 while ((opt := arg->opt()) != 0) { 39 case opt { 40 'n' => 41 nflag = 1; 42 'u' => 43 uflag = 1; 44 * => 45 usage(); 46 } 47 } 48 argv = arg->argv(); 49 arg = nil; 50 if (argv != nil && (tl argv != nil || !isnumeric(hd argv))) 51 usage(); 52 now: int; 53 if (argv != nil) 54 now = int hd argv; 55 else 56 now = daytime->now(); 57 if (nflag) 58 sys->print("%d\n", now); 59 else if (uflag) 60 sys->print("%s\n", daytime->text(daytime->gmt(now))); 61 else 62 sys->print("%s\n", daytime->text(daytime->local(now))); 63} 64 65isnumeric(s: string): int 66{ 67 for (i := 0; i < len s; i++) 68 if (s[i] < '0' || s[i] > '9') 69 return 0; 70 return 1; 71} 72