comparison src/http/ngx_http_parse_time.c @ 26:53cb81681040

nginx-0.0.1-2002-12-15-09:25:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Dec 2002 06:25:09 +0000
parents a8b156554dfe
children 6a0b3d6e9c13
comparison
equal deleted inserted replaced
25:a8b156554dfe 26:53cb81681040
1 1
2 #include <time.h> 2 #include <ngx_config.h>
3 3 #include <ngx_core.h>
4 #define NGX_ERROR -1 4 #include <ngx_types.h>
5
5 6
6 static int mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 7 static int mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
7 8
8 time_t ngx_http_parse_time(char *value, size_t len) 9 time_t ngx_http_parse_time(char *value, size_t len)
9 { 10 {
14 rfc822, /* Tue 10 Nov 2002 23:50:13 */ 15 rfc822, /* Tue 10 Nov 2002 23:50:13 */
15 rfc850, /* Tuesday, 10-Dec-02 23:50:13 */ 16 rfc850, /* Tuesday, 10-Dec-02 23:50:13 */
16 isoc /* Tue Dec 10 23:50:13 2002 */ 17 isoc /* Tue Dec 10 23:50:13 2002 */
17 } fmt; 18 } fmt;
18 19
20 fmt = 0;
19 end = value + len; 21 end = value + len;
20 22
21 for (p = value; p < end; p++) { 23 for (p = value; p < end; p++) {
22 if (*p == ',') 24 if (*p == ',')
23 break; 25 break;
180 182
181 year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100 183 year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100
182 + (*(p + 2) - '0') * 10 + *(p + 3) - '0'; 184 + (*(p + 2) - '0') * 10 + *(p + 3) - '0';
183 } 185 }
184 186
187 #if 0
185 printf("%d.%d.%d %d:%d:%d\n", day, month + 1, year, hour, min, sec); 188 printf("%d.%d.%d %d:%d:%d\n", day, month + 1, year, hour, min, sec);
186 189 #endif
187 if (hour > 23 || min > 60 || sec > 60) 190
191 if (hour > 23 || min > 59 || sec > 59)
188 return NGX_ERROR; 192 return NGX_ERROR;
189 193
190 if (day == 29 && month == 1) { 194 if (day == 29 && month == 1) {
191 if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0)) 195 if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0))
192 return NGX_ERROR; 196 return NGX_ERROR;
193 197
194 } else if (day > mday[month]) 198 } else if (day > mday[month]) {
195 return NGX_ERROR; 199 return NGX_ERROR;
196 } 200 }
197 201
198 if (sizeof(time_t) <= 4 && year >= 2038) 202 if (sizeof(time_t) <= 4 && year >= 2038)
199 return NGX_ERROR; 203 return NGX_ERROR;
200 204
205 /* shift new year to 1st March, needed for Gauss's formula */
201 if (--month <= 0) { 206 if (--month <= 0) {
202 month += 12; 207 month += 12;
203 year -= 1; 208 year -= 1;
204 } 209 }
205 210 /* Gauss's formula for days from 1 March 1 BC */
206 return year / 4 - year / 100 + year / 400 211 return (365 * year + year / 4 - year / 100 + year / 400
207 + 367 * month / 12 + day + year * 365 - 719499; 212 + 367 * month / 12 + day - 31
213 /* 719527 days are between 1 March 1 BC and 1 March 1970,
214 31 and 28 days in Jan and Feb 1970 */
215 - 719527 + 31 + 28) * 86400 + hour * 3600 + min * 60 + sec;
208 } 216 }
209 217
218 #if 0
210 char zero[] = "Sun, 01 Jan 1970 08:49:30"; 219 char zero[] = "Sun, 01 Jan 1970 08:49:30";
211 char one[] = "Sunday, 11-Dec-02 08:49:30"; 220 char one[] = "Sunday, 11-Dec-02 08:49:30";
212 char two[] = "Sun Mar 1 08:49:37 2000"; 221 char two[] = "Sun Mar 1 08:49:37 2000";
213 char thr[] = "Sun Dec 11 08:49:37 2002"; 222 char thr[] = "Sun Dec 11 08:49:37 2002";
214 223
226 printf("rc: %d\n", rc); 235 printf("rc: %d\n", rc);
227 236
228 rc = ngx_http_parse_time(thr, sizeof(thr) - 1); 237 rc = ngx_http_parse_time(thr, sizeof(thr) - 1);
229 printf("rc: %d\n", rc); 238 printf("rc: %d\n", rc);
230 } 239 }
240
241 #endif