-
Notifications
You must be signed in to change notification settings - Fork 3
/
time64.h
137 lines (112 loc) · 3 KB
/
time64.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/** @file
* @private
*/
#ifndef TIME64_H
# define TIME64_H
#include <time.h>
//#include "time64_config.h"
#ifdef __cplusplus
extern "C" {
#endif
/* INT_64_T
A 64 bit integer type to use to store time and others.
Must be defined.
*/
#define INT_64_T int64_t
/* USE_TM64
Should we use a 64 bit safe replacement for tm? This will
let you go past year 2 billion but the struct will be incompatible
with tm. Conversion functions will be provided.
*/
#define USE_TM64
#define HAS_GMTIME_R
#define HAS_LOCALTIME_R
/* #define HAS_TIMEGM */
#define HAS_TM_TM_GMTOFF
#define HAS_TM_TM_ZONE
//#define USE_SYSTEM_LOCALTIME
/* #define USE_SYSTEM_GMTIME */
//#define USE_SYSTEM_MKTIME
/* #define USE_SYSTEM_TIMEGM */
/* Set our custom types */
typedef INT_64_T Int64;
typedef Int64 Time64_T;
typedef Int64 Year;
#ifndef PRId64
# if (__WORDSIZE == 64) && !defined(__APPLE__)
# define PRId64 "ld"
# else
# define PRId64 "lld"
# endif
#endif
/**
* A copy of the tm struct but with a 64 bit year
* @private
*/
struct TM64 {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
Year tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
#ifdef HAS_TM_TM_GMTOFF
long tm_gmtoff;
#endif
#ifdef HAS_TM_TM_ZONE
const char *tm_zone;
#endif
};
#ifdef HAS_TM_TM_GMTOFF
#define HAS_TM_TM_GMTOFF_INIT 0 ,
#else
#define HAS_TM_TM_GMTOFF_INIT
#endif
#ifdef HAS_TM_TM_ZONE
#define HAS_TM_TM_ZONE_INIT 0 ,
#else
#define HAS_TM_TM_ZONE_INIT
#endif
#define TM_INIT {0,0,0, 0,0,0, 0,0,0, HAS_TM_TM_GMTOFF_INIT HAS_TM_TM_ZONE_INIT }
/* Decide which tm struct to use */
#ifdef USE_TM64
#define TM TM64
#else
#define TM tm
#endif
/* Declare public functions */
struct TM *gmtime64_r (const Time64_T *, struct TM *);
struct TM *localtime64_r (const Time64_T *, struct TM *);
struct TM *gmtime64 (const Time64_T *);
struct TM *localtime64 (const Time64_T *);
char *asctime64 (const struct TM *);
char *asctime64_r (const struct TM *, char *);
char *ctime64 (const Time64_T*);
char *ctime64_r (const Time64_T*, char*);
Time64_T timegm64 (const struct TM *);
Time64_T mktime64 (struct TM *);
Time64_T timelocal64 (struct TM *);
/* Not everyone has gm/localtime_r(), provide a replacement */
#ifdef HAS_LOCALTIME_R
# define LOCALTIME_R(clock, result) localtime_r(clock, result)
#else
# define LOCALTIME_R(clock, result) fake_localtime_r(clock, result)
#endif
#ifdef HAS_GMTIME_R
# define GMTIME_R(clock, result) gmtime_r(clock, result)
#else
# define GMTIME_R(clock, result) fake_gmtime_r(clock, result)
#endif
/* Use a different asctime format depending on how big the year is */
#ifdef USE_TM64
#define TM64_ASCTIME_FORMAT "%.3s %.3s%3d %.2d:%.2d:%.2d %"PRId64"\n"
#else
#define TM64_ASCTIME_FORMAT "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n"
#endif
#ifdef __cplusplus
};
#endif
#endif