SSLClient  v1.6.9
time_macros.h
Go to the documentation of this file.
1 /*
2  *
3  * Created: 29.03.2018
4  *
5  * Authors:
6  *
7  * Assembled from the code released on Stackoverflow by:
8  * Dennis (instructable.com/member/nqtronix) | https://stackoverflow.com/questions/23032002/c-c-how-to-get-integer-unix-timestamp-of-build-time-not-string
9  * and
10  * Alexis Wilke | https://stackoverflow.com/questions/10538444/do-you-know-of-a-c-macro-to-compute-unix-time-and-date
11  *
12  * Assembled by Jean Rabault
13  *
14  * UNIX_TIMESTAMP gives the UNIX timestamp (unsigned long integer of seconds since 1st Jan 1970) of compilation from macros using the compiler defined __TIME__ macro.
15  * This should include Gregorian calendar leap days, in particular the 29ths of February, 100 and 400 years modulo leaps.
16  *
17  * Careful: __TIME__ is the local time of the computer, NOT the UTC time in general!
18  *
19  */
20 
21 #ifndef COMPILE_TIME_H_
22 #define COMPILE_TIME_H_
23 
24 // add offset for pacific standard time
25 #define PST_OFFSET (8UL)
26 
27 // Some definitions for calculation
28 #define SEC_PER_MIN (60UL)
29 #define SEC_PER_HOUR (3600UL)
30 #define SEC_PER_DAY (86400UL)
31 #define SEC_PER_YEAR (SEC_PER_DAY*365)
32 
33 // extracts 1..4 characters from a string and interprets it as a decimal value
34 #define CONV_STR2DEC_1(str, i) (str[i]>'0'?str[i]-'0':0)
35 #define CONV_STR2DEC_2(str, i) (CONV_STR2DEC_1(str, i)*10 + str[i+1]-'0')
36 #define CONV_STR2DEC_3(str, i) (CONV_STR2DEC_2(str, i)*10 + str[i+2]-'0')
37 #define CONV_STR2DEC_4(str, i) (CONV_STR2DEC_3(str, i)*10 + str[i+3]-'0')
38 
39 // Custom "glue logic" to convert the month name to a usable number
40 #define GET_MONTH(str, i) (str[i]=='J' && str[i+1]=='a' && str[i+2]=='n' ? 1 : \
41  str[i]=='F' && str[i+1]=='e' && str[i+2]=='b' ? 2 : \
42  str[i]=='M' && str[i+1]=='a' && str[i+2]=='r' ? 3 : \
43  str[i]=='A' && str[i+1]=='p' && str[i+2]=='r' ? 4 : \
44  str[i]=='M' && str[i+1]=='a' && str[i+2]=='y' ? 5 : \
45  str[i]=='J' && str[i+1]=='u' && str[i+2]=='n' ? 6 : \
46  str[i]=='J' && str[i+1]=='u' && str[i+2]=='l' ? 7 : \
47  str[i]=='A' && str[i+1]=='u' && str[i+2]=='g' ? 8 : \
48  str[i]=='S' && str[i+1]=='e' && str[i+2]=='p' ? 9 : \
49  str[i]=='O' && str[i+1]=='c' && str[i+2]=='t' ? 10 : \
50  str[i]=='N' && str[i+1]=='o' && str[i+2]=='v' ? 11 : \
51  str[i]=='D' && str[i+1]=='e' && str[i+2]=='c' ? 12 : 0)
52 
53 // extract the information from the time string given by __TIME__ and __DATE__
54 #define __TIME_SECONDS__ CONV_STR2DEC_2(__TIME__, 6)
55 #define __TIME_MINUTES__ CONV_STR2DEC_2(__TIME__, 3)
56 #define __TIME_HOURS__ CONV_STR2DEC_2(__TIME__, 0)
57 #define __TIME_DAYS__ CONV_STR2DEC_2(__DATE__, 4)
58 #define __TIME_MONTH__ GET_MONTH(__DATE__, 0)
59 #define __TIME_YEARS__ CONV_STR2DEC_4(__DATE__, 7)
60 
61 // Days in February
62 #define _UNIX_TIMESTAMP_FDAY(year) \
63  (((year) % 400) == 0UL ? 29UL : \
64  (((year) % 100) == 0UL ? 28UL : \
65  (((year) % 4) == 0UL ? 29UL : \
66  28UL)))
67 
68 // Days in the year
69 #define _UNIX_TIMESTAMP_YDAY(year, month, day) \
70  ( \
71  /* January */ day \
72  /* February */ + (month >= 2 ? 31UL : 0UL) \
73  /* March */ + (month >= 3 ? _UNIX_TIMESTAMP_FDAY(year) : 0UL) \
74  /* April */ + (month >= 4 ? 31UL : 0UL) \
75  /* May */ + (month >= 5 ? 30UL : 0UL) \
76  /* June */ + (month >= 6 ? 31UL : 0UL) \
77  /* July */ + (month >= 7 ? 30UL : 0UL) \
78  /* August */ + (month >= 8 ? 31UL : 0UL) \
79  /* September */+ (month >= 9 ? 31UL : 0UL) \
80  /* October */ + (month >= 10 ? 30UL : 0UL) \
81  /* November */ + (month >= 11 ? 31UL : 0UL) \
82  /* December */ + (month >= 12 ? 30UL : 0UL) \
83  )
84 
85 // get the UNIX timestamp from a digits representation
86 #define _UNIX_TIMESTAMP(year, month, day, hour, minute, second) \
87  ( /* time */ second \
88  + minute * SEC_PER_MIN \
89  + hour * SEC_PER_HOUR \
90  + /* year day (month + day) */ (_UNIX_TIMESTAMP_YDAY(year, month, day) - 1) * SEC_PER_DAY \
91  + /* year */ (year - 1970UL) * SEC_PER_YEAR \
92  + ((year - 1969UL) / 4UL) * SEC_PER_DAY \
93  - ((year - 1901UL) / 100UL) * SEC_PER_DAY \
94  + ((year - 1601UL) / 400UL) * SEC_PER_DAY \
95  )
96 
97 // the UNIX timestamp
98 #define UNIX_TIMESTAMP _UNIX_TIMESTAMP(__TIME_YEARS__, __TIME_MONTH__, __TIME_DAYS__, __TIME_HOURS__, __TIME_MINUTES__, __TIME_SECONDS__)
99 #define UNIX_TIMESTAMP_UTC (UNIX_TIMESTAMP + (PST_OFFSET*SEC_PER_HOUR))
100 
101 #endif