void sortify_date(const char *s, int len, string &key) { const char *year_end; const char *year_start = find_year(s, s + len, &year_end); if (!year_start) { // Things without years are often `forthcoming', so it makes sense // that they sort after things with explicit years. key += 'A'; sortify_words(s, s + len, 0, key); return; } int n = year_end - year_start; while (n < 4) { key += '0'; n++; } while (year_start < year_end) key += *year_start++; int m = find_month(s, s + len); if (m < 0) return; key += 'A' + m; const char *day_end; const char *day_start = find_day(s, s + len, &day_end); if (!day_start) return; if (day_end - day_start == 1) key += '0'; while (day_start < day_end) key += *day_start++; }
void parse_date(char *str, struct tm* t){ char wkday[BUFF_SIZE]; char weekday[BUFF_SIZE]; char month[BUFF_SIZE]; int day; int year; int h; int m; int s; if(sscanf(str, "%400[a-zA-Z] %400[a-zA-Z] %d %d:%d:%d %d", wkday, month, &day, &h, &m, &s, &year) == 7){ t->tm_wday = find_wkday(wkday); t->tm_year = year - 1900; t->tm_mon = find_month(month); t->tm_mday = day; t->tm_hour = h; t->tm_min = m; t->tm_sec = s; }else if(sscanf(str, "%400[a-zA-Z], %d-%400[a-zA-Z]-%d %d:%d:%d GMT", weekday, &day, month, &year, &h, &m, &s) == 7){ t->tm_wday = find_weekday(wkday); t->tm_year = year; t->tm_mon = find_month(month); t->tm_mday = day; t->tm_hour = h; t->tm_min = m; t->tm_sec = s; }else if(sscanf(str, "%400[a-zA-Z], %d %400[a-zA-Z] %d %d:%d:%d GMT", wkday, &day, month, &year, &h, &m, &s) == 7){ t->tm_wday = find_wkday(wkday); t->tm_year = year - 1900; t->tm_mon = find_month(month); t->tm_mday = day; t->tm_hour = h; t->tm_min = m; t->tm_sec = s; }else{ t = NULL; } }