Mercurial > hg > nginx-quic
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 |