summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/fs
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-08-09 19:46:38 -0700
committerOri Bernstein <ori@eigenstate.org>2020-08-09 19:46:38 -0700
commite702cfcafdc06ea23134bb44a99a90634d4f7d97 (patch)
tree59c2e3557eb998d1aebb8701c9dce6e5bd741a05 /sys/src/cmd/upas/fs
parent9d446410c5681235894f65d4e9c503fe4ad8b4a1 (diff)
upas/fs: port date parsing to libc apis
There was a lot of code in upas/fs to deal with dates. Now there isn't.
Diffstat (limited to 'sys/src/cmd/upas/fs')
-rw-r--r--sys/src/cmd/upas/fs/imap.c11
-rw-r--r--sys/src/cmd/upas/fs/strtotm.c113
2 files changed, 25 insertions, 99 deletions
diff --git a/sys/src/cmd/upas/fs/imap.c b/sys/src/cmd/upas/fs/imap.c
index a2f12b366..85d6d810f 100644
--- a/sys/src/cmd/upas/fs/imap.c
+++ b/sys/src/cmd/upas/fs/imap.c
@@ -268,13 +268,10 @@ long
internaltounix(char *s)
{
Tm tm;
- if(strlen(s) < 20 || s[2] != '-' || s[6] != '-')
- return -1;
- s[2] = ' ';
- s[6] = ' ';
- if(strtotm(s, &tm) == -1)
+
+ if(tmparse(&tm, "?DD-?MM-YYYY hh:mm:ss ?Z", s, nil, nil) == nil)
return -1;
- return tm2sec(&tm);
+ return tmnorm(&tm);
}
static char*
@@ -981,7 +978,7 @@ again:
}
if(c < 0){
/* new message */
- idprint(imap, "new: %U (%U)\n", f[i].uid, m? m->imapuid: 0);
+ idprint(imap, "new: %U (%U)\n", f[i].uid, m ? m->imapuid: 0);
if(f[i].sizes == 0 || f[i].sizes > Maxmsg){
idprint(imap, "skipping bad size: %lud\n", f[i].sizes);
i++;
diff --git a/sys/src/cmd/upas/fs/strtotm.c b/sys/src/cmd/upas/fs/strtotm.c
index fc6510f1a..96f60c470 100644
--- a/sys/src/cmd/upas/fs/strtotm.c
+++ b/sys/src/cmd/upas/fs/strtotm.c
@@ -1,98 +1,27 @@
#include <u.h>
#include <libc.h>
-static char*
-skiptext(char *q)
-{
- while(*q != '\0' && *q != ' ' && *q != '\t' && *q != '\r' && *q != '\n')
- q++;
- return q;
-}
-
-static char*
-skipwhite(char *q)
-{
- while(*q == ' ' || *q == '\t' || *q == '\r' || *q == '\n')
- q++;
- return q;
-}
-
-static char* months[] = {
- "jan", "feb", "mar", "apr",
- "may", "jun", "jul", "aug",
- "sep", "oct", "nov", "dec"
-};
-
int
-strtotm(char *p, Tm *t)
+strtotm(char *s, Tm *t)
{
- char *q, *r;
- int j;
- Tm tm;
- int delta;
-
- delta = 0;
- memset(&tm, 0, sizeof(tm));
- tm.mon = -1;
- tm.hour = -1;
- tm.min = -1;
- tm.year = -1;
- tm.mday = -1;
- memcpy(tm.zone, "GMT", 3);
- for(p = skipwhite(p); *p; p = skipwhite(q)){
- q = skiptext(p);
-
- /* look for time in hh:mm[:ss] */
- if(r = memchr(p, ':', q - p)){
- tm.hour = strtol(p, 0, 10);
- tm.min = strtol(r + 1, 0, 10);
- if(r = memchr(r + 1, ':', q - (r + 1)))
- tm.sec = strtol(r + 1, 0, 10);
- else
- tm.sec = 0;
- continue;
- }
-
- /* look for month */
- for(j = 0; j < 12; j++)
- if(cistrncmp(p, months[j], 3) == 0){
- tm.mon = j;
- break;
- }
- if(j != 12)
- continue;
-
- /* look for time zone [A-Z][A-Z]T */
- if(q - p == 3)
- if(p[0] >= 'A' && p[0] <= 'Z')
- if(p[1] >= 'A' && p[1] <= 'Z')
- if(p[2] == 'T'){
- strecpy(tm.zone, tm.zone + 4, p);
- continue;
- }
-
- if(p[0] == '+'||p[0] == '-')
- if(q - p == 5 && strspn(p + 1, "0123456789") == 4){
- delta = (((p[1] - '0')*10 + p[2] - '0')*60 + (p[3] - '0')*10 + p[4] - '0')*60;
- if(p[0] == '-')
- delta = -delta;
- continue;
- }
- if(strspn(p, "0123456789") == q - p){
- j = strtol(p, nil, 10);
- if(j >= 1 && j <= 31)
- tm.mday = j;
- if(j >= 1900)
- tm.year = j - 1900;
- continue;
- }
- //eprint("strtotm: garbage %.*s\n", utfnlen(p, q - p), p);
- }
- if(tm.mon < 0 || tm.year < 0
- || tm.hour < 0 || tm.min < 0
- || tm.mday < 0)
- return -1;
-
- *t = *localtime(tm2sec(&tm) - delta);
- return 0;
+ 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,
+ };
+
+ for(f = fmt; *f; f++)
+ if(tmparse(t, *f, s, nil, nil) != nil)
+ return 0;
+ return -1;
}