9front - general discussion about 9front
 help / color / mirror / Atom feed
* date(1) cleanup
@ 2020-06-14 18:25 ori
  2020-06-14 21:46 ` [9front] " sirjofri
  0 siblings, 1 reply; 3+ messages in thread
From: ori @ 2020-06-14 18:25 UTC (permalink / raw)
  To: 9front

Simplify using tmdate(2). Also add '-f' for custom formats,
since it costs almost nothing.

diff -r b07da9e4e4d2 sys/man/1/date
--- a/sys/man/1/date	Sun Jun 14 09:33:32 2020 -0700
+++ b/sys/man/1/date	Sun Jun 14 11:23:56 2020 -0700
@@ -4,8 +4,12 @@
 .SH SYNOPSIS
 .B date
 [
-.I option
-] [
+.I -u
+]
+[
+.I -nitm | -f fmt
+]
+[
 .I seconds
 ]
 .br
@@ -33,6 +37,12 @@
 .TP
 .B -m
 Report the date as an email compatible (RFC2822) time stamp.
+.TP
+.B -f
+.I fmt
+Report the date using a
+.IR tmdate (1)
+compatible format.
 .PP
 The conversion from Greenwich Mean Time to local time depends on the
 .B $timezone
diff -r b07da9e4e4d2 sys/src/cmd/date.c
--- a/sys/src/cmd/date.c	Sun Jun 14 09:33:32 2020 -0700
+++ b/sys/src/cmd/date.c	Sun Jun 14 11:23:56 2020 -0700
@@ -1,101 +1,57 @@
 #include <u.h>
 #include <libc.h>
 
-static char *day[] = {
-	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
-};
-
-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;
-}
-
-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;
+	fprint(2, "usage: date [-itunm] [seconds]\n");
+	exits("usage");
 }
 
 void
 main(int argc, char *argv[])
 {
-	ulong now;
-	Tm *tm;
+	char *fmt;
+	vlong now;
+	Tzone *tz;
+	Tm tm;
+
+	now = 0;
+	tz = nil;
+	fmt =  "W 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 = "W, 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
+	switch(argc) {
+	case 0:
 		now = time(0);
+		break;
+	case 1:
+		now = strtoll(argv[0], nil, 0);
+		break;
+	default:
+		usage();
+		break;
+	}
+
+	if(!uflg && (tz = tmgetzone("local")) == nil)
+		sysfatal("timezone: %r");
+	if(tmtime(&tm, now, 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", tm.abs);
+	else
+		if(print("%τ\n", tmfmt(&tm, fmt)) == -1)
+			sysfatal("%r");
 	exits(0);
 }



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9front] date(1) cleanup
  2020-06-14 18:25 date(1) cleanup ori
@ 2020-06-14 21:46 ` sirjofri
  2020-06-15  6:04   ` ori
  0 siblings, 1 reply; 3+ messages in thread
From: sirjofri @ 2020-06-14 21:46 UTC (permalink / raw)
  To: 9front

Hello,

I think I found some typo in this diff:

Isn't it tmdate(2) instead of tmdate(1)?

Also I can't find the -f flag in the usage output.

Haven't applied the patch yet, I'm only looking at the diff.

Thank you
sirjofri


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [9front] date(1) cleanup
  2020-06-14 21:46 ` [9front] " sirjofri
@ 2020-06-15  6:04   ` ori
  0 siblings, 0 replies; 3+ messages in thread
From: ori @ 2020-06-15  6:04 UTC (permalink / raw)
  To: sirjofri, 9front

> Hello,
> 
> I think I found some typo in this diff:
> 
> Isn't it tmdate(2) instead of tmdate(1)?
> 
> Also I can't find the -f flag in the usage output.
> 
> Haven't applied the patch yet, I'm only looking at the diff.
> 
> Thank you
> sirjofri

Thanks, updated:

diff -r 6055167dc76a sys/man/1/date
--- a/sys/man/1/date	Mon Jun 15 00:12:57 2020 +0200
+++ b/sys/man/1/date	Sun Jun 14 23:03:49 2020 -0700
@@ -4,8 +4,12 @@
 .SH SYNOPSIS
 .B date
 [
-.I option
-] [
+.I -u
+]
+[
+.I -nitm | -f fmt
+]
+[
 .I seconds
 ]
 .br
@@ -33,6 +37,12 @@
 .TP
 .B -m
 Report the date as an email compatible (RFC2822) time stamp.
+.TP
+.B -f
+.I fmt
+Report the date using a
+.IR tmdate (2)
+compatible format.
 .PP
 The conversion from Greenwich Mean Time to local time depends on the
 .B $timezone
diff -r 6055167dc76a sys/src/cmd/date.c
--- a/sys/src/cmd/date.c	Mon Jun 15 00:12:57 2020 +0200
+++ b/sys/src/cmd/date.c	Sun Jun 14 23:03:49 2020 -0700
@@ -1,101 +1,60 @@
 #include <u.h>
 #include <libc.h>
 
-static char *day[] = {
-	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
-};
-
-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;
-}
-
-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;
+	fprint(2, "usage: date [-itunm] [-f fmt] [seconds]\n");
+	exits("usage");
 }
 
 void
 main(int argc, char *argv[])
 {
-	ulong now;
-	Tm *tm;
+	int nflg, uflg;
+	char *fmt;
+	vlong now;
+	Tzone *tz;
+	Tm tm;
+
+	now = 0;
+	nflg = 0;
+	uflg = 0;
+	tz = nil;
+	fmt =  "W 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 = "W, 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
+	switch(argc) {
+	case 0:
 		now = time(0);
+		break;
+	case 1:
+		now = strtoll(argv[0], nil, 0);
+		break;
+	default:
+		usage();
+		break;
+	}
+
+	if(!uflg && (tz = tmgetzone("local")) == nil)
+		sysfatal("timezone: %r");
+	if(tmtime(&tm, now, 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", tm.abs);
+	else
+		if(print("%τ\n", tmfmt(&tm, fmt)) == -1)
+			sysfatal("%r");
 	exits(0);
 }



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-06-15  6:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-14 18:25 date(1) cleanup ori
2020-06-14 21:46 ` [9front] " sirjofri
2020-06-15  6:04   ` ori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).