summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2020-03-14 14:33:05 -0600
committerKarl Williamson <khw@cpan.org>2020-03-18 18:08:57 -0600
commit0bd9a4dd60d8f4d8a8858b9017c1f861838b56b5 (patch)
tree6193408efde17f69332f53f02c1e0e1ea9e9e028
parent6358af1715b0184076504f68f4610f4d97c57114 (diff)
downloadperl-0bd9a4dd60d8f4d8a8858b9017c1f861838b56b5.tar.gz
time64.c: Refactor Perl_localtime64_r()
There are two main cases in Perl_localtime64_r(), call them A and B. Prior to this commit, it was structured if (A) { codeA return; } codeB return; The problem this commit solves is that there is common stuff in codeA and codeB that will now only be specified once. Currently that common stuff is minimal, and so acceptable, but the next few commits will make the common stuff more complex, so making it be only once is helpful.
-rw-r--r--time64.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/time64.c b/time64.c
index 475134f3c4..5e36e27a9d 100644
--- a/time64.c
+++ b/time64.c
@@ -476,15 +476,8 @@ struct TM *Perl_localtime64_r (const Time64_T *time, struct TM *local_tm)
safe_time = (time_t)*time;
TIME64_TRACE1("Using system localtime for %lld\n", *time);
-
- LOCALTIME_R(&safe_time, &safe_date);
-
- S_copy_little_tm_to_big_TM(&safe_date, local_tm);
- assert(S_check_tm(local_tm));
-
- return local_tm;
}
-
+ else {
if( Perl_gmtime64_r(time, &gm_tm) == NULL ) {
TIME64_TRACE1("gmtime64_r returned null for %lld\n", *time);
return NULL;
@@ -501,6 +494,8 @@ struct TM *Perl_localtime64_r (const Time64_T *time, struct TM *local_tm)
}
safe_time = (time_t)S_timegm64(&gm_tm);
+ }
+
if( LOCALTIME_R(&safe_time, &safe_date) == NULL ) {
TIME64_TRACE1("localtime_r(%d) returned NULL\n", (int)safe_time);
return NULL;
@@ -508,6 +503,8 @@ struct TM *Perl_localtime64_r (const Time64_T *time, struct TM *local_tm)
S_copy_little_tm_to_big_TM(&safe_date, local_tm);
+ if (! use_system) {
+
local_tm->tm_year = orig_year;
if( local_tm->tm_year != orig_year ) {
TIME64_TRACE2("tm_year overflow: tm_year %lld, orig_year %lld\n",
@@ -545,6 +542,8 @@ struct TM *Perl_localtime64_r (const Time64_T *time, struct TM *local_tm)
if( !IS_LEAP(local_tm->tm_year) && local_tm->tm_yday == 365 )
local_tm->tm_yday--;
+ }
+
assert(S_check_tm(local_tm));
return local_tm;