diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-15 04:55:40 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-11-15 04:55:40 +0100 |
commit | ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4 (patch) | |
tree | 2dc5446a7049e666cda7053bd8c13a41a5cedf0e | |
parent | 6e54249e05f3fbe472814465d8f3e122801b7e96 (diff) | |
download | busybox-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.tar.gz busybox-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.tar.bz2 busybox-w32-ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4.zip |
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>
-rw-r--r-- | coreutils/date.c | 27 | ||||
-rw-r--r-- | libbb/time.c | 8 |
2 files changed, 30 insertions, 5 deletions
diff --git a/coreutils/date.c b/coreutils/date.c index 51200e64c..11b63eaeb 100644 --- a/coreutils/date.c +++ b/coreutils/date.c | |||
@@ -123,8 +123,33 @@ int date_main(int argc UNUSED_PARAM, char **argv) | |||
123 | if (!(opt & (OPT_SET | OPT_DATE))) { | 123 | if (!(opt & (OPT_SET | OPT_DATE))) { |
124 | opt |= OPT_SET; | 124 | opt |= OPT_SET; |
125 | date_str = argv[0]; /* can be NULL */ | 125 | date_str = argv[0]; /* can be NULL */ |
126 | if (date_str) | 126 | if (date_str) { |
127 | #if ENABLE_DESKTOP | ||
128 | int len = strspn(date_str, "0123456789"); | ||
129 | if (date_str[len] == '\0' | ||
130 | || (date_str[len] == '.' | ||
131 | && isdigit(date_str[len+1]) | ||
132 | && isdigit(date_str[len+2]) | ||
133 | && date_str[len+3] == '\0' | ||
134 | ) | ||
135 | ) { | ||
136 | /* Dreaded [MMDDhhmm[[CC]YY][.ss]] format! | ||
137 | * It does not match -d or -s format. | ||
138 | * Some users actually do use it. | ||
139 | */ | ||
140 | len -= 8; | ||
141 | if (len < 0 || len > 4 || (len & 1)) | ||
142 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | ||
143 | if (len != 0) { /* move YY or CCYY to front */ | ||
144 | char buf[4]; | ||
145 | memcpy(buf, date_str + 8, len); | ||
146 | memmove(date_str + len, date_str, 8); | ||
147 | memcpy(date_str, buf, len); | ||
148 | } | ||
149 | } | ||
150 | #endif | ||
127 | argv++; | 151 | argv++; |
152 | } | ||
128 | } | 153 | } |
129 | if (*argv) | 154 | if (*argv) |
130 | bb_show_usage(); | 155 | bb_show_usage(); |
diff --git a/libbb/time.c b/libbb/time.c index b31683b67..85c72d163 100644 --- a/libbb/time.c +++ b/libbb/time.c | |||
@@ -74,25 +74,25 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time) | |||
74 | int len = strchrnul(date_str, '.') - date_str; | 74 | int len = strchrnul(date_str, '.') - date_str; |
75 | 75 | ||
76 | /* MM[.SS] */ | 76 | /* MM[.SS] */ |
77 | if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 12, | 77 | if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12, |
78 | &tm_time->tm_min, | 78 | &tm_time->tm_min, |
79 | &end) >= 1) { | 79 | &end) >= 1) { |
80 | } else | 80 | } else |
81 | /* HHMM[.SS] */ | 81 | /* HHMM[.SS] */ |
82 | if (len == 4 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 9, | 82 | if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9, |
83 | &tm_time->tm_hour, | 83 | &tm_time->tm_hour, |
84 | &tm_time->tm_min, | 84 | &tm_time->tm_min, |
85 | &end) >= 2) { | 85 | &end) >= 2) { |
86 | } else | 86 | } else |
87 | /* ddHHMM[.SS] */ | 87 | /* ddHHMM[.SS] */ |
88 | if (len == 6 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 6, | 88 | if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6, |
89 | &tm_time->tm_mday, | 89 | &tm_time->tm_mday, |
90 | &tm_time->tm_hour, | 90 | &tm_time->tm_hour, |
91 | &tm_time->tm_min, | 91 | &tm_time->tm_min, |
92 | &end) >= 3) { | 92 | &end) >= 3) { |
93 | } else | 93 | } else |
94 | /* mmddHHMM[.SS] */ | 94 | /* mmddHHMM[.SS] */ |
95 | if (len == 8 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 3, | 95 | if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3, |
96 | &tm_time->tm_mon, | 96 | &tm_time->tm_mon, |
97 | &tm_time->tm_mday, | 97 | &tm_time->tm_mday, |
98 | &tm_time->tm_hour, | 98 | &tm_time->tm_hour, |