mktime-internal.h 3.03 KB
Newer Older
Paul Eggert's avatar
Paul Eggert committed
1
/* Internals of mktime and related functions
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright 2016-2019 Free Software Foundation, Inc.
Paul Eggert's avatar
Paul Eggert committed
3 4
   This file is part of the GNU C Library.
   Contributed by Paul Eggert <eggert@cs.ucla.edu>.
Paul Eggert's avatar
Paul Eggert committed
5

Paul Eggert's avatar
Paul Eggert committed
6
   The GNU C Library is free software; you can redistribute it and/or
Paul Eggert's avatar
Paul Eggert committed
7 8 9 10
   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.

Paul Eggert's avatar
Paul Eggert committed
11
   The GNU C Library is distributed in the hope that it will be useful,
Paul Eggert's avatar
Paul Eggert committed
12 13 14 15 16
   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
Paul Eggert's avatar
Paul Eggert committed
17
   License along with the GNU C Library; if not, see
Paul Eggert's avatar
Paul Eggert committed
18
   <https://www.gnu.org/licenses/>.  */
Paul Eggert's avatar
Paul Eggert committed
19

Paul Eggert's avatar
Paul Eggert committed
20 21 22
#ifndef _LIBC
# include <time.h>
#endif
Paul Eggert's avatar
Paul Eggert committed
23 24 25

/* 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
Paul Eggert's avatar
Paul Eggert committed
26 27
   argument to mktime_internal.  In Glibc, it is always long int.
   When in Gnulib, use time_t on platforms where time_t
Paul Eggert's avatar
Paul Eggert committed
28 29 30 31
   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.  */
Paul Eggert's avatar
Paul Eggert committed
32 33 34
#ifdef _LIBC
typedef long int mktime_offset_t;
#elif defined TIME_T_IS_SIGNED
Paul Eggert's avatar
Paul Eggert committed
35 36 37 38 39
typedef time_t mktime_offset_t;
#else
typedef int mktime_offset_t;
#endif

Paul Eggert's avatar
Paul Eggert committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53
/* 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
Paul Eggert's avatar
Paul Eggert committed
54 55 56 57 58 59 60 61 62 63

/* 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.  */

Paul Eggert's avatar
Paul Eggert committed
64 65 66 67 68 69 70 71
# undef __gmtime_r
# undef __localtime_r
# define __gmtime_r gmtime_r
# define __localtime_r localtime_r

# define __mktime_internal mktime_internal

#endif
Paul Eggert's avatar
Paul Eggert committed
72

Paul Eggert's avatar
Paul Eggert committed
73 74 75 76 77 78 79
/* 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;