text: /* Internals of mktime and related functions
     Copyright 2016-2020 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 General Public
     License as published by the Free Software Foundation; either
     version 3 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
     General Public License for more details.
  
     You should have received a copy of the GNU General Public
     License along with the GNU C Library; if not, see
     <https://www.gnu.org/licenses/>.  */
  
  #ifndef _LIBC
  # include <time.h>
  #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 as performed
     by FUNC.  Record next guess for localtime-gmtime offset in *OFFSET.  */
  extern __time64_t __mktime_internal (struct tm *tp,
                                       struct tm *(*func) (__time64_t const *,
                                                           struct tm *),
                                       mktime_offset_t *offset) attribute_hidden;
  