scc

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

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