114 lines
1.9 KiB
C
114 lines
1.9 KiB
C
![]() |
#include <u.h>
|
||
|
#include <libc.h>
|
||
|
#include <ctype.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"
|
||
|
};
|
||
|
|
||
|
static int
|
||
|
strcmplwr(char *a, char *b, int n)
|
||
|
{
|
||
|
char *eb;
|
||
|
|
||
|
eb = b+n;
|
||
|
while(*a && *b && b<eb){
|
||
|
if(tolower(*a) != tolower(*b))
|
||
|
return 1;
|
||
|
a++;
|
||
|
b++;
|
||
|
}
|
||
|
if(b==eb)
|
||
|
return 0;
|
||
|
return *a != *b;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
strtotm(char *p, Tm *tmp)
|
||
|
{
|
||
|
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;
|
||
|
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(strcmplwr(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 && 'A' <= p[0] && p[0] <= 'Z'
|
||
|
&& 'A' <= p[1] && p[1] <= 'Z' && 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(1 <= j && j <= 31)
|
||
|
tm.mday = j;
|
||
|
if(j >= 1900)
|
||
|
tm.year = j-1900;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(tm.mon<0 || tm.year<0
|
||
|
|| tm.hour<0 || tm.min<0
|
||
|
|| tm.mday<0)
|
||
|
return -1;
|
||
|
|
||
|
*tmp = *localtime(tm2sec(&tm)-delta);
|
||
|
return 0;
|
||
|
}
|