1 /* Internals of mktime and related functions 2 Copyright 2016-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 Contributed by Paul Eggert <eggert@cs.ucla.edu>. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <https://www.gnu.org/licenses/>. */ 19 20 #ifndef _LIBC 21 # include <time.h> 22 #endif 23 24 /* mktime_offset_t is a signed type wide enough to hold a UTC offset 25 in seconds, and used as part of the type of the offset-guess 26 argument to mktime_internal. In Glibc, it is always long int. 27 When in Gnulib, use time_t on platforms where time_t 28 is signed, to be compatible with platforms like BeOS that export 29 this implementation detail of mktime. On platforms where time_t is 30 unsigned, GNU and POSIX code can assume 'int' is at least 32 bits 31 which is wide enough for a UTC offset. */ 32 #ifdef _LIBC 33 typedef long int mktime_offset_t; 34 #elif defined TIME_T_IS_SIGNED 35 typedef time_t mktime_offset_t; 36 #else 37 typedef int mktime_offset_t; 38 #endif 39 40 /* The source code uses identifiers like __time64_t for glibc 41 timestamps that can contain 64-bit values even when time_t is only 42 32 bits. These are just macros for the ordinary identifiers unless 43 compiling within glibc when time_t is 32 bits. */ 44 #if ! (defined _LIBC && __TIMESIZE != 64) 45 # undef __time64_t 46 # define __time64_t time_t 47 # define __gmtime64_r __gmtime_r 48 # define __localtime64_r __localtime_r 49 # define __mktime64 mktime 50 # define __timegm64 timegm 51 #endif 52 53 #ifndef _LIBC 54 55 /* Although glibc source code uses leading underscores, Gnulib wants 56 ordinary names. 57 58 Portable standalone applications should supply a <time.h> that 59 declares a POSIX-compliant localtime_r, for the benefit of older 60 implementations that lack localtime_r or have a nonstandard one. 61 Similarly for gmtime_r. See the gnulib time_r module for one way 62 to implement this. */ 63 64 # undef __gmtime_r 65 # undef __localtime_r 66 # define __gmtime_r gmtime_r 67 # define __localtime_r localtime_r 68 69 # define __mktime_internal mktime_internal 70 71 #endif 72 73 /* Subroutine of mktime. Return the time_t representation of TP and 74 normalize TP, given that a struct tm * maps to a time_t as performed 75 by FUNC. Record next guess for localtime-gmtime offset in *OFFSET. */ 76 extern __time64_t __mktime_internal (struct tm *tp, 77 struct tm *(*func) (__time64_t const *, 78 struct tm *), 79 mktime_offset_t *offset) attribute_hidden;