1 /* A little program to test the limits of your system's time functions
2 * See Porting/README.y2038 for details
11 /* Visual C++ 2008's difftime() can't do negative times */
12 double my_difftime(time_t left, time_t right) {
13 double diff = (double)left - (double)right;
17 void check_date_max( struct tm * (*date_func)(const time_t *), char *func_name ) {
24 for (i = 0; i <= 63; i++) {
25 date = (*date_func)(&time);
27 /* date_func() broke or tm_year overflowed */
28 if(date == NULL || date->tm_year < 69)
34 /* time_t overflowed */
35 if( time < last_time )
39 /* Binary search for the exact failure point */
41 time_change = last_time / 2;
46 date = (*date_func)(&time);
48 /* date_func() broke or tm_year overflowed or time_t overflowed */
49 if(date == NULL || date->tm_year < 69 || time < last_time) {
51 time_change = time_change / 2;
56 } while(time_change > 0);
58 printf("%20s max %.0f\n", func_name, my_difftime(last_time, Time_Zero));
62 void check_date_min( struct tm * (*date_func)(const time_t *), char *func_name ) {
69 for (i = 1; i <= 63; i++) {
70 date = (*date_func)(&time);
72 /* date_func() broke or tm_year underflowed */
73 if(date == NULL || date->tm_year > 70)
79 /* time_t underflowed */
80 if( time > last_time )
84 /* Binary search for the exact failure point */
86 time_change = last_time / 2;
91 date = (*date_func)(&time);
93 /* gmtime() broke or tm_year overflowed or time_t overflowed */
94 if(date == NULL || date->tm_year > 70 || time > last_time) {
96 time_change = time_change / 2;
101 } while(time_change < 0);
103 printf("%20s min %.0f\n", func_name, my_difftime(last_time, Time_Zero));
108 check_date_max(gmtime, "gmtime");
109 check_date_max(localtime, "localtime");
110 check_date_min(gmtime, "gmtime");
111 check_date_min(localtime, "localtime");