shithub: riscv

Download patch

ref: b7b077375fbb2cd99ca14b95545f111f47a30ca0
parent: 26ac80481d9e6e8abb359254f477bfad42fdc4ad
author: Ori Bernstein <ori@eigenstate.org>
date: Thu Aug 27 06:32:02 EDT 2020

faces(1): remove bespoke date parser

In addition to being more code, this date parser would
treat local times as local, but anything that wasn't a
local time would get parsed as gmt, due to a quirk of
how tm2sec used to work.

This moves the code to tmparse, and fixes timezone parsing
at the same time.

--- a/sys/src/cmd/faces/plumb.c
+++ b/sys/src/cmd/faces/plumb.c
@@ -140,81 +140,42 @@
 	return buf;
 }
 
-static char* months[] = {
-	"jan", "feb", "mar", "apr",
-	"may", "jun", "jul", "aug", 
-	"sep", "oct", "nov", "dec"
-};
-
-static int
-getmon(char *s)
-{
-	int i;
-
-	for(i=0; i<nelem(months); i++)
-		if(cistrcmp(months[i], s) == 0)
-			return i;
-	return -1;
-}
-
-/* Fri Jul 23 14:05:14 EDT 1999 */
 ulong
-parsedatev(char **a)
+parsedate(char *s)
 {
-	char *p;
+	char **f, *fmt[] = {
+		"WW MMM DD hh:mm:ss ?Z YYYY",
+		"?WW ?DD ?MMM ?YYYY hh:mm:ss ?Z",
+		"?WW ?DD ?MMM ?YYYY hh:mm:ss",
+		"?WW, DD-?MM-YY",
+		"?DD ?MMM ?YYYY hh:mm:ss ?Z",
+		"?DD ?MMM ?YYYY hh:mm:ss",
+		"?DD-?MM-YY hh:mm:ss ?Z",
+		"?DD-?MM-YY hh:mm:ss",
+		"?DD-?MM-YY",
+		"?MMM/?DD/?YYYY hh:mm:ss ?Z",
+		"?MMM/?DD/?YYYY hh:mm:ss",
+		"?MMM/?DD/?YYYY",
+		nil,
+	};
 	Tm tm;
 
-	memset(&tm, 0, sizeof tm);
-	if((tm.mon=getmon(a[1])) == -1)
-		goto Err;
-	tm.mday = strtol(a[2], &p, 10);
-	if(*p != '\0')
-		goto Err;
-	tm.hour = strtol(a[3], &p, 10);
-	if(*p != ':')
-		goto Err;
-	tm.min = strtol(p+1, &p, 10);
-	if(*p != ':')
-		goto Err;
-	tm.sec = strtol(p+1, &p, 10);
-	if(*p != '\0')
-		goto Err;
-	if(strlen(a[4]) != 3)
-		goto Err;
-	strcpy(tm.zone, a[4]);
-	if(strlen(a[5]) != 4)
-		goto Err;
-	tm.year = strtol(a[5], &p, 10);
-	if(*p != '\0')
-		goto Err;
-	tm.year -= 1900;
-	return tm2sec(&tm);
-Err:
+	for(f = fmt; *f; f++)
+		if(tmparse(&tm, *f, s, nil, nil) != nil)
+			return tmnorm(&tm);
 	return time(0);
 }
 
-ulong
-parsedate(char *s)
-{
-	char *f[10];
-	int nf;
-
-	nf = getfields(s, f, nelem(f), 1, " ");
-	if(nf < 6)
-		return time(0);
-	return parsedatev(f);
-}
-
 /* achille Jul 23 14:05:15 delivered jmk From ms.com!bub Fri Jul 23 14:05:14 EDT 1999 (plan9.bell-labs.com!jmk) 1352 */
 /* achille Oct 26 13:45:42 remote local!rsc From rsc Sat Oct 26 13:45:41 EDT 2002 (rsc) 170 */
 int
 parselog(char *s, char **sender, ulong *xtime)
 {
-	char *f[20];
+	char *f[8];
 	int nf;
 
 	nf = getfields(s, f, nelem(f), 1, " ");
-	if(nf < 14)
+	if(nf < 8)
 		return 0;
 	if(strcmp(f[4], "delivered") == 0 && strcmp(f[5], user) == 0)
 		goto Found;
@@ -224,7 +185,7 @@
 
 Found:
 	*sender = estrdup(f[7]);
-	*xtime = parsedatev(&f[8]);
+	*xtime = parsedate(f[8]);
 	return 1;
 }