From 4d89a8bd1d6a081be559656b67f4adfc75137740 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Fri, 25 Apr 2008 02:14:07 +0000 Subject: date: make it accept ISO date format. Fix help text. make testsuite actually test something useful. function old new delta date_main 1094 1149 +55 --- coreutils/date.c | 104 +++++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) (limited to 'coreutils') diff --git a/coreutils/date.c b/coreutils/date.c index 064f758e2..2aecbaac2 100644 --- a/coreutils/date.c +++ b/coreutils/date.c @@ -103,67 +103,67 @@ int date_main(int argc ATTRIBUTE_UNUSED, char **argv) if (ENABLE_FEATURE_DATE_ISOFMT && (opt & DATE_OPT_HINT)) { if (strptime(date_str, fmt_str2dt, &tm_time) == NULL) bb_error_msg_and_die(bb_msg_invalid_date, date_str); - } else if (strchr(date_str, ':') != NULL) { - /* Parse input and assign appropriately to tm_time */ - - if (sscanf(date_str, "%d:%d:%d", &tm_time.tm_hour, &tm_time.tm_min, - &tm_time.tm_sec) == 3) { - /* no adjustments needed */ - } else if (sscanf(date_str, "%d:%d", &tm_time.tm_hour, - &tm_time.tm_min) == 2) { - /* no adjustments needed */ - } else if (sscanf(date_str, "%d.%d-%d:%d:%d", &tm_time.tm_mon, - &tm_time.tm_mday, &tm_time.tm_hour, - &tm_time.tm_min, &tm_time.tm_sec) == 5) { - /* Adjust dates from 1-12 to 0-11 */ - tm_time.tm_mon -= 1; - } else if (sscanf(date_str, "%d.%d-%d:%d", &tm_time.tm_mon, - &tm_time.tm_mday, - &tm_time.tm_hour, &tm_time.tm_min) == 4) { - /* Adjust dates from 1-12 to 0-11 */ - tm_time.tm_mon -= 1; - } else if (sscanf(date_str, "%d.%d.%d-%d:%d:%d", &tm_time.tm_year, + } else { + char end = '\0'; + const char *last_colon = strrchr(date_str, ':'); + + if (last_colon != NULL) { + /* Parse input and assign appropriately to tm_time */ + + if (sscanf(date_str, "%u:%u%c", + &tm_time.tm_hour, + &tm_time.tm_min, + &end) >= 2) { + /* no adjustments needed */ + } else if (sscanf(date_str, "%u.%u-%u:%u%c", &tm_time.tm_mon, &tm_time.tm_mday, &tm_time.tm_hour, &tm_time.tm_min, - &tm_time.tm_sec) == 6) { - tm_time.tm_year -= 1900; /* Adjust years */ - tm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ - } else if (sscanf(date_str, "%d.%d.%d-%d:%d", &tm_time.tm_year, + &end) >= 4) { + /* Adjust dates from 1-12 to 0-11 */ + tm_time.tm_mon -= 1; + } else if (sscanf(date_str, "%u.%u.%u-%u:%u%c", &tm_time.tm_year, &tm_time.tm_mon, &tm_time.tm_mday, - &tm_time.tm_hour, &tm_time.tm_min) == 5) { - tm_time.tm_year -= 1900; /* Adjust years */ - tm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + &tm_time.tm_hour, &tm_time.tm_min, + &end) >= 5) { + tm_time.tm_year -= 1900; /* Adjust years */ + tm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + } else if (sscanf(date_str, "%u-%u-%u %u:%u%c", &tm_time.tm_year, + &tm_time.tm_mon, &tm_time.tm_mday, + &tm_time.tm_hour, &tm_time.tm_min, + &end) >= 5) { + tm_time.tm_year -= 1900; /* Adjust years */ + tm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ +//TODO: coreutils 6.9 also accepts "YYYY-MM-DD HH" (no minutes) + } else { + bb_error_msg_and_die(bb_msg_invalid_date, date_str); + } + if (end == ':') { + if (sscanf(last_colon + 1, "%u%c", &tm_time.tm_sec, &end) == 1) + end = '\0'; + /* else end != NUL and we error out */ + } } else { - bb_error_msg_and_die(bb_msg_invalid_date, date_str); - } - } else { - int nr; - char *cp; - - nr = sscanf(date_str, "%2d%2d%2d%2d%d", &tm_time.tm_mon, - &tm_time.tm_mday, &tm_time.tm_hour, &tm_time.tm_min, - &tm_time.tm_year); - - if (nr < 4 || nr > 5) { - bb_error_msg_and_die(bb_msg_invalid_date, date_str); - } - - cp = strchr(date_str, '.'); - if (cp) { - nr = sscanf(cp + 1, "%2d", &tm_time.tm_sec); - if (nr != 1) { + if (sscanf(date_str, "%2u%2u%2u%2u%u%c", &tm_time.tm_mon, + &tm_time.tm_mday, &tm_time.tm_hour, &tm_time.tm_min, + &tm_time.tm_year, &end) < 4) bb_error_msg_and_die(bb_msg_invalid_date, date_str); + /* correct for century - minor Y2K problem here? */ + if (tm_time.tm_year >= 1900) { + tm_time.tm_year -= 1900; + } + /* adjust date */ + tm_time.tm_mon -= 1; + if (end == '.') { + if (sscanf(strchr(date_str, '.') + 1, "%u%c", + &tm_time.tm_sec, &end) == 1) + end = '\0'; + /* else end != NUL and we error out */ } } - - /* correct for century - minor Y2K problem here? */ - if (tm_time.tm_year >= 1900) { - tm_time.tm_year -= 1900; + if (end != '\0') { + bb_error_msg_and_die(bb_msg_invalid_date, date_str); } - /* adjust date */ - tm_time.tm_mon -= 1; } - /* Correct any day of week and day of year etc. fields */ tm_time.tm_isdst = -1; /* Be sure to recheck dst. */ tm = mktime(&tm_time); -- cgit v1.2.3