| /* Internals of mktime and related functions | |
| Copyright 2016-2026 Free Software Foundation, Inc. | |
| This file is part of the GNU C Library. | |
| Contributed by Paul Eggert <eggert@cs.ucla.edu>. | |
| The GNU C Library is free software; you can redistribute it and/or | |
| modify it under the terms of the GNU Lesser General Public | |
| License as published by the Free Software Foundation; either | |
| version 2.1 of the License, or (at your option) any later version. | |
| The GNU C Library is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| Lesser General Public License for more details. | |
| You should have received a copy of the GNU Lesser General Public | |
| License along with the GNU C Library; if not, see | |
| <https://www.gnu.org/licenses/>. */ | |
| #ifndef _LIBC | |
| # include <time.h> | |
| # define __libc_lock_lock(lock) ((void) 0) | |
| # define __libc_lock_unlock(lock) ((void) 0) | |
| # define __tzset_unlocked() tzset () | |
| #endif | |
| /* mktime_offset_t is a signed type wide enough to hold a UTC offset | |
| in seconds, and used as part of the type of the offset-guess | |
| argument to mktime_internal. In Glibc, it is always long int. | |
| When in Gnulib, use time_t on platforms where time_t | |
| is signed, to be compatible with platforms like BeOS that export | |
| this implementation detail of mktime. On platforms where time_t is | |
| unsigned, GNU and POSIX code can assume 'int' is at least 32 bits | |
| which is wide enough for a UTC offset. */ | |
| #ifdef _LIBC | |
| typedef long int mktime_offset_t; | |
| #elif defined TIME_T_IS_SIGNED | |
| typedef time_t mktime_offset_t; | |
| #else | |
| typedef int mktime_offset_t; | |
| #endif | |
| /* The source code uses identifiers like __time64_t for glibc | |
| timestamps that can contain 64-bit values even when time_t is only | |
| 32 bits. These are just macros for the ordinary identifiers unless | |
| compiling within glibc when time_t is 32 bits. */ | |
| #if ! (defined _LIBC && __TIMESIZE != 64) | |
| # undef __time64_t | |
| # define __time64_t time_t | |
| # define __gmtime64_r __gmtime_r | |
| # define __localtime64_r __localtime_r | |
| # define __mktime64 mktime | |
| # define __timegm64 timegm | |
| #endif | |
| #ifndef _LIBC | |
| /* Although glibc source code uses leading underscores, Gnulib wants | |
| ordinary names. | |
| Portable standalone applications should supply a <time.h> that | |
| declares a POSIX-compliant localtime_r, for the benefit of older | |
| implementations that lack localtime_r or have a nonstandard one. | |
| Similarly for gmtime_r. See the gnulib time_r module for one way | |
| to implement this. */ | |
| # undef __gmtime_r | |
| # undef __localtime_r | |
| # define __gmtime_r gmtime_r | |
| # define __localtime_r localtime_r | |
| # define __mktime_internal mktime_internal | |
| #endif | |
| /* Subroutine of mktime. Return the time_t representation of TP and | |
| normalize TP, given that a struct tm * maps to a time_t. If | |
| LOCAL, the mapping is performed by localtime_r, otherwise by gmtime_r. | |
| Record next guess for localtime-gmtime offset in *OFFSET. | |
| If _LIBC, the caller must lock __tzset_lock. */ | |
| extern __time64_t __mktime_internal (struct tm *tp, bool local, | |
| mktime_offset_t *offset) attribute_hidden; |