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
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include <math.h>
int main() {
time_t xmas2002 = 1040786563ll;
struct tm* tm_ptr;
// Make sure stime() always fails.
printf("stime: %d\n", stime(&xmas2002));
// Verify that tzname sets *something*.
tzset();
printf("tzname[0] set: %d\n", strlen(tzname[0]) >= 3);
printf("tzname[1] set: %d\n", strlen(tzname[1]) >= 3);
// Verify gmtime() creates correct struct.
tm_ptr = gmtime(&xmas2002);
printf("sec: %d\n", tm_ptr->tm_sec);
printf("min: %d\n", tm_ptr->tm_min);
printf("hour: %d\n", tm_ptr->tm_hour);
printf("day: %d\n", tm_ptr->tm_mday);
printf("mon: %d\n", tm_ptr->tm_mon);
printf("year: %d\n", tm_ptr->tm_year);
printf("wday: %d\n", tm_ptr->tm_wday);
printf("yday: %d\n", tm_ptr->tm_yday);
printf("dst: %d\n", tm_ptr->tm_isdst);
printf("off: %d\n", tm_ptr->tm_gmtoff);
printf("zone: %s\n", tm_ptr->tm_zone);
// Verify timegm() reverses gmtime.
printf("timegm <-> gmtime: %d\n", timegm(tm_ptr) == xmas2002);
// Verify gmtime_r() doesn't clobber static data.
time_t t1 = 0;
struct tm tm1;
gmtime_r(&t1, &tm1);
printf("old year: %d\n", tm_ptr->tm_year);
printf("new year: %d\n", tm1.tm_year);
gmtime(&xmas2002);
printf("old year again: %d\n", tm_ptr->tm_year);
// Verify localtime() picks up timezone data.
time_t t2 = xmas2002 - 60 * 60 * 24 * 30 * 6;
tm_ptr = localtime(&t2);
time_t dst_diff = (tm_ptr->tm_isdst == 1) ? tm_ptr->tm_isdst * 60 * 60 : 0;
printf("localtime timezone: %d\n", (_timezone + tm_ptr->tm_gmtoff == dst_diff)); // glibc needs
printf("localtime daylight: %d\n", _daylight == tm_ptr->tm_isdst); // no prefix "_"s
printf("localtime tzname: %d\n", (!strcmp(tzname[0], tm_ptr->tm_zone) ||
!strcmp(tzname[1], tm_ptr->tm_zone)));
// Verify localtime() and mktime() reverse each other.
printf("localtime <-> mktime: %d\n", mktime(localtime(&xmas2002)) == xmas2002);
// Verify localtime_r() doesn't clobber static data.
time_t t3 = 0;
struct tm tm2;
localtime_r(&t3, &tm2);
printf("localtime_r(1): %d\n", tm2.tm_year != tm_ptr->tm_year);
localtime(&xmas2002);
printf("localtime_r(2): %d\n", tm2.tm_year != tm_ptr->tm_year);
// Verify time() returns reasonable value (between 2011 and 2030).
time_t t4 = 0;
time(&t4);
timespec ts;
assert(clock_gettime(0, &ts) == 0);
assert(abs(ts.tv_sec - t4) <= 2);
printf("time: %d\n", t4 > 1309635200ll && t4 < 1893362400ll);
// Verify difftime() calculates accurate time difference.
time_t t5 = 1309635200ll;
printf("difftime+: %lf\n", difftime(t5, xmas2002));
printf("difftime-: %lf\n", difftime(xmas2002, t5));
// Verify dysize() knows its leap years.
printf("1854 days: %d\n", dysize(1854));
printf("2000 days: %d\n", dysize(2000));
printf("2001 days: %d\n", dysize(2001));
printf("2004 days: %d\n", dysize(2004));
// Verify asctime() formatting().
printf("asctime: %s", asctime(gmtime(&xmas2002)));
// Verify asctime_r() doesn't clobber static data.
time_t t6 = 1309635200ll;
tm_ptr = gmtime(&xmas2002);
char* formatted = asctime(tm_ptr);
char buffer[32];
asctime_r(gmtime(&t6), buffer);
printf("old asctime: %s", formatted);
printf("new asctime_r: %s", buffer);
asctime_r(tm_ptr, buffer);
printf("old asctime again: %s", formatted);
// Verify that clock() advances.
time_t start_t = time(NULL);
clock_t start = clock();
printf("clock(start): %d\n", start >= 0);
while (clock() - start < 2 * CLOCKS_PER_SEC); // Poor man's sleep().
clock_t diff = time(NULL) - start_t;
printf("clock(end): %d\n", diff >= 2 && diff < 30);
// Verify that ctime_r(x, buf) is equivalent to asctime_r(localtime(x), buf).
time_t t7 = time(0);
char buffer2[30];
char buffer3[30];
printf("ctime: %d\n", strcmp(ctime_r(&t7, buffer2),
asctime_r(localtime(&t7), buffer3)));
return 0;
}
|