6 * print dates in the format
7 * Wkd, DD Mon YYYY HH:MM:SS GMT
8 * parse dates of formats
9 * Wkd, DD Mon YYYY HH:MM:SS GMT
10 * Weekday, DD-Mon-YY HH:MM:SS GMT
11 * Wkd Mon ( D|DD) HH:MM:SS YYYY
12 * plus anything similar
17 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
22 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
28 "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
31 static int dateindex(char*, char**, int);
36 if(c >= 'A' && c <= 'Z')
44 return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';
50 return c >= '0' && c <= '9';
59 t = va_arg(f->args, ulong);
61 return fmtprint(f, "%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT",
62 wdayname[tm->wday], tm->mday, monname[tm->mon], tm->year+1900,
63 tm->hour, tm->min, tm->sec);
67 dateword(char *date, char *buf)
73 while(!disalpha(c = *date) && !disdig(c) && c)
75 while(disalpha(c = *date)){
91 while(!disdig(c = *date) && c)
98 while(disdig(c = *date)){
107 * parse a date and return the seconds since the epoch
108 * return 0 for a failure
111 hdate2sec(char *date)
119 date = dateword(date, buf);
120 tm.wday = dateindex(buf, wdayname, 7);
122 tm.wday = dateindex(buf, weekdayname, 7);
127 * check for the two major formats
129 date = dateword(date, buf);
130 tm.mon = dateindex(buf, monname, 12);
135 tm.mday = datenum(&date);
136 if(tm.mday < 1 || tm.mday > 31)
142 tm.hour = datenum(&date);
143 if(tm.hour < 0 || tm.hour >= 24)
145 tm.min = datenum(&date);
146 if(tm.min < 0 || tm.min >= 60)
148 tm.sec = datenum(&date);
149 if(tm.sec < 0 || tm.sec >= 60)
155 tm.year = datenum(&date);
156 if(tm.year < 70 || tm.year > 99 && tm.year < 1970)
164 tm.mday = datenum(&date);
165 if(tm.mday < 1 || tm.mday > 31)
167 date = dateword(date, buf);
168 tm.mon = dateindex(buf, monname, 12);
169 if(tm.mon < 0 || tm.mon >= 12)
171 tm.year = datenum(&date);
172 if(tm.year < 70 || tm.year > 99 && tm.year < 1970)
180 tm.hour = datenum(&date);
181 if(tm.hour < 0 || tm.hour >= 24)
183 tm.min = datenum(&date);
184 if(tm.min < 0 || tm.min >= 60)
186 tm.sec = datenum(&date);
187 if(tm.sec < 0 || tm.sec >= 60)
194 if(strncmp(buf, "gmt", 3) != 0)
198 strcpy(tm.zone, "GMT");
204 dateindex(char *d, char **tab, int n)
208 for(i = 0; i < n; i++)
209 if(cistrcmp(d, tab[i]) == 0)