0069-mktime.c (6806B)
1 /* 2 output: 3 testing 4 test 0 5 tm_sec= 0, tm_min= 3, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 6 Fri Jan 1 00:03:00 2021 UTC 7 Fri Jan 1 00:03:00 2021 UTC 8 Fri Jan 1 00:03:00 2021 UTC 9 Fri Jan 1 00:03:00 2021 10 Fri Jan 1 00:03:00 2021 11 test 1 12 tm_sec=50, tm_min=30, tm_hour=23, tm_mday=31, tm_mon=11, tm_year= 120, tm_wday=4, tm_yday=365, tm_isdst=0 13 Thu Dec 31 23:30:50 2020 UTC 14 Thu Dec 31 23:30:50 2020 UTC 15 Thu Dec 31 23:30:50 2020 UTC 16 Thu Dec 31 23:30:50 2020 17 Thu Dec 31 23:30:50 2020 18 test 2 19 tm_sec=59, tm_min=30, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 20 Fri Jan 1 00:30:59 2021 UTC 21 Fri Jan 1 00:30:59 2021 UTC 22 Fri Jan 1 00:30:59 2021 UTC 23 Fri Jan 1 00:30:59 2021 24 Fri Jan 1 00:30:59 2021 25 test 3 26 tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0 27 Wed Dec 30 12:30:59 2020 UTC 28 Wed Dec 30 12:30:59 2020 UTC 29 Wed Dec 30 12:30:59 2020 UTC 30 Wed Dec 30 12:30:59 2020 31 Wed Dec 30 12:30:59 2020 32 test 4 33 tm_sec=59, tm_min=30, tm_hour=12, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 34 Fri Jan 1 12:30:59 2021 UTC 35 Fri Jan 1 12:30:59 2021 UTC 36 Fri Jan 1 12:30:59 2021 UTC 37 Fri Jan 1 12:30:59 2021 38 Fri Jan 1 12:30:59 2021 39 test 5 40 tm_sec=59, tm_min=59, tm_hour=23, tm_mday=31, tm_mon=11, tm_year= 120, tm_wday=4, tm_yday=365, tm_isdst=0 41 Thu Dec 31 23:59:59 2020 UTC 42 Thu Dec 31 23:59:59 2020 UTC 43 Thu Dec 31 23:59:59 2020 UTC 44 Thu Dec 31 23:59:59 2020 45 Thu Dec 31 23:59:59 2020 46 test 6 47 tm_sec= 0, tm_min= 3, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 48 Fri Jan 1 00:03:00 2021 UTC 49 Fri Jan 1 00:03:00 2021 UTC 50 Fri Jan 1 00:03:00 2021 UTC 51 Fri Jan 1 00:03:00 2021 52 Fri Jan 1 00:03:00 2021 53 test 7 54 tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0 55 Wed Dec 30 12:30:59 2020 UTC 56 Wed Dec 30 12:30:59 2020 UTC 57 Wed Dec 30 12:30:59 2020 UTC 58 Wed Dec 30 12:30:59 2020 59 Wed Dec 30 12:30:59 2020 60 test 8 61 tm_sec=59, tm_min=30, tm_hour=12, tm_mday=20, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 19, tm_isdst=0 62 Wed Jan 20 12:30:59 2021 UTC 63 Wed Jan 20 12:30:59 2021 UTC 64 Wed Jan 20 12:30:59 2021 UTC 65 Wed Jan 20 12:30:59 2021 66 Wed Jan 20 12:30:59 2021 67 test 9 68 tm_sec=59, tm_min=59, tm_hour=23, tm_mday=31, tm_mon=11, tm_year= 120, tm_wday=4, tm_yday=365, tm_isdst=0 69 Thu Dec 31 23:59:59 2020 UTC 70 Thu Dec 31 23:59:59 2020 UTC 71 Thu Dec 31 23:59:59 2020 UTC 72 Thu Dec 31 23:59:59 2020 73 Thu Dec 31 23:59:59 2020 74 test 10 75 tm_sec= 0, tm_min= 0, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 76 Fri Jan 1 00:00:00 2021 UTC 77 Fri Jan 1 00:00:00 2021 UTC 78 Fri Jan 1 00:00:00 2021 UTC 79 Fri Jan 1 00:00:00 2021 80 Fri Jan 1 00:00:00 2021 81 test 11 82 tm_sec=59, tm_min=38, tm_hour=12, tm_mday=10, tm_mon=11, tm_year= 33, tm_wday=0, tm_yday=343, tm_isdst=0 83 Sun Dec 10 12:38:59 1933 UTC 84 Sun Dec 10 12:38:59 1933 UTC 85 Sun Dec 10 12:38:59 1933 UTC 86 Sun Dec 10 12:38:59 1933 87 Sun Dec 10 12:38:59 1933 88 test 12 89 tm_sec=59, tm_min=38, tm_hour=12, tm_mday=12, tm_mon=11, tm_year= 33, tm_wday=2, tm_yday=345, tm_isdst=0 90 Tue Dec 12 12:38:59 1933 UTC 91 Tue Dec 12 12:38:59 1933 UTC 92 Tue Dec 12 12:38:59 1933 UTC 93 Tue Dec 12 12:38:59 1933 94 Tue Dec 12 12:38:59 1933 95 test 13 96 tm_wday=200, tm_yday=500 97 failed 98 test 14 99 tm_sec= 0, tm_min= 3, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 100 Fri Jan 1 00:03:00 2021 UTC 101 Fri Jan 1 00:03:00 2021 UTC 102 Fri Jan 1 00:03:00 2021 UTC 103 Fri Jan 1 00:03:00 2021 104 Fri Jan 1 00:03:00 2021 105 test 15 106 tm_sec= 0, tm_min= 3, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 107 Fri Jan 1 00:03:00 2021 UTC 108 Fri Jan 1 00:03:00 2021 UTC 109 Fri Jan 1 00:03:00 2021 UTC 110 Fri Jan 1 00:03:00 2021 111 Fri Jan 1 00:03:00 2021 112 test 16 113 tm_sec= 0, tm_min= 3, tm_hour= 0, tm_mday= 1, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 0, tm_isdst=0 114 Fri Jan 1 00:03:00 2021 UTC 115 Fri Jan 1 00:03:00 2021 UTC 116 Fri Jan 1 00:03:00 2021 UTC 117 Fri Jan 1 00:03:00 2021 118 Fri Jan 1 00:03:00 2021 119 done 120 end: 121 */ 122 123 #include <limits.h> 124 #include <stdio.h> 125 #include <stdlib.h> 126 #include <string.h> 127 #include <time.h> 128 129 #define NELEM(x) (sizeof(x)/sizeof((x)[0])) 130 131 struct test { 132 struct tm tm; 133 int fail; 134 } tests[] = { 135 //sec,min,hour,mday,mon,year,wday,yday,isdst,fail 136 {{ 60, 62, 23, 31, 11, 120, 200, 500}}, 137 {{ 50, 30, -1, 1, 0, 121}}, 138 {{ 59, 30, 24, 31, 11, 120}}, 139 {{ 59, 30, 12, -1, 0, 121}}, 140 {{ 59, 30, 12, 32, 11, 120}}, 141 {{ 59, -1, 0, 1, 0, 121}}, 142 {{ 60, 62, 23, 31, 11, 120}}, 143 {{ 59, 30, 12, 30, -1, 121}}, 144 {{ 59, 30, 12, 20, 12, 120}}, 145 {{ -1, 0, 0, 1, 0, 121}}, 146 {{ 60, 59, 23, 31, 11, 120}}, 147 {{ 59, 38, 12, 10, 11, 33}}, 148 {{ 59, 38, 12, 12, 11, 33}}, 149 {{ 72, 38, 1, 31, 15,INT_MAX, 200, 500}, 1}, 150 {{ 60, 62, 23, 31, 11, 120, 0, 0, 1}}, 151 {{ 60, 62, 23, 31, 11, 120, 0, 0, 0}}, 152 {{ 60, 62, 23, 31, 11, 120, 0, 0, -1}}, 153 }; 154 155 #ifndef __unix__ 156 #define putenv(x) (x) 157 /* 158 * Ok, this is by definition undefined behaviour because 159 * we are using the name of a library function. The reallity 160 * is that if you use a static linker then this would 161 * overload the libc getenv and it will work as expected, 162 * but if you use a dynamic linker then the internal 163 * references will be tied to the internal getenv function 164 * and this would not work. For our main use case that is 165 * testing scc libc this is good enough, and with the 166 * fallback to putenv this will work in the systems we are 167 * interested on 168 */ 169 char * 170 getenv(const char *name) 171 { 172 if (strcmp(name, "TZ") != 0) 173 return NULL; 174 return "UTC"; 175 } 176 #endif 177 178 int 179 main(void) 180 { 181 time_t t; 182 char buf[70]; 183 struct tm *tm; 184 struct test *tp; 185 186 puts("testing"); 187 putenv("TZ=UTC"); 188 for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { 189 printf("test %d\n", (int) (tp - tests)); 190 t = mktime(&tp->tm); 191 if (tp->fail) { 192 printf("tm_wday=%d, tm_yday=%d\n", 193 tp->tm.tm_wday, tp->tm.tm_yday); 194 puts(t == (time_t) -1 ? "failed" : "not failed"); 195 continue; 196 } 197 printf("tm_sec=%2d, " 198 "tm_min=%2d, " 199 "tm_hour=%2d, " 200 "tm_mday=%2d, " 201 "tm_mon=%2d, " 202 "tm_year=%4d, " 203 "tm_wday=%d, " 204 "tm_yday=%3d, " 205 "tm_isdst=%d\n", 206 tp->tm.tm_sec, 207 tp->tm.tm_min, 208 tp->tm.tm_hour, 209 tp->tm.tm_mday, 210 tp->tm.tm_mon, 211 tp->tm.tm_year, 212 tp->tm.tm_wday, 213 tp->tm.tm_yday, 214 tp->tm.tm_isdst); 215 strftime(buf, sizeof(buf), "%c %Z", &tp->tm); 216 puts(buf); 217 218 tm = gmtime(&t); 219 strftime(buf, sizeof(buf), "%c %Z", tm); 220 puts(buf); 221 222 tm = localtime(&t); 223 strftime(buf, sizeof(buf), "%c %Z", tm); 224 puts(buf); 225 226 fputs(asctime(tm), stdout); 227 fputs(ctime(&t), stdout); 228 } 229 puts("done"); 230 231 return 0; 232 } 233