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