date: restore hadling of MMDDhhmm[[CC]YY][.ss] date format

function                                             old     new   delta
date_main                                            698     889    +191

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-11-15 04:55:40 +01:00
parent 6e54249e05
commit ff1822aed1
2 changed files with 30 additions and 5 deletions

View File

@ -123,8 +123,33 @@ int date_main(int argc UNUSED_PARAM, char **argv)
if (!(opt & (OPT_SET | OPT_DATE))) { if (!(opt & (OPT_SET | OPT_DATE))) {
opt |= OPT_SET; opt |= OPT_SET;
date_str = argv[0]; /* can be NULL */ date_str = argv[0]; /* can be NULL */
if (date_str) if (date_str) {
#if ENABLE_DESKTOP
int len = strspn(date_str, "0123456789");
if (date_str[len] == '\0'
|| (date_str[len] == '.'
&& isdigit(date_str[len+1])
&& isdigit(date_str[len+2])
&& date_str[len+3] == '\0'
)
) {
/* Dreaded [MMDDhhmm[[CC]YY][.ss]] format!
* It does not match -d or -s format.
* Some users actually do use it.
*/
len -= 8;
if (len < 0 || len > 4 || (len & 1))
bb_error_msg_and_die(bb_msg_invalid_date, date_str);
if (len != 0) { /* move YY or CCYY to front */
char buf[4];
memcpy(buf, date_str + 8, len);
memmove(date_str + len, date_str, 8);
memcpy(date_str, buf, len);
}
}
#endif
argv++; argv++;
}
} }
if (*argv) if (*argv)
bb_show_usage(); bb_show_usage();

View File

@ -74,25 +74,25 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
int len = strchrnul(date_str, '.') - date_str; int len = strchrnul(date_str, '.') - date_str;
/* MM[.SS] */ /* MM[.SS] */
if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 12, if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12,
&tm_time->tm_min, &tm_time->tm_min,
&end) >= 1) { &end) >= 1) {
} else } else
/* HHMM[.SS] */ /* HHMM[.SS] */
if (len == 4 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 9, if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9,
&tm_time->tm_hour, &tm_time->tm_hour,
&tm_time->tm_min, &tm_time->tm_min,
&end) >= 2) { &end) >= 2) {
} else } else
/* ddHHMM[.SS] */ /* ddHHMM[.SS] */
if (len == 6 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 6, if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6,
&tm_time->tm_mday, &tm_time->tm_mday,
&tm_time->tm_hour, &tm_time->tm_hour,
&tm_time->tm_min, &tm_time->tm_min,
&end) >= 3) { &end) >= 3) {
} else } else
/* mmddHHMM[.SS] */ /* mmddHHMM[.SS] */
if (len == 8 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 3, if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3,
&tm_time->tm_mon, &tm_time->tm_mon,
&tm_time->tm_mday, &tm_time->tm_mday,
&tm_time->tm_hour, &tm_time->tm_hour,