summaryrefslogtreecommitdiff
path: root/time/gmtime_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'time/gmtime_r.c')
-rw-r--r--time/gmtime_r.c144
1 files changed, 0 insertions, 144 deletions
diff --git a/time/gmtime_r.c b/time/gmtime_r.c
deleted file mode 100644
index 22658ea..0000000
--- a/time/gmtime_r.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * (C)2012 Michael Duane Rice All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer. Redistributions in binary
- * form must reproduce the above copyright notice, this list of conditions
- * and the following disclaimer in the documentation and/or other materials
- * provided with the distribution. Neither the name of the copyright holders
- * nor the names of contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* $Id: gmtime_r.c 2369 2013-04-28 14:19:35Z swfltek $ */
-
-/* Re entrant version of gmtime(). */
-
-#include <time.h>
-#include <stdlib.h>
-#include <inttypes.h>
-
-void
-gmtime_r(const time_t * timer, struct tm * timeptr)
-{
- int32_t fract;
- ldiv_t lresult;
- div_t result;
- uint16_t days, n, leapyear, years;
-
- /* break down timer into whole and fractional parts of 1 day */
- days = *timer / 86400UL;
- fract = *timer % 86400UL;
-
- /*
- Extract hour, minute, and second from the fractional day
- */
- lresult = ldiv(fract, 60L);
- timeptr->tm_sec = lresult.rem;
- result = div(lresult.quot, 60);
- timeptr->tm_min = result.rem;
- timeptr->tm_hour = result.quot;
-
- /* Determine day of week ( the epoch was a Saturday ) */
- n = days + SATURDAY;
- n %= 7;
- timeptr->tm_wday = n;
-
- /*
- * Our epoch year has the property of being at the conjunction of all three 'leap cycles',
- * 4, 100, and 400 years ( though we can ignore the 400 year cycle in this library).
- *
- * Using this property, we can easily 'map' the time stamp into the leap cycles, quickly
- * deriving the year and day of year, along with the fact of whether it is a leap year.
- */
-
- /* map into a 100 year cycle */
- lresult = ldiv((long) days, 36525L);
- years = 100 * lresult.quot;
-
- /* map into a 4 year cycle */
- lresult = ldiv(lresult.rem, 1461L);
- years += 4 * lresult.quot;
- days = lresult.rem;
- if (years > 100)
- days++;
-
- /*
- * 'years' is now at the first year of a 4 year leap cycle, which will always be a leap year,
- * unless it is 100. 'days' is now an index into that cycle.
- */
- leapyear = 1;
- if (years == 100)
- leapyear = 0;
-
- /* compute length, in days, of first year of this cycle */
- n = 364 + leapyear;
-
- /*
- * if the number of days remaining is greater than the length of the
- * first year, we make one more division.
- */
- if (days > n) {
- days -= leapyear;
- leapyear = 0;
- result = div(days, 365);
- years += result.quot;
- days = result.rem;
- }
- timeptr->tm_year = 100 + years;
- timeptr->tm_yday = days;
-
- /*
- Given the year, day of year, and leap year indicator, we can break down the
- month and day of month. If the day of year is less than 59 (or 60 if a leap year), then
- we handle the Jan/Feb month pair as an exception.
- */
- n = 59 + leapyear;
- if (days < n) {
- /* special case: Jan/Feb month pair */
- result = div(days, 31);
- timeptr->tm_mon = result.quot;
- timeptr->tm_mday = result.rem;
- } else {
- /*
- The remaining 10 months form a regular pattern of 31 day months alternating with 30 day
- months, with a 'phase change' between July and August (153 days after March 1).
- We proceed by mapping our position into either March-July or August-December.
- */
- days -= n;
- result = div(days, 153);
- timeptr->tm_mon = 2 + result.quot * 5;
-
- /* map into a 61 day pair of months */
- result = div(result.rem, 61);
- timeptr->tm_mon += result.quot * 2;
-
- /* map into a month */
- result = div(result.rem, 31);
- timeptr->tm_mon += result.quot;
- timeptr->tm_mday = result.rem;
- }
-
- /*
- Cleanup and return
- */
- timeptr->tm_isdst = 0; /* gmt is never in DST */
- timeptr->tm_mday++; /* tm_mday is 1 based */
-
-}