scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

  1/*
  2output:
  3testing
  4test 0
  5tm_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
  6Wed Dec 30 12:30:59 2020 CET
  7Wed Dec 30 11:30:59 2020 UTC
  8Wed Dec 30 12:30:59 2020 CET
  9Wed Dec 30 12:30:59 2020
 10Wed Dec 30 12:30:59 2020
 11test 1
 12tm_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
 13Wed Dec 30 12:30:59 2020 CET
 14Wed Dec 30 13:30:59 2020 UTC
 15Wed Dec 30 12:30:59 2020 CET
 16Wed Dec 30 12:30:59 2020
 17Wed Dec 30 12:30:59 2020
 18test 2
 19tm_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
 20Wed Dec 30 12:30:59 2020 CET
 21Wed Dec 30 11:30:59 2020 UTC
 22Wed Dec 30 12:30:59 2020 CET
 23Wed Dec 30 12:30:59 2020
 24Wed Dec 30 12:30:59 2020
 25test 3
 26tm_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
 27Wed Dec 30 12:30:59 2020 CET
 28Wed Dec 30 13:30:59 2020 UTC
 29Wed Dec 30 12:30:59 2020 CET
 30Wed Dec 30 12:30:59 2020
 31Wed Dec 30 12:30:59 2020
 32test 4
 33tm_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
 34Wed Dec 30 12:30:59 2020 CET
 35Wed Dec 30 14:00:59 2020 UTC
 36Wed Dec 30 12:30:59 2020 CET
 37Wed Dec 30 12:30:59 2020
 38Wed Dec 30 12:30:59 2020
 39test 5
 40tm_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
 41Thu Jan 28 12:30:59 2021 CET
 42Thu Jan 28 13:30:59 2021 UTC
 43Thu Jan 28 12:30:59 2021 CET
 44Thu Jan 28 12:30:59 2021
 45Thu Jan 28 12:30:59 2021
 46test 6
 47tm_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
 48Thu Jan 28 12:30:59 2021 CET
 49Thu Jan 28 13:30:59 2021 UTC
 50Thu Jan 28 12:30:59 2021 CET
 51Thu Jan 28 12:30:59 2021
 52Thu Jan 28 12:30:59 2021
 53test 7
 54tm_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
 55Wed Jan  6 13:30:59 2021 CEST
 56Wed Jan  6 13:30:59 2021 UTC
 57Wed Jan  6 13:30:59 2021 CEST
 58Wed Jan  6 13:30:59 2021
 59Wed Jan  6 13:30:59 2021
 60test 8
 61tm_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
 62Wed Jan  6 10:30:59 2021 CEST
 63Wed Jan  6 13:30:59 2021 UTC
 64Wed Jan  6 10:30:59 2021 CEST
 65Wed Jan  6 10:30:59 2021
 66Wed Jan  6 10:30:59 2021
 67test 9
 68tm_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
 69Thu Jan 28 12:30:59 2021 CET
 70Thu Jan 28 13:30:59 2021 UTC
 71Thu Jan 28 12:30:59 2021 CET
 72Thu Jan 28 12:30:59 2021
 73Thu Jan 28 12:30:59 2021
 74test 10
 75tm_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
 76Wed Jan  6 13:30:59 2021 CEST
 77Wed Jan  6 13:30:59 2021 UTC
 78Wed Jan  6 13:30:59 2021 CEST
 79Wed Jan  6 13:30:59 2021
 80Wed Jan  6 13:30:59 2021
 81test 11
 82tm_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
 83Fri Jan  8 12:30:59 2021 CET
 84Fri Jan  8 13:30:59 2021 UTC
 85Fri Jan  8 12:30:59 2021 CET
 86Fri Jan  8 12:30:59 2021
 87Fri Jan  8 12:30:59 2021
 88test 12
 89tm_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
 90Fri Jan  8 13:30:59 2021 CEST
 91Fri Jan  8 13:30:59 2021 UTC
 92Fri Jan  8 13:30:59 2021 CEST
 93Fri Jan  8 13:30:59 2021
 94Fri Jan  8 13:30:59 2021
 95test 13
 96tm_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
 97Thu Feb 29 12:30:59 2024 CET
 98Thu Feb 29 13:30:59 2024 UTC
 99Thu Feb 29 12:30:59 2024 CET
100Thu Feb 29 12:30:59 2024
101Thu Feb 29 12:30:59 2024
102test 14
103tm_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
104Fri Mar  1 13:30:59 2024 CEST
105Fri Mar  1 13:30:59 2024 UTC
106Fri Mar  1 13:30:59 2024 CEST
107Fri Mar  1 13:30:59 2024
108Fri Mar  1 13:30:59 2024
109test 15
110tm_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
111Mon Jan  4 02:30:59 2021 CET
112Mon Jan  4 03:30:59 2021 UTC
113Mon Jan  4 02:30:59 2021 CET
114Mon Jan  4 02:30:59 2021
115Mon Jan  4 02:30:59 2021
116done
117end:
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
128struct 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
151char *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 */
167char *
168getenv(const char *name)
169{
170	if (strcmp(name, "TZ") != 0)
171		return NULL;
172	return faketz;
173}
174#endif
175
176int
177test(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
234int
235main(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}