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.
This commit is contained in:
parent
26ac80481d
commit
b7b077375f
1 changed files with 23 additions and 62 deletions
|
@ -140,69 +140,30 @@ getline(char *buf, int n)
|
||||||
return buf;
|
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)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
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:
|
|
||||||
return time(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong
|
ulong
|
||||||
parsedate(char *s)
|
parsedate(char *s)
|
||||||
{
|
{
|
||||||
char *f[10];
|
char **f, *fmt[] = {
|
||||||
int nf;
|
"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;
|
||||||
|
|
||||||
nf = getfields(s, f, nelem(f), 1, " ");
|
for(f = fmt; *f; f++)
|
||||||
if(nf < 6)
|
if(tmparse(&tm, *f, s, nil, nil) != nil)
|
||||||
return time(0);
|
return tmnorm(&tm);
|
||||||
return parsedatev(f);
|
return time(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 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 */
|
||||||
|
@ -210,11 +171,11 @@ parsedate(char *s)
|
||||||
int
|
int
|
||||||
parselog(char *s, char **sender, ulong *xtime)
|
parselog(char *s, char **sender, ulong *xtime)
|
||||||
{
|
{
|
||||||
char *f[20];
|
char *f[8];
|
||||||
int nf;
|
int nf;
|
||||||
|
|
||||||
nf = getfields(s, f, nelem(f), 1, " ");
|
nf = getfields(s, f, nelem(f), 1, " ");
|
||||||
if(nf < 14)
|
if(nf < 8)
|
||||||
return 0;
|
return 0;
|
||||||
if(strcmp(f[4], "delivered") == 0 && strcmp(f[5], user) == 0)
|
if(strcmp(f[4], "delivered") == 0 && strcmp(f[5], user) == 0)
|
||||||
goto Found;
|
goto Found;
|
||||||
|
@ -224,7 +185,7 @@ parselog(char *s, char **sender, ulong *xtime)
|
||||||
|
|
||||||
Found:
|
Found:
|
||||||
*sender = estrdup(f[7]);
|
*sender = estrdup(f[7]);
|
||||||
*xtime = parsedatev(&f[8]);
|
*xtime = parsedate(f[8]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue