10 time_t pt, pt_max, pt_min;
12 static char hexbuf[80];
16 sprintf (hexbuf, " -0x%016lx", -t);
18 sprintf (hexbuf, " 0x%016lx", t);
22 void gm_check (time_t t, int min_year, int max_year)
26 /* Check tm_year overflow */
27 tmp->tm_year < min_year || tmp->tm_year > max_year) {
29 fprintf (stderr, "gmtime (%ld) failed with errno %d\n", t, errno);
33 fprintf (stderr, "%3d:%s: %12ld-%02d-%02d %02d:%02d:%02d\n",
35 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
36 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
45 if (tmp == NULL || tmp->tm_year < 0) {
46 for (i = 63; i >= 0; i--) {
47 time_t x = pt | ((time_t)1 << i);
48 if (x < 0 || x < pt) continue;
49 gm_check (x, 69, 0x7fffffff);
61 for (i = 36; i >= 0; i--) {
62 time_t x = pt - ((time_t)1 << i);
64 gm_check (x, -1900, 70);
71 void lt_check (time_t t, int min_year, int max_year)
73 if (sizeof (time_t) > 4 && t > 0x7ffffffffffff000LL)
78 /* Check tm_year overflow */
79 tmp->tm_year < min_year || tmp->tm_year > max_year) {
81 fprintf (stderr, "localtime (%ld) failed with errno %d\n", t, errno);
85 fprintf (stderr, "%3d:%s: %12ld-%02d-%02d %02d:%02d:%02d\n",
87 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
88 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
97 if (tmp == NULL || tmp->tm_year < 0) {
98 for (i = 63; i >= 0; i--) {
99 time_t x = pt | ((time_t)1 << i);
100 if (x < 0 || x < pt) continue;
101 lt_check (x, 69, 0x7fffffff);
113 for (i = 36; i >= 0; i--) {
114 time_t x = pt - ((time_t)1 << i);
116 lt_check (x, -1900, 70);
123 int main (int argc, char *argv[])
125 time_t gm_max, gm_min, lt_max, lt_min;
126 if (argc > 1 && strcmp (argv[1], "-v") == 0) opt_v++;
128 check_gm_max (); gm_max = pt_max;
129 check_gm_min (); gm_min = pt_min;
130 check_lt_max (); lt_max = pt_max;
131 check_lt_min (); lt_min = pt_min;
134 printf ("======================\n");
135 printf ("Sizeof time_t = %ld\n", (i = sizeof (time_t)));
136 printf ("gmtime () boundaries:\n");
137 gm_check (gm_max, 69, 0x7fffffff);
138 gm_check (gm_min, -1900, 70);
139 printf ("localtime () boundaries:\n");
140 lt_check (lt_max, 69, 0x7fffffff);
141 lt_check (lt_min, -1900, 70);
142 printf ("Configure variables:\n");
143 printf ("sGMTIME_max='%ld'\n", gm_max);
144 printf ("sGMTIME_min='%ld'\n", gm_min);
145 printf ("sLOCALTIME_max='%ld'\n", lt_max);
146 printf ("sLOCALTIME_min='%ld'\n", lt_min);