Commit 9fe1548bb (date,touch: allow timezone offsets in dates)
mentioned the similarity between '@' format dates and those with
timezone offsets.  It didn't notice that as a result there's
common code which can be shared.

function                                             old     new   delta
parse_datestr                                        730     687     -43
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-43)             Total: -43 bytes

v2: A different version of gcc complained about the label appearing
    before a declaration.  Make it happy.

Signed-off-by: Ron Yorston <[email protected]>
---
 libbb/time.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/libbb/time.c b/libbb/time.c
index 41a69c754..48c16e5f1 100644
--- a/libbb/time.c
+++ b/libbb/time.c
@@ -13,6 +13,7 @@
 int FAST_FUNC parse_datestr(const char *date_str, struct tm *ptm)
 {
        char end = '\0';
+       time_t t;
 #if ENABLE_DESKTOP
 /*
  * strptime is BIG: ~1k in uclibc, ~10k in glibc
@@ -47,9 +48,6 @@ int FAST_FUNC parse_datestr(const char *date_str, struct tm 
*ptm)
                if (endp && *endp == '\0') {
 #if ENABLE_FEATURE_TIMEZONE
                        if (strchr(fmt, 'z')) {
-                               time_t t;
-                               struct tm *utm;
-
                                /* we have timezone offset: obtain Unix time_t 
*/
                                ptm->tm_sec -= ptm->tm_gmtoff;
                                ptm->tm_isdst = 0;
@@ -57,11 +55,7 @@ int FAST_FUNC parse_datestr(const char *date_str, struct tm 
*ptm)
                                if (t == (time_t)-1)
                                        break;
                                /* convert Unix time_t to struct tm in user's 
locale */
-                               utm = localtime(&t);
-                               if (!utm)
-                                       break;
-                               *ptm = *utm;
-                               return 0;
+                               goto localise;
                        }
 #endif
                        return 1;
@@ -141,13 +135,14 @@ int FAST_FUNC parse_datestr(const char *date_str, struct 
tm *ptm)
        } else
 #endif /* ENABLE_DESKTOP */
        if (date_str[0] == '@') {
-               time_t t;
                if (sizeof(t) <= sizeof(long))
                        t = bb_strtol(date_str + 1, NULL, 10);
                else /* time_t is 64 bits but longs are smaller */
                        t = bb_strtoll(date_str + 1, NULL, 10);
                if (!errno) {
-                       struct tm *lt = localtime(&t);
+                       struct tm *lt;
+ IF_FEATURE_TIMEZONE(localise:)
+                       lt = localtime(&t);
                        if (lt) {
                                *ptm = *lt;
                                return 0;
-- 
2.31.1

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to