scc

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

commit 6f398a9c2a1945a198d8d87bba69926069392075
parent 56f71b43eec528d053af918f5ac199b5c38c7811
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Mon, 27 Apr 2026 16:53:01 +0200

tests/libc: Add 0072-mktime

Diffstat:
Mtests/libc/execute/.gitignore | 1+
Atests/libc/execute/0072-mktime.c | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/libc/execute/libc-tests.lst | 1+
3 files changed, 247 insertions(+), 0 deletions(-)

diff --git a/tests/libc/execute/.gitignore b/tests/libc/execute/.gitignore @@ -70,3 +70,4 @@ test.log 0069-mktime 0070-difftime 0071-clock +0072-mktime diff --git a/tests/libc/execute/0072-mktime.c b/tests/libc/execute/0072-mktime.c @@ -0,0 +1,245 @@ +/* +output: +testing +test 0 +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 +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 11:30:59 2020 UTC +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 12:30:59 2020 +Wed Dec 30 12:30:59 2020 +test 1 +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 +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 13:30:59 2020 UTC +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 12:30:59 2020 +Wed Dec 30 12:30:59 2020 +test 2 +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 +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 11:30:59 2020 UTC +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 12:30:59 2020 +Wed Dec 30 12:30:59 2020 +test 3 +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 +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 13:30:59 2020 UTC +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 12:30:59 2020 +Wed Dec 30 12:30:59 2020 +test 4 +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 +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 14:00:59 2020 UTC +Wed Dec 30 12:30:59 2020 CET +Wed Dec 30 12:30:59 2020 +Wed Dec 30 12:30:59 2020 +test 5 +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 +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 13:30:59 2021 UTC +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 12:30:59 2021 +Thu Jan 28 12:30:59 2021 +test 6 +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 +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 13:30:59 2021 UTC +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 12:30:59 2021 +Thu Jan 28 12:30:59 2021 +test 7 +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 +Wed Jan 6 13:30:59 2021 CEST +Wed Jan 6 13:30:59 2021 UTC +Wed Jan 6 13:30:59 2021 CEST +Wed Jan 6 13:30:59 2021 +Wed Jan 6 13:30:59 2021 +test 8 +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 +Wed Jan 6 10:30:59 2021 CEST +Wed Jan 6 13:30:59 2021 UTC +Wed Jan 6 10:30:59 2021 CEST +Wed Jan 6 10:30:59 2021 +Wed Jan 6 10:30:59 2021 +test 9 +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 +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 13:30:59 2021 UTC +Thu Jan 28 12:30:59 2021 CET +Thu Jan 28 12:30:59 2021 +Thu Jan 28 12:30:59 2021 +test 10 +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 +Wed Jan 6 13:30:59 2021 CEST +Wed Jan 6 13:30:59 2021 UTC +Wed Jan 6 13:30:59 2021 CEST +Wed Jan 6 13:30:59 2021 +Wed Jan 6 13:30:59 2021 +test 11 +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 +Fri Jan 8 12:30:59 2021 CET +Fri Jan 8 13:30:59 2021 UTC +Fri Jan 8 12:30:59 2021 CET +Fri Jan 8 12:30:59 2021 +Fri Jan 8 12:30:59 2021 +test 12 +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 +Fri Jan 8 13:30:59 2021 CEST +Fri Jan 8 13:30:59 2021 UTC +Fri Jan 8 13:30:59 2021 CEST +Fri Jan 8 13:30:59 2021 +Fri Jan 8 13:30:59 2021 +test 13 +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 +Thu Feb 29 12:30:59 2024 CET +Thu Feb 29 13:30:59 2024 UTC +Thu Feb 29 12:30:59 2024 CET +Thu Feb 29 12:30:59 2024 +Thu Feb 29 12:30:59 2024 +test 14 +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 +Fri Mar 1 13:30:59 2024 CEST +Fri Mar 1 13:30:59 2024 UTC +Fri Mar 1 13:30:59 2024 CEST +Fri Mar 1 13:30:59 2024 +Fri Mar 1 13:30:59 2024 +test 15 +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 +Mon Jan 4 02:30:59 2021 CET +Mon Jan 4 03:30:59 2021 UTC +Mon Jan 4 02:30:59 2021 CET +Mon Jan 4 02:30:59 2021 +Mon Jan 4 02:30:59 2021 +done +end: +*/ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#define NELEM(x) (sizeof(x)/sizeof((x)[0])) + +struct test { + struct tm tm; + char *tz; +} tests[] = { + //sec,min,hour,mday,mon,year,wday,yday,isdst,tz, + {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-1"}, + {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01"}, + {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-01"}, + {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:00"}, + {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:30"}, + {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST3"}, + {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,4,8"}, + {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,4,8"}, + {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST3,4,8"}, + {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"}, + {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"}, + {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"}, + {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,8"}, + {{ 59, 30, 12, 29, 1, 124, 0, 0, 0},"CET01CEST,J60,J80"}, + {{ 59, 30, 12, 1, 2, 124, 0, 0, 0},"CET01CEST,J60,J80"}, + {{ 59, 30, 2, 4, 0, 121, 0, 0, 0},"CET01CEST,J4/03,8/4"}, +}; + +char *faketz; + +#ifndef __unix__ +#define putenv(x) (x) +/* + * Ok, this is by definition undefined behaviour because + * we are using the name of a library function. The reallity + * is that if you use a static linker then this would + * overload the libc getenv and it will work as expected, + * but if you use a dynamic linker then the internal + * references will be tied to the internal getenv function + * and this would not work. For our main use case that is + * testing scc libc this is good enough, and with the + * fallback to putenv and unsetenv this will work in + * the systems we are interested on + */ +char * +getenv(const char *name) +{ + if (strcmp(name, "TZ") != 0) + return NULL; + return faketz; +} +#endif + +int +test(void) +{ + time_t t; + char buf[70], var[70], *tz; + struct tm *tm; + struct test *tp; + + for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { + printf("test %d\n", (int) (tp - tests)); + tz = tp->tz; + if (!tz) + tz = "UTC"; + faketz = tz; + sprintf(var, "TZ=%s", tz); + putenv(var); + + t = mktime(&tp->tm); + if (t == -1) { + puts("failed"); + continue; + } + printf("tm_sec=%2d, " + "tm_min=%2d, " + "tm_hour=%2d, " + "tm_mday=%2d, " + "tm_mon=%2d, " + "tm_year=%4d, " + "tm_wday=%d, " + "tm_yday=%3d, " + "tm_isdst=%d\n", + tp->tm.tm_sec, + tp->tm.tm_min, + tp->tm.tm_hour, + tp->tm.tm_mday, + tp->tm.tm_mon, + tp->tm.tm_year, + tp->tm.tm_wday, + tp->tm.tm_yday, + tp->tm.tm_isdst); + strftime(buf, sizeof(buf), "%c %Z", &tp->tm); + puts(buf); + + tm = gmtime(&t); + strftime(buf, sizeof(buf), "%c %Z", tm); + puts(buf); + + tm = localtime(&t); + strftime(buf, sizeof(buf), "%c %Z", tm); + puts(buf); + + fputs(asctime(tm), stdout); + fputs(ctime(&t), stdout); + } + + return 0; +} + +int +main(void) +{ +#if !defined(__unix__) && !defined(__SCC_TZ_TIME__) + puts("RESULT: SKIP"); + return 0; +#endif + puts("testing"); + test(); + puts("done"); + return 0; +} diff --git a/tests/libc/execute/libc-tests.lst b/tests/libc/execute/libc-tests.lst @@ -68,3 +68,4 @@ 0069-mktime 0070-difftime 0071-clock +0072-mktime