xref: /inferno-os/appl/cmd/date.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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