Browse Source

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>
Denys Vlasenko 14 years ago
parent
commit
ff1822aed1
2 changed files with 30 additions and 5 deletions
  1. 26 1
      coreutils/date.c
  2. 4 4
      libbb/time.c

+ 26 - 1
coreutils/date.c

@@ -123,8 +123,33 @@ int date_main(int argc UNUSED_PARAM, char **argv)
 	if (!(opt & (OPT_SET | OPT_DATE))) {
 		opt |= OPT_SET;
 		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++;
+		}
 	}
 	if (*argv)
 		bb_show_usage();

+ 4 - 4
libbb/time.c

@@ -74,25 +74,25 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
 		int len = strchrnul(date_str, '.') - date_str;
 
 		/* 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,
 					&end) >= 1) {
 		} else
 		/* 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_min,
 					&end) >= 2) {
 		} else
 		/* 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_hour,
 					&tm_time->tm_min,
 					&end) >= 3) {
 		} else
 		/* 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_mday,
 					&tm_time->tm_hour,