ref: e0278f69176765b408be4f29e6f3e5d39b928601
parent: e9cd41467e5598d5c61bd04bf52d96ccd75472ca
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Sep 1 15:03:17 EDT 2020
seconds: tolerate trailing whitespace in dates This allows handling dates with leading and trailing whitespace, including newlines.
--- a/sys/src/cmd/seconds.c
+++ b/sys/src/cmd/seconds.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <ctype.h>
char *knownfmt[] = {
/* asctime */
@@ -57,6 +58,16 @@
nil,
};
+static int
+nojunk(char *p)
+{
+ while(isspace(*p))
+ p++;
+ if(*p == '\0')
+ return 1;
+ werrstr("trailing junk");
+ return 0;
+}
static void
usage(void)
@@ -89,24 +100,21 @@
sysfatal("bad local time: %r");
for(i = 0; i < argc; i++){
if(fmt != nil){
- if(tmparse(&tm, fmt, argv[i], tz, &ep) != nil && *ep == 0)
+ if(tmparse(&tm, fmt, argv[i], tz, &ep) && nojunk(ep))
goto Found;
}else{
for(f = knownfmt; *f != nil; f++)
- if(tmparse(&tm, *f, argv[i], tz, &ep) != nil && *ep == 0)
+ if(tmparse(&tm, *f, argv[i], tz, &ep) != nil && nojunk(ep))
goto Found;
for(df = datefmt; *df; df++)
for(tf = timefmt; *tf; tf++)
for(zf = zonefmt; *zf; zf++){
snprint(buf, sizeof(buf), "%s%s%s", *df, *tf, *zf);
- if(tmparse(&tm, buf, argv[i], tz, &ep) != nil && *ep == 0)
+ if(tmparse(&tm, buf, argv[i], tz, &ep) != nil && nojunk(ep))
goto Found;
}
}
- if(*ep == 0)
- sysfatal("tmparse: %r");
- else
- sysfatal("tmparse: trailing junk");
+ sysfatal("tmparse: %r");
Found:
print("%lld\n", tmnorm(&tm));
}