1 /* A little program to test the limits of your system's time functions */
9 /* Visual C++ 2008's difftime() can't do negative times */
10 double my_difftime(time_t left, time_t right) {
11 double diff = (double)left - (double)right;
15 void check_date_max( struct tm * (*date_func)(const time_t *), char *func_name ) {
22 for (i = 0; i <= 63; i++) {
23 date = (*date_func)(&time);
25 /* date_func() broke or tm_year overflowed */
26 if(date == NULL || date->tm_year < 69)
32 /* time_t overflowed */
33 if( time < last_time )
37 /* Binary search for the exact failure point */
39 time_change = last_time / 2;
44 date = (*date_func)(&time);
46 /* date_func() broke or tm_year overflowed or time_t overflowed */
47 if(date == NULL || date->tm_year < 69 || time < last_time) {
49 time_change = time_change / 2;
54 } while(time_change > 0);
56 printf("%20s max %.0f\n", func_name, my_difftime(last_time, Time_Zero));
60 void check_date_min( struct tm * (*date_func)(const time_t *), char *func_name ) {
67 for (i = 1; i <= 63; i++) {
68 date = (*date_func)(&time);
70 /* date_func() broke or tm_year underflowed */
71 if(date == NULL || date->tm_year > 70)
77 /* time_t underflowed */
78 if( time > last_time )
82 /* Binary search for the exact failure point */
84 time_change = last_time / 2;
89 date = (*date_func)(&time);
91 /* gmtime() broke or tm_year overflowed or time_t overflowed */
92 if(date == NULL || date->tm_year > 70 || time > last_time) {
94 time_change = time_change / 2;
99 } while(time_change < 0);
101 printf("%20s min %.0f\n", func_name, my_difftime(last_time, Time_Zero));
106 check_date_max(gmtime, "gmtime");
107 check_date_max(localtime, "localtime");
108 check_date_min(gmtime, "gmtime");
109 check_date_min(localtime, "localtime");