Blame


1 5cdb1798 2005-10-29 devnull #include <u.h>
2 5cdb1798 2005-10-29 devnull #include <libc.h>
3 5cdb1798 2005-10-29 devnull #include <ctype.h>
4 5cdb1798 2005-10-29 devnull
5 5cdb1798 2005-10-29 devnull static char*
6 5cdb1798 2005-10-29 devnull skiptext(char *q)
7 5cdb1798 2005-10-29 devnull {
8 5cdb1798 2005-10-29 devnull while(*q!='\0' && *q!=' ' && *q!='\t' && *q!='\r' && *q!='\n')
9 5cdb1798 2005-10-29 devnull q++;
10 5cdb1798 2005-10-29 devnull return q;
11 5cdb1798 2005-10-29 devnull }
12 5cdb1798 2005-10-29 devnull
13 5cdb1798 2005-10-29 devnull static char*
14 5cdb1798 2005-10-29 devnull skipwhite(char *q)
15 5cdb1798 2005-10-29 devnull {
16 5cdb1798 2005-10-29 devnull while(*q==' ' || *q=='\t' || *q=='\r' || *q=='\n')
17 5cdb1798 2005-10-29 devnull q++;
18 5cdb1798 2005-10-29 devnull return q;
19 5cdb1798 2005-10-29 devnull }
20 5cdb1798 2005-10-29 devnull
21 5cdb1798 2005-10-29 devnull static char* months[] = {
22 5cdb1798 2005-10-29 devnull "jan", "feb", "mar", "apr",
23 5cdb1798 2005-10-29 devnull "may", "jun", "jul", "aug",
24 5cdb1798 2005-10-29 devnull "sep", "oct", "nov", "dec"
25 5cdb1798 2005-10-29 devnull };
26 5cdb1798 2005-10-29 devnull
27 5cdb1798 2005-10-29 devnull static int
28 5cdb1798 2005-10-29 devnull strcmplwr(char *a, char *b, int n)
29 5cdb1798 2005-10-29 devnull {
30 5cdb1798 2005-10-29 devnull char *eb;
31 5cdb1798 2005-10-29 devnull
32 5cdb1798 2005-10-29 devnull eb = b+n;
33 5cdb1798 2005-10-29 devnull while(*a && *b && b<eb){
34 5cdb1798 2005-10-29 devnull if(tolower(*a) != tolower(*b))
35 5cdb1798 2005-10-29 devnull return 1;
36 5cdb1798 2005-10-29 devnull a++;
37 5cdb1798 2005-10-29 devnull b++;
38 5cdb1798 2005-10-29 devnull }
39 5cdb1798 2005-10-29 devnull if(b==eb)
40 5cdb1798 2005-10-29 devnull return 0;
41 5cdb1798 2005-10-29 devnull return *a != *b;
42 5cdb1798 2005-10-29 devnull }
43 5cdb1798 2005-10-29 devnull
44 5cdb1798 2005-10-29 devnull int
45 5cdb1798 2005-10-29 devnull strtotm(char *p, Tm *tmp)
46 5cdb1798 2005-10-29 devnull {
47 5cdb1798 2005-10-29 devnull char *q, *r;
48 5cdb1798 2005-10-29 devnull int j;
49 5cdb1798 2005-10-29 devnull Tm tm;
50 5cdb1798 2005-10-29 devnull int delta;
51 5cdb1798 2005-10-29 devnull
52 5cdb1798 2005-10-29 devnull delta = 0;
53 5cdb1798 2005-10-29 devnull memset(&tm, 0, sizeof(tm));
54 5cdb1798 2005-10-29 devnull tm.mon = -1;
55 5cdb1798 2005-10-29 devnull tm.hour = -1;
56 5cdb1798 2005-10-29 devnull tm.min = -1;
57 5cdb1798 2005-10-29 devnull tm.year = -1;
58 5cdb1798 2005-10-29 devnull tm.mday = -1;
59 5cdb1798 2005-10-29 devnull for(p=skipwhite(p); *p; p=skipwhite(q)){
60 5cdb1798 2005-10-29 devnull q = skiptext(p);
61 5cdb1798 2005-10-29 devnull
62 5cdb1798 2005-10-29 devnull /* look for time in hh:mm[:ss] */
63 5cdb1798 2005-10-29 devnull if(r = memchr(p, ':', q-p)){
64 5cdb1798 2005-10-29 devnull tm.hour = strtol(p, 0, 10);
65 5cdb1798 2005-10-29 devnull tm.min = strtol(r+1, 0, 10);
66 5cdb1798 2005-10-29 devnull if(r = memchr(r+1, ':', q-(r+1)))
67 5cdb1798 2005-10-29 devnull tm.sec = strtol(r+1, 0, 10);
68 5cdb1798 2005-10-29 devnull else
69 5cdb1798 2005-10-29 devnull tm.sec = 0;
70 5cdb1798 2005-10-29 devnull continue;
71 5cdb1798 2005-10-29 devnull }
72 5cdb1798 2005-10-29 devnull
73 5cdb1798 2005-10-29 devnull /* look for month */
74 5cdb1798 2005-10-29 devnull for(j=0; j<12; j++)
75 5cdb1798 2005-10-29 devnull if(strcmplwr(p, months[j], 3)==0){
76 5cdb1798 2005-10-29 devnull tm.mon = j;
77 5cdb1798 2005-10-29 devnull break;
78 5cdb1798 2005-10-29 devnull }
79 5cdb1798 2005-10-29 devnull
80 5cdb1798 2005-10-29 devnull if(j!=12)
81 5cdb1798 2005-10-29 devnull continue;
82 5cdb1798 2005-10-29 devnull
83 5cdb1798 2005-10-29 devnull /* look for time zone [A-Z][A-Z]T */
84 5cdb1798 2005-10-29 devnull if(q-p==3 && 'A' <= p[0] && p[0] <= 'Z'
85 5cdb1798 2005-10-29 devnull && 'A' <= p[1] && p[1] <= 'Z' && p[2] == 'T'){
86 5cdb1798 2005-10-29 devnull strecpy(tm.zone, tm.zone+4, p);
87 5cdb1798 2005-10-29 devnull continue;
88 5cdb1798 2005-10-29 devnull }
89 5cdb1798 2005-10-29 devnull
90 5cdb1798 2005-10-29 devnull if(p[0]=='+'||p[0]=='-')
91 5cdb1798 2005-10-29 devnull if(q-p==5 && strspn(p+1, "0123456789") == 4){
92 5cdb1798 2005-10-29 devnull delta = (((p[1]-'0')*10+p[2]-'0')*60+(p[3]-'0')*10+p[4]-'0')*60;
93 5cdb1798 2005-10-29 devnull if(p[0] == '-')
94 5cdb1798 2005-10-29 devnull delta = -delta;
95 5cdb1798 2005-10-29 devnull continue;
96 5cdb1798 2005-10-29 devnull }
97 5cdb1798 2005-10-29 devnull if(strspn(p, "0123456789") == q-p){
98 5cdb1798 2005-10-29 devnull j = strtol(p, nil, 10);
99 5cdb1798 2005-10-29 devnull if(1 <= j && j <= 31)
100 5cdb1798 2005-10-29 devnull tm.mday = j;
101 5cdb1798 2005-10-29 devnull if(j >= 1900)
102 5cdb1798 2005-10-29 devnull tm.year = j-1900;
103 5cdb1798 2005-10-29 devnull }
104 5cdb1798 2005-10-29 devnull }
105 5cdb1798 2005-10-29 devnull
106 5cdb1798 2005-10-29 devnull if(tm.mon<0 || tm.year<0
107 5cdb1798 2005-10-29 devnull || tm.hour<0 || tm.min<0
108 5cdb1798 2005-10-29 devnull || tm.mday<0)
109 5cdb1798 2005-10-29 devnull return -1;
110 5cdb1798 2005-10-29 devnull
111 5cdb1798 2005-10-29 devnull *tmp = *localtime(tm2sec(&tm)-delta);
112 5cdb1798 2005-10-29 devnull return 0;
113 5cdb1798 2005-10-29 devnull }