180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include <ctype.h>
480ee5cbfSDavid du Colombier
580ee5cbfSDavid du Colombier static char*
skiptext(char * q)680ee5cbfSDavid du Colombier skiptext(char *q)
780ee5cbfSDavid du Colombier {
880ee5cbfSDavid du Colombier while(*q!='\0' && *q!=' ' && *q!='\t' && *q!='\r' && *q!='\n')
980ee5cbfSDavid du Colombier q++;
1080ee5cbfSDavid du Colombier return q;
1180ee5cbfSDavid du Colombier }
1280ee5cbfSDavid du Colombier
1380ee5cbfSDavid du Colombier static char*
skipwhite(char * q)1480ee5cbfSDavid du Colombier skipwhite(char *q)
1580ee5cbfSDavid du Colombier {
1680ee5cbfSDavid du Colombier while(*q==' ' || *q=='\t' || *q=='\r' || *q=='\n')
1780ee5cbfSDavid du Colombier q++;
1880ee5cbfSDavid du Colombier return q;
1980ee5cbfSDavid du Colombier }
2080ee5cbfSDavid du Colombier
2180ee5cbfSDavid du Colombier static char* months[] = {
2280ee5cbfSDavid du Colombier "jan", "feb", "mar", "apr",
2380ee5cbfSDavid du Colombier "may", "jun", "jul", "aug",
2480ee5cbfSDavid du Colombier "sep", "oct", "nov", "dec"
2580ee5cbfSDavid du Colombier };
2680ee5cbfSDavid du Colombier
2780ee5cbfSDavid du Colombier static int
strcmplwr(char * a,char * b,int n)2880ee5cbfSDavid du Colombier strcmplwr(char *a, char *b, int n)
2980ee5cbfSDavid du Colombier {
3080ee5cbfSDavid du Colombier char *eb;
3180ee5cbfSDavid du Colombier
3280ee5cbfSDavid du Colombier eb = b+n;
3380ee5cbfSDavid du Colombier while(*a && *b && b<eb){
3480ee5cbfSDavid du Colombier if(tolower(*a) != tolower(*b))
3580ee5cbfSDavid du Colombier return 1;
3680ee5cbfSDavid du Colombier a++;
3780ee5cbfSDavid du Colombier b++;
3880ee5cbfSDavid du Colombier }
3980ee5cbfSDavid du Colombier if(b==eb)
4080ee5cbfSDavid du Colombier return 0;
4180ee5cbfSDavid du Colombier return *a != *b;
4280ee5cbfSDavid du Colombier }
4380ee5cbfSDavid du Colombier
4480ee5cbfSDavid du Colombier int
strtotm(char * p,Tm * tmp)4580ee5cbfSDavid du Colombier strtotm(char *p, Tm *tmp)
4680ee5cbfSDavid du Colombier {
4780ee5cbfSDavid du Colombier char *q, *r;
4880ee5cbfSDavid du Colombier int j;
4980ee5cbfSDavid du Colombier Tm tm;
50d9306527SDavid du Colombier int delta;
5180ee5cbfSDavid du Colombier
52d9306527SDavid du Colombier delta = 0;
5380ee5cbfSDavid du Colombier memset(&tm, 0, sizeof(tm));
5480ee5cbfSDavid du Colombier tm.mon = -1;
5580ee5cbfSDavid du Colombier tm.hour = -1;
5680ee5cbfSDavid du Colombier tm.min = -1;
5780ee5cbfSDavid du Colombier tm.year = -1;
5880ee5cbfSDavid du Colombier tm.mday = -1;
5980ee5cbfSDavid du Colombier for(p=skipwhite(p); *p; p=skipwhite(q)){
6080ee5cbfSDavid du Colombier q = skiptext(p);
6180ee5cbfSDavid du Colombier
6280ee5cbfSDavid du Colombier /* look for time in hh:mm[:ss] */
6380ee5cbfSDavid du Colombier if(r = memchr(p, ':', q-p)){
6480ee5cbfSDavid du Colombier tm.hour = strtol(p, 0, 10);
6580ee5cbfSDavid du Colombier tm.min = strtol(r+1, 0, 10);
6680ee5cbfSDavid du Colombier if(r = memchr(r+1, ':', q-(r+1)))
6780ee5cbfSDavid du Colombier tm.sec = strtol(r+1, 0, 10);
6880ee5cbfSDavid du Colombier else
6980ee5cbfSDavid du Colombier tm.sec = 0;
7080ee5cbfSDavid du Colombier continue;
7180ee5cbfSDavid du Colombier }
7280ee5cbfSDavid du Colombier
7380ee5cbfSDavid du Colombier /* look for month */
7480ee5cbfSDavid du Colombier for(j=0; j<12; j++)
7580ee5cbfSDavid du Colombier if(strcmplwr(p, months[j], 3)==0){
7680ee5cbfSDavid du Colombier tm.mon = j;
7780ee5cbfSDavid du Colombier break;
7880ee5cbfSDavid du Colombier }
7980ee5cbfSDavid du Colombier
8080ee5cbfSDavid du Colombier if(j!=12)
8180ee5cbfSDavid du Colombier continue;
8280ee5cbfSDavid du Colombier
8380ee5cbfSDavid du Colombier /* look for time zone [A-Z][A-Z]T */
8480ee5cbfSDavid du Colombier if(q-p==3 && 'A' <= p[0] && p[0] <= 'Z'
8580ee5cbfSDavid du Colombier && 'A' <= p[1] && p[1] <= 'Z' && p[2] == 'T'){
8680ee5cbfSDavid du Colombier strecpy(tm.zone, tm.zone+4, p);
8780ee5cbfSDavid du Colombier continue;
8880ee5cbfSDavid du Colombier }
8980ee5cbfSDavid du Colombier
90d9306527SDavid du Colombier if(p[0]=='+'||p[0]=='-')
91d9306527SDavid du Colombier if(q-p==5 && strspn(p+1, "0123456789") == 4){
92d9306527SDavid du Colombier delta = (((p[1]-'0')*10+p[2]-'0')*60+(p[3]-'0')*10+p[4]-'0')*60;
93d9306527SDavid du Colombier if(p[0] == '-')
94d9306527SDavid du Colombier delta = -delta;
95d9306527SDavid du Colombier continue;
96d9306527SDavid du Colombier }
9780ee5cbfSDavid du Colombier if(strspn(p, "0123456789") == q-p){
98*106486e8SDavid du Colombier j = strtol(p, nil, 10);
9980ee5cbfSDavid du Colombier if(1 <= j && j <= 31)
10080ee5cbfSDavid du Colombier tm.mday = j;
10180ee5cbfSDavid du Colombier if(j >= 1900)
10280ee5cbfSDavid du Colombier tm.year = j-1900;
10380ee5cbfSDavid du Colombier }
10480ee5cbfSDavid du Colombier }
10580ee5cbfSDavid du Colombier
10680ee5cbfSDavid du Colombier if(tm.mon<0 || tm.year<0
10780ee5cbfSDavid du Colombier || tm.hour<0 || tm.min<0
10880ee5cbfSDavid du Colombier || tm.mday<0)
10980ee5cbfSDavid du Colombier return -1;
11080ee5cbfSDavid du Colombier
111d9306527SDavid du Colombier *tmp = *localtime(tm2sec(&tm)-delta);
11280ee5cbfSDavid du Colombier return 0;
11380ee5cbfSDavid du Colombier }
114