diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-18 03:40:35 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-07-18 03:40:35 +0200 |
commit | 73b71f381d24218cf6368364be723a7b5c9aeda9 (patch) | |
tree | fe3c6e1056417bbd2dc470cd5ad74daaf25542ea /libbb | |
parent | d23f64eba79a702c36d8d8cec23b49c320897138 (diff) | |
download | busybox-w32-73b71f381d24218cf6368364be723a7b5c9aeda9.tar.gz busybox-w32-73b71f381d24218cf6368364be723a7b5c9aeda9.tar.bz2 busybox-w32-73b71f381d24218cf6368364be723a7b5c9aeda9.zip |
date: factor out date parsing (in preparation for touch -d)
function old new delta
parse_datestr - 391 +391
sha512_process_block128 1283 1310 +27
buffer_fill_and_print 179 196 +17
nexpr 826 840 +14
unzip_main 1931 1939 +8
popstring 134 140 +6
qrealloc 33 36 +3
builtin_umask 121 123 +2
evalvar 1365 1363 -2
changepath 194 192 -2
do_compress 1698 1688 -10
hwclock_main 340 329 -11
cmdputs 414 402 -12
identify 4343 4329 -14
date_main 1186 687 -499
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 7/7 up/down: 468/-550) Total: -82 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/time.c | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/libbb/time.c b/libbb/time.c index 850ac1542..30b760f71 100644 --- a/libbb/time.c +++ b/libbb/time.c | |||
@@ -6,9 +6,71 @@ | |||
6 | * | 6 | * |
7 | * Licensed under GPL version 2, see file LICENSE in this tarball for details. | 7 | * Licensed under GPL version 2, see file LICENSE in this tarball for details. |
8 | */ | 8 | */ |
9 | |||
10 | #include "libbb.h" | 9 | #include "libbb.h" |
11 | 10 | ||
11 | void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time) | ||
12 | { | ||
13 | char end = '\0'; | ||
14 | const char *last_colon = strrchr(date_str, ':'); | ||
15 | |||
16 | if (last_colon != NULL) { | ||
17 | /* Parse input and assign appropriately to tm_time */ | ||
18 | |||
19 | if (sscanf(date_str, "%u:%u%c", | ||
20 | &tm_time->tm_hour, | ||
21 | &tm_time->tm_min, | ||
22 | &end) >= 2) { | ||
23 | /* no adjustments needed */ | ||
24 | } else if (sscanf(date_str, "%u.%u-%u:%u%c", | ||
25 | &tm_time->tm_mon, &tm_time->tm_mday, | ||
26 | &tm_time->tm_hour, &tm_time->tm_min, | ||
27 | &end) >= 4) { | ||
28 | /* Adjust dates from 1-12 to 0-11 */ | ||
29 | tm_time->tm_mon -= 1; | ||
30 | } else if (sscanf(date_str, "%u.%u.%u-%u:%u%c", &tm_time->tm_year, | ||
31 | &tm_time->tm_mon, &tm_time->tm_mday, | ||
32 | &tm_time->tm_hour, &tm_time->tm_min, | ||
33 | &end) >= 5) { | ||
34 | tm_time->tm_year -= 1900; /* Adjust years */ | ||
35 | tm_time->tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ | ||
36 | } else if (sscanf(date_str, "%u-%u-%u %u:%u%c", &tm_time->tm_year, | ||
37 | &tm_time->tm_mon, &tm_time->tm_mday, | ||
38 | &tm_time->tm_hour, &tm_time->tm_min, | ||
39 | &end) >= 5) { | ||
40 | tm_time->tm_year -= 1900; /* Adjust years */ | ||
41 | tm_time->tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ | ||
42 | //TODO: coreutils 6.9 also accepts "YYYY-MM-DD HH" (no minutes) | ||
43 | } else { | ||
44 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | ||
45 | } | ||
46 | if (end == ':') { | ||
47 | if (sscanf(last_colon + 1, "%u%c", &tm_time->tm_sec, &end) == 1) | ||
48 | end = '\0'; | ||
49 | /* else end != NUL and we error out */ | ||
50 | } | ||
51 | } else { | ||
52 | if (sscanf(date_str, "%2u%2u%2u%2u%u%c", &tm_time->tm_mon, | ||
53 | &tm_time->tm_mday, &tm_time->tm_hour, &tm_time->tm_min, | ||
54 | &tm_time->tm_year, &end) < 4) | ||
55 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | ||
56 | /* correct for century - minor Y2K problem here? */ | ||
57 | if (tm_time->tm_year >= 1900) { | ||
58 | tm_time->tm_year -= 1900; | ||
59 | } | ||
60 | /* adjust date */ | ||
61 | tm_time->tm_mon -= 1; | ||
62 | if (end == '.') { | ||
63 | if (sscanf(strchr(date_str, '.') + 1, "%u%c", | ||
64 | &tm_time->tm_sec, &end) == 1) | ||
65 | end = '\0'; | ||
66 | /* else end != NUL and we error out */ | ||
67 | } | ||
68 | } | ||
69 | if (end != '\0') { | ||
70 | bb_error_msg_and_die(bb_msg_invalid_date, date_str); | ||
71 | } | ||
72 | } | ||
73 | |||
12 | #if ENABLE_MONOTONIC_SYSCALL | 74 | #if ENABLE_MONOTONIC_SYSCALL |
13 | 75 | ||
14 | #include <sys/syscall.h> | 76 | #include <sys/syscall.h> |