scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

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 }