1 /* A helper tool for perl's 2038 support.
2 * See Porting/README.y2038 for details
14 time_t pt, pt_max, pt_min;
16 static char hexbuf[80];
20 sprintf (hexbuf, " -0x%016lx", -t);
22 sprintf (hexbuf, " 0x%016lx", t);
26 void gm_check (time_t t, int min_year, int max_year)
30 /* Check tm_year overflow */
31 tmp->tm_year < min_year || tmp->tm_year > max_year) {
33 fprintf (stderr, "gmtime (%ld) failed with errno %d\n", t, errno);
37 fprintf (stderr, "%3d:%s: %12ld-%02d-%02d %02d:%02d:%02d\n",
39 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
40 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
49 if (tmp == NULL || tmp->tm_year < 0) {
50 for (i = 63; i >= 0; i--) {
51 time_t x = pt | ((time_t)1 << i);
52 if (x < 0 || x < pt) continue;
53 gm_check (x, 69, 0x7fffffff);
65 for (i = 36; i >= 0; i--) {
66 time_t x = pt - ((time_t)1 << i);
68 gm_check (x, -1900, 70);
75 void lt_check (time_t t, int min_year, int max_year)
77 if (sizeof (time_t) > 4 && t > 0x7ffffffffffff000LL)
82 /* Check tm_year overflow */
83 tmp->tm_year < min_year || tmp->tm_year > max_year) {
85 fprintf (stderr, "localtime (%ld) failed with errno %d\n", t, errno);
89 fprintf (stderr, "%3d:%s: %12ld-%02d-%02d %02d:%02d:%02d\n",
91 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
92 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
101 if (tmp == NULL || tmp->tm_year < 0) {
102 for (i = 63; i >= 0; i--) {
103 time_t x = pt | ((time_t)1 << i);
104 if (x < 0 || x < pt) continue;
105 lt_check (x, 69, 0x7fffffff);
117 for (i = 36; i >= 0; i--) {
118 time_t x = pt - ((time_t)1 << i);
120 lt_check (x, -1900, 70);
127 int main (int argc, char *argv[])
129 time_t gm_max, gm_min, lt_max, lt_min;
130 if (argc > 1 && strcmp (argv[1], "-v") == 0) opt_v++;
132 check_gm_max (); gm_max = pt_max;
133 check_gm_min (); gm_min = pt_min;
134 check_lt_max (); lt_max = pt_max;
135 check_lt_min (); lt_min = pt_min;
138 printf ("======================\n");
139 printf ("Sizeof time_t = %ld\n", (i = sizeof (time_t)));
140 printf ("gmtime () boundaries:\n");
141 gm_check (gm_max, 69, 0x7fffffff);
142 gm_check (gm_min, -1900, 70);
143 printf ("localtime () boundaries:\n");
144 lt_check (lt_max, 69, 0x7fffffff);
145 lt_check (lt_min, -1900, 70);
146 printf ("Configure variables:\n");
147 printf ("sGMTIME_max='%ld'\n", gm_max);
148 printf ("sGMTIME_min='%ld'\n", gm_min);
149 printf ("sLOCALTIME_max='%ld'\n", lt_max);
150 printf ("sLOCALTIME_min='%ld'\n", lt_min);