517
527
libc_hidden_def (mktime)
518
528
libc_hidden_weak (timelocal)
534
not_equal_tm (const struct tm *a, const struct tm *b)
536
return ((a->tm_sec ^ b->tm_sec)
537
| (a->tm_min ^ b->tm_min)
538
| (a->tm_hour ^ b->tm_hour)
539
| (a->tm_mday ^ b->tm_mday)
540
| (a->tm_mon ^ b->tm_mon)
541
| (a->tm_year ^ b->tm_year)
542
| (a->tm_yday ^ b->tm_yday)
543
| (a->tm_isdst ^ b->tm_isdst));
547
print_tm (const struct tm *tp)
550
printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
551
tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
552
tp->tm_hour, tp->tm_min, tp->tm_sec,
553
tp->tm_yday, tp->tm_wday, tp->tm_isdst);
559
check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt)
561
if (tk != tl || !lt || not_equal_tm (&tmk, lt))
565
printf (")\nyields (");
567
printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl);
575
main (int argc, char **argv)
578
struct tm tm, tmk, tml;
583
if ((argc == 3 || argc == 4)
584
&& (sscanf (argv[1], "%d-%d-%d%c",
585
&tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
587
&& (sscanf (argv[2], "%d:%d:%d%c",
588
&tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
591
tm.tm_year -= TM_YEAR_BASE;
593
tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
596
lt = localtime (&tl);
602
printf ("mktime returns %ld == ", (long int) tl);
605
status = check_result (tl, tmk, tl, lt);
607
else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
609
time_t from = atol (argv[1]);
610
time_t by = atol (argv[2]);
611
time_t to = atol (argv[3]);
614
for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
616
lt = localtime (&tl);
621
status |= check_result (tk, tmk, tl, &tml);
625
printf ("localtime (%ld) yields 0\n", (long int) tl);
629
if ((tl1 < tl) != (by < 0))
633
for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
635
/* Null benchmark. */
636
lt = localtime (&tl);
641
status |= check_result (tk, tmk, tl, &tml);
645
printf ("localtime (%ld) yields 0\n", (long int) tl);
649
if ((tl1 < tl) != (by < 0))
655
\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
656
\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
657
\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
658
argv[0], argv[0], argv[0]);
667
compile-command: "gcc -DDEBUG -Wall -W -O -g mktime.c -o mktime"