summaryrefslogtreecommitdiff
path: root/appl/cmd/date.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd/date.b')
-rw-r--r--appl/cmd/date.b71
1 files changed, 71 insertions, 0 deletions
diff --git a/appl/cmd/date.b b/appl/cmd/date.b
new file mode 100644
index 00000000..83068e0d
--- /dev/null
+++ b/appl/cmd/date.b
@@ -0,0 +1,71 @@
+implement Date;
+
+include "sys.m";
+ sys: Sys;
+
+include "draw.m";
+include "daytime.m";
+include "arg.m";
+
+Date: module
+{
+ init: fn(ctxt: ref Draw->Context, argv: list of string);
+};
+
+usage()
+{
+ sys->fprint(sys->fildes(2), "usage: date [-un] [seconds]\n");
+ raise "fail:usage";
+}
+
+nomod(m: string)
+{
+ sys->fprint(sys->fildes(2), "date: cannot load %s: %r", m);
+ raise "fail:load";
+}
+
+init(nil: ref Draw->Context, argv: list of string)
+{
+ sys = load Sys Sys->PATH;
+ daytime := load Daytime Daytime->PATH;
+ if (daytime == nil)
+ nomod(Daytime->PATH);
+ arg := load Arg Arg->PATH;
+ if (arg == nil)
+ nomod(Arg->PATH);
+ nflag := uflag := 0;
+ arg->init(argv);
+ while ((opt := arg->opt()) != 0) {
+ case opt {
+ 'n' =>
+ nflag = 1;
+ 'u' =>
+ uflag = 1;
+ * =>
+ usage();
+ }
+ }
+ argv = arg->argv();
+ arg = nil;
+ if (argv != nil && (tl argv != nil || !isnumeric(hd argv)))
+ usage();
+ now: int;
+ if (argv != nil)
+ now = int hd argv;
+ else
+ now = daytime->now();
+ if (nflag)
+ sys->print("%d\n", now);
+ else if (uflag)
+ sys->print("%s\n", daytime->text(daytime->gmt(now)));
+ else
+ sys->print("%s\n", daytime->text(daytime->local(now)));
+}
+
+isnumeric(s: string): int
+{
+ for (i := 0; i < len s; i++)
+ if (s[i] < '0' || s[i] > '9')
+ return 0;
+ return 1;
+}