diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-08-09 19:46:38 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-08-09 19:46:38 -0700 |
commit | e702cfcafdc06ea23134bb44a99a90634d4f7d97 (patch) | |
tree | 59c2e3557eb998d1aebb8701c9dce6e5bd741a05 /sys/src/cmd/upas/fs | |
parent | 9d446410c5681235894f65d4e9c503fe4ad8b4a1 (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.c | 11 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/strtotm.c | 113 |
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; } |