From 3891f56aba10f45a95e09fa62d9bb6f6d861cff1 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 6 Jun 2024 17:47:21 +0200 Subject: [PATCH] tzname: New module. * lib/time.in.h (tzname): New declaration. * m4/tzname.m4: New file. * m4/time_h.m4 (gl_TIME_H_REQUIRE_DEFAULTS): Initialize GNULIB_TZNAME. * modules/time-h (Makefile.am): Substitute GNULIB_TZNAME. * modules/tzname: New file. --- ChangeLog | 9 ++++++++ lib/time.in.h | 17 ++++++++++++++ m4/time_h.m4 | 3 ++- m4/tzname.m4 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ modules/time-h | 1 + modules/tzname | 23 +++++++++++++++++++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 m4/tzname.m4 create mode 100644 modules/tzname diff --git a/ChangeLog b/ChangeLog index 16071b6961..6078703f6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2024-06-06 Bruno Haible + + tzname: New module. + * lib/time.in.h (tzname): New declaration. + * m4/tzname.m4: New file. + * m4/time_h.m4 (gl_TIME_H_REQUIRE_DEFAULTS): Initialize GNULIB_TZNAME. + * modules/time-h (Makefile.am): Substitute GNULIB_TZNAME. + * modules/tzname: New file. + 2024-06-05 Bruno Haible setenv: On native Windows, don't modify _environ directly. diff --git a/lib/time.in.h b/lib/time.in.h index df99c8abca..b91018937a 100644 --- a/lib/time.in.h +++ b/lib/time.in.h @@ -122,6 +122,23 @@ struct __time_t_must_be_integral { # endif # endif +# if @GNULIB_TZNAME@ +/* tzname[0..1]: Abbreviated time zone names, set by the tzset() function. */ +# if NEED_DECL_TZNAME +extern +# ifdef __cplusplus + "C" +# endif + char *tzname[]; +# endif +# if defined _WIN32 && !defined __CYGWIN__ +/* On native Windows, map 'tzname' to '_tzname' etc., so that -loldnames is not + required. */ +# undef tzname +# define tzname _tzname +# endif +# endif + /* Set *TS to the current time, and return BASE. Upon failure, return 0. */ # if @GNULIB_TIMESPEC_GET@ diff --git a/m4/time_h.m4 b/m4/time_h.m4 index 4e7f48ec82..7d28a0a845 100644 --- a/m4/time_h.m4 +++ b/m4/time_h.m4 @@ -2,7 +2,7 @@ # Copyright (C) 2000-2001, 2003-2007, 2009-2024 Free Software Foundation, Inc. -# serial 23.1 +# serial 23.2 # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -146,6 +146,7 @@ AC_DEFUN([gl_TIME_H_REQUIRE_DEFAULTS], gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIMESPEC_GETRES]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_R]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TIME_RZ]) + gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TZNAME]) gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_TZSET]) dnl Support Microsoft deprecated alias function names by default. gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_MDA_TZSET], [1]) diff --git a/m4/tzname.m4 b/m4/tzname.m4 new file mode 100644 index 0000000000..b600e56d01 --- /dev/null +++ b/m4/tzname.m4 @@ -0,0 +1,62 @@ +# tzname.m4 +# serial 1 +dnl Copyright (C) 2024 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl gl_TZNAME tests how the time zone can be obtained. +dnl It is similar AC_STRUCT_TIMEZONE, but also supports MSVC. +dnl It defines +dnl * the C macro HAVE_STRUCT_TM_TM_ZONE to 1 if 'struct tm' has a field +dnl 'tm_zone', +dnl * otherwise: +dnl - the C macro HAVE_TZNAME_ARRAY to 1 if there the rvalue 'tzname' +dnl or (on native Windows) '_tzname' is usable, +dnl - the C macro NEED_DECL_TZNAME to 1 if 'tzname' needs to be declared +dnl extern char *tzname[]; +dnl before use. +AC_DEFUN([gl_TZNAME], +[ + AC_REQUIRE([AC_CANONICAL_HOST]) + + dnl Set ac_cv_member_struct_tm_tm_zone, + dnl ac_cv_var_tzname, ac_cv_have_decl_tzname. + dnl Possibly define HAVE_STRUCT_TM_TM_ZONE, + dnl HAVE_TZNAME, HAVE_DECL_TZNAME. + AC_REQUIRE([AC_STRUCT_TIMEZONE]) + + dnl If 'struct tm' has a field 'tm_zone', don't test for tzname or _tzname. + dnl Rationale: Some code assumes that HAVE_STRUCT_TM_TM_ZONE and HAVE_TZNAME + dnl are exclusive. + if test "$ac_cv_member_struct_tm_tm_zone" != yes; then + if test $ac_cv_var_tzname = yes && test $ac_cv_have_decl_tzname != yes; then + AC_DEFINE([NEED_DECL_TZNAME], [1], + [Define to 1 if tzname exists but needs to be declared.]) + fi + AC_CACHE_CHECK([for tzname array], + [gl_cv_var_tzname], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #if NEED_DECL_TZNAME + extern char *tzname[]; + #endif + #if defined _WIN32 && !defined __CYGWIN__ + #undef tzname + #define tzname _tzname + #endif + ]], + [[return tzname[0][0]; + ]]) + ], + [gl_cv_var_tzname=yes], + [gl_cv_var_tzname=no]) + ]) + if test $gl_cv_var_tzname = yes; then + AC_DEFINE([HAVE_TZNAME_ARRAY], [1], + [Define to 1 if 'struct tm' does not have a field 'tm_zone' + but instead 'tzname' is usable.]) + fi + fi +]) diff --git a/modules/time-h b/modules/time-h index 3b07845b56..e84100bf93 100644 --- a/modules/time-h +++ b/modules/time-h @@ -44,6 +44,7 @@ time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $( -e 's/@''GNULIB_TIMESPEC_GETRES''@/$(GNULIB_TIMESPEC_GETRES)/g' \ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \ + -e 's/@''GNULIB_TZNAME''@/$(GNULIB_TZNAME)/g' \ -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \ -e 's/@''GNULIB_MDA_TZSET''@/$(GNULIB_MDA_TZSET)/g' \ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ diff --git a/modules/tzname b/modules/tzname new file mode 100644 index 0000000000..4195d74f8e --- /dev/null +++ b/modules/tzname @@ -0,0 +1,23 @@ +Description: +tzname variable: abbreviated time zone names, set by the tzset() function. + +Files: +m4/tzname.m4 + +Depends-on: +time-h + +configure.ac: +gl_TZNAME +gl_TIME_MODULE_INDICATOR([tzname]) + +Makefile.am: + +Include: + + +License: +LGPL + +Maintainer: +all -- 2.39.5