mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-15 10:29:47 +00:00
50 lines
1.6 KiB
C
50 lines
1.6 KiB
C
#include "internal.h"
|
|
|
|
static const char *month_names[] = {
|
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
|
};
|
|
|
|
// Convert month to the month number. Return -1 on error, or month number
|
|
static int get_month_index(const char *s) {
|
|
int i;
|
|
|
|
for (i = 0; i < (int) ARRAY_SIZE(month_names); i++)
|
|
if (!strcmp(s, month_names[i]))
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
static int num_leap_years(int year) {
|
|
return year / 4 - year / 100 + year / 400;
|
|
}
|
|
|
|
// Parse UTC date-time string, and return the corresponding time_t value.
|
|
static time_t parse_date_string(const char *datetime) {
|
|
static const unsigned short days_before_month[] = {
|
|
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
|
|
};
|
|
char month_str[32];
|
|
int second, minute, hour, day, month, year, leap_days, days;
|
|
time_t result = (time_t) 0;
|
|
|
|
if (((sscanf(datetime, "%d/%3s/%d %d:%d:%d",
|
|
&day, month_str, &year, &hour, &minute, &second) == 6) ||
|
|
(sscanf(datetime, "%d %3s %d %d:%d:%d",
|
|
&day, month_str, &year, &hour, &minute, &second) == 6) ||
|
|
(sscanf(datetime, "%*3s, %d %3s %d %d:%d:%d",
|
|
&day, month_str, &year, &hour, &minute, &second) == 6) ||
|
|
(sscanf(datetime, "%d-%3s-%d %d:%d:%d",
|
|
&day, month_str, &year, &hour, &minute, &second) == 6)) &&
|
|
year > 1970 &&
|
|
(month = get_month_index(month_str)) != -1) {
|
|
leap_days = num_leap_years(year) - num_leap_years(1970);
|
|
year -= 1970;
|
|
days = year * 365 + days_before_month[month] + (day - 1) + leap_days;
|
|
result = days * 24 * 3600 + hour * 3600 + minute * 60 + second;
|
|
}
|
|
|
|
return result;
|
|
}
|