Contiki 3.x
epoch_to_tm.c
1 /**
2  * Adapted from Minix - http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/lib/ansi/gmtime.c
3  */
4 
5 /*
6 * gmtime - convert the calendar time into broken down time
7 */
8 /* $Header: /users/cosc/staff/paul/CVS/minix1.7/src/lib/ansi/gmtime.c,v 1.2 1996/04/10 21:04:22 paul Exp $ */
9 
10 #include "utc_time.h"
11 
12 #define YEAR0 1900 /* the first year */
13 #define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */
14 #define SECS_DAY (24L * 60L * 60L)
15 #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
16 #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
17 #define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7)
18 #define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7)
19 #define TIME_MAX ULONG_MAX
20 #define ABB_LEN 3
21 
22 static const int _ytab[2][12] = {
23  { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
24  { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
25 };
26 
27 void epoch_to_tm(register const time_t *timer, struct tm * const timep) {
28  time_t time = *timer;
29  register unsigned long dayclock, dayno;
30  int year = EPOCH_YR;
31 
32  dayclock = (unsigned long)time % SECS_DAY;
33  dayno = (unsigned long)time / SECS_DAY;
34 
35  timep->tm_sec = dayclock % 60;
36  timep->tm_min = (dayclock % 3600) / 60;
37  timep->tm_hour = dayclock / 3600;
38  while (dayno >= YEARSIZE(year)) {
39  dayno -= YEARSIZE(year);
40  year++;
41  }
42  timep->tm_year = year - YEAR0;
43  timep->tm_mon = 0;
44 
45  while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) {
46  dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon];
47  timep->tm_mon++;
48  }
49 
50  timep->tm_mday = dayno + 1;
51 }
static const nrf_drv_timer_t timer
Timer instance used for rtimer.
Definition: rtimer-arch.c:49
A timer.
Definition: timer.h:86
Utility functions for operating on UTC times.
tm
Definition: utc_time.h:20
void epoch_to_tm(const time_t *timer, struct tm *const tmp)
Convert a UNIX epoch to a tm struct.