shithub: riscv

Download patch

ref: 6d3a2e6531bf784d433a39ac93b96beb0a0c8025
parent: 9db78003db1bfc688b8e605ea5f89fc6810f0011
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Aug 10 15:01:45 EDT 2020

date: use new libc date apis.

--- a/sys/src/cmd/date.c
+++ b/sys/src/cmd/date.c
@@ -1,101 +1,68 @@
 #include <u.h>
 #include <libc.h>
 
-static char *day[] = {
-	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
+enum {
+	Nsec = 1000*1000*1000,
 };
 
-static char *mon[] = {
-	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
-	"Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-int uflg, nflg, iflg, tflg, mflg;
-
-char*
-isodate(Tm *t)
+void
+usage(void)
 {
-	static char c[26]; /* leave room to append isotime */
-	snprint(c, 11, "%04d-%02d-%02d", 
-		t->year + 1900, t->mon + 1, t->mday);
-	return c;
+	fprint(2, "usage: date [-itunm] [-f fmt] [seconds]\n");
+	exits("usage");
 }
 
-char*
-isotime(Tm *t)
-{
-	int tz;
-	char *c, *d;
-	d = isodate(t);
-	c = d+10;
-	snprint(c, 10, "T%02d:%02d:%02d",
-		t->hour, t->min, t->sec); /* append to isodate */
-	tz = t->tzoff / 60;
-	if(t->tzoff) {
-		/* localtime */
-		if (t->tzoff > 0) {
-			c[9] = '+';
-		} else {
-			c[9] = '-';
-			tz = -tz;
-		}
-		snprint(c+10, 6, "%02d:%02d", tz / 60, tz % 60);
-	} else {
-		c[9] = 'Z';
-		c[10] = 0;
-	}
-	return d;
-}
-
-char *
-mailtime(Tm *t)
-{
-	static char c[64];
-	char *sgn;
-	int off;
-
-	sgn = "+";
-	if(t->tzoff < 0)
-		sgn = "";
-	off = (t->tzoff/3600)*100 + (t->tzoff/60)%60;
-	snprint(c, sizeof(c), "%s, %.2d %s %.4d %.2d:%.2d:%.2d %s%.4d",
-		day[t->wday], t->mday, mon[t->mon], t->year + 1900,
-		t->hour, t->min, t->sec, sgn, off);
-	return c;
-}
-
 void
 main(int argc, char *argv[])
 {
-	ulong now;
-	Tm *tm;
+	int nflg, uflg;
+	char *fmt;
+	vlong s, ns;
+	Tzone *tz;
+	Tm tm;
+
+	nflg = 0;
+	uflg = 0;
+	tz = nil;
+	fmt =  "WW MMM _D hh:mm:ss ZZZ YYYY";
+	tmfmtinstall();
+
 	ARGBEGIN{
-	case 'n':	nflg = 1; break;
-	case 'u':	uflg = 1; break;
-	case 't':	tflg = 1; /* implies -i */
-	case 'i':	iflg = 1; break;
-	case 'm':	mflg = 1; break;
-	default:	fprint(2, "usage: date [-itunm] [seconds]\n"); exits("usage");
+	case 'n':	nflg = 1;				break;
+	case 'u':	uflg = 1;				break;
+	case 't':	fmt = "YYYY-MM-DDThh:mm:ssZZ";		break;
+	case 'i':	fmt = "YYYY-MM-DD";			break;
+	case 'm':	fmt = "WW, DD MMM YYYY hh:mm:ss Z";	break;
+	case 'f':	fmt = EARGF(usage());			break;
+	default:	usage();
 	}ARGEND
 
-	if(argc == 1)
-		now = strtoul(*argv, 0, 0);
-	else
-		now = time(0);
+	s = 0;
+	ns = 0;
+	switch(argc) {
+	case 0:
+		ns = nsec();
+		s = ns/Nsec;
+		ns = ns%Nsec;
+		break;
+	case 1:
+		s = strtoll(argv[0], nil, 0);
+		ns = 0;
+		break;
+	default:
+		usage();
+		break;
+	}
 
+	if(!uflg && (tz = tzload("local")) == nil)
+		sysfatal("timezone: %r");
+	if(tmtimens(&tm, s, ns, tz) == nil)
+		sysfatal("now: %r");
+
 	if(nflg)
-		print("%ld\n", now);
-	else {
-		tm = uflg ? gmtime(now) : localtime(now);
-		if(iflg) {
-			if(tflg)
-				print("%s\n", isotime(tm));
-			else
-				print("%s\n", isodate(tm));
-		} else if(mflg)
-			print("%s\n", mailtime(tm));
-		else
-			print("%s", asctime(tm));
-	}
+		print("%lld\n", tmnorm(&tm));
+	else
+		if(print("%τ\n", tmfmt(&tm, fmt)) == -1)
+			sysfatal("%r");
 	exits(0);
 }