From 3c5cd2319baa2e69349b863abebb332c831e14d6 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sun, 8 Jun 2003 17:45:11 +0000 Subject: . --- Makefile.in | 2 +- aclocal.m4 | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- config.hin | 9 ++ lib/ChangeLog | 13 +++ src/Makefile.in | 2 +- 5 files changed, 321 insertions(+), 14 deletions(-) diff --git a/Makefile.in b/Makefile.in index a34147a91..61229e5e7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -216,7 +216,7 @@ $(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): configure.ac m4/acl.m4 m4/afs.m4 m4/alloca.m4 m4/assert.m4 m4/bison.m4 m4/boottime.m4 m4/c-stack.m4 m4/canonicalize.m4 m4/check-decl.m4 m4/chown.m4 m4/codeset.m4 m4/d-ino.m4 m4/d-type.m4 m4/dirfd.m4 m4/dos.m4 m4/error.m4 m4/fpending.m4 m4/fstypename.m4 m4/fsusage.m4 m4/ftruncate.m4 m4/ftw.m4 m4/getcwd-path-max.m4 m4/getcwd.m4 m4/getgroups.m4 m4/getline.m4 m4/gettext.m4 m4/gettimeofday.m4 m4/glibc.m4 m4/glibc21.m4 m4/group-member.m4 m4/host-os.m4 m4/human.m4 m4/iconv.m4 m4/intdiv0.m4 m4/inttypes-pri.m4 m4/inttypes.m4 m4/isc-posix.m4 m4/jm-glibc-io.m4 m4/jm-macros.m4 m4/jm-mktime.m4 m4/jm-winsz1.m4 m4/jm-winsz2.m4 m4/lchown.m4 m4/lcmessage.m4 m4/lib-check.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/link-follow.m4 m4/longlong.m4 m4/ls-mntd-fs.m4 m4/lstat.m4 m4/mbrtowc.m4 m4/mbswidth.m4 m4/memcmp.m4 m4/mkdir-slash.m4 m4/mkstemp.m4 m4/nanosleep.m4 m4/onceonly.m4 m4/open-max.m4 m4/perl.m4 m4/prereq.m4 m4/progtest.m4 m4/putenv.m4 m4/readdir.m4 m4/regex.m4 m4/rename.m4 m4/restrict.m4 m4/rmdir-errno.m4 m4/search-libs.m4 m4/st_dm_mode.m4 m4/st_mtim.m4 m4/stat.m4 m4/stdbool.m4 m4/strftime.m4 m4/timespec.m4 m4/unlink-busy.m4 m4/uptime.m4 m4/utimbuf.m4 m4/utime.m4 m4/utimes.m4 m4/xstrtoimax.m4 m4/xstrtoumax.m4 +$(ACLOCAL_M4): configure.ac m4/acl.m4 m4/afs.m4 m4/alloca.m4 m4/assert.m4 m4/bison.m4 m4/boottime.m4 m4/c-stack.m4 m4/canonicalize.m4 m4/check-decl.m4 m4/chown.m4 m4/codeset.m4 m4/d-ino.m4 m4/d-type.m4 m4/dirfd.m4 m4/dos.m4 m4/error.m4 m4/fpending.m4 m4/fstypename.m4 m4/fsusage.m4 m4/ftruncate.m4 m4/ftw.m4 m4/getcwd-path-max.m4 m4/getcwd.m4 m4/getgroups.m4 m4/getline.m4 m4/gettext.m4 m4/gettimeofday.m4 m4/glibc.m4 m4/glibc21.m4 m4/group-member.m4 m4/host-os.m4 m4/human.m4 m4/iconv.m4 m4/intdiv0.m4 m4/inttypes-pri.m4 m4/inttypes.m4 m4/isc-posix.m4 m4/jm-glibc-io.m4 m4/jm-macros.m4 m4/jm-mktime.m4 m4/jm-winsz1.m4 m4/jm-winsz2.m4 m4/lchown.m4 m4/lcmessage.m4 m4/lib-check.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/link-follow.m4 m4/longlong.m4 m4/ls-mntd-fs.m4 m4/lstat.m4 m4/mbrtowc.m4 m4/mbswidth.m4 m4/memcmp.m4 m4/mkdir-slash.m4 m4/mkstemp.m4 m4/mktime.m4 m4/nanosleep.m4 m4/onceonly.m4 m4/open-max.m4 m4/perl.m4 m4/prereq.m4 m4/progtest.m4 m4/putenv.m4 m4/readdir.m4 m4/regex.m4 m4/rename.m4 m4/restrict.m4 m4/rmdir-errno.m4 m4/search-libs.m4 m4/st_dm_mode.m4 m4/st_mtim.m4 m4/stat.m4 m4/stdbool.m4 m4/strftime.m4 m4/timespec.m4 m4/tm_gmtoff.m4 m4/tzset.m4 m4/unlink-busy.m4 m4/uptime.m4 m4/utimbuf.m4 m4/utime.m4 m4/utimes.m4 m4/xstrtoimax.m4 m4/xstrtoumax.m4 cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 diff --git a/aclocal.m4 b/aclocal.m4 index 2fc07e2db..5bf1db289 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -2915,6 +2915,212 @@ AC_DEFUN([jm_FUNC_MKTIME], fi ]) +# mktime.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Jim Meyering. + +# Redefine AC_FUNC_MKTIME, to fix a bug in Autoconf 2.57 and earlier. +# This redefinition can be removed once a new version of Autoconf comes out. +# The redefinition is taken from +# . +# AC_FUNC_MKTIME +# -------------- +AC_DEFUN([AC_FUNC_MKTIME], +[AC_REQUIRE([AC_HEADER_TIME])dnl +AC_CHECK_HEADERS(stdlib.h sys/time.h unistd.h) +AC_CHECK_FUNCS(alarm) +AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime, +[AC_RUN_IFELSE([AC_LANG_SOURCE( +[[/* Test program from Paul Eggert and Tony Leneis. */ +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#if HAVE_STDLIB_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if !HAVE_ALARM +# define alarm(X) /* empty */ +#endif + +/* Work around redefinition to rpl_putenv by other config tests. */ +#undef putenv + +static time_t time_t_max; +static time_t time_t_min; + +/* Values we'll use to set the TZ environment variable. */ +static char *tz_strings[] = { + (char *) 0, "TZ=GMT0", "TZ=JST-9", + "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00" +}; +#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0])) + +/* Fail if mktime fails to convert a date in the spring-forward gap. + Based on a problem report from Andreas Jaeger. */ +static void +spring_forward_gap () +{ + /* glibc (up to about 1998-10-07) failed this test. */ + struct tm tm; + + /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0" + instead of "TZ=America/Vancouver" in order to detect the bug even + on systems that don't support the Olson extension, or don't have the + full zoneinfo tables installed. */ + putenv ("TZ=PST8PDT,M4.1.0,M10.5.0"); + + tm.tm_year = 98; + tm.tm_mon = 3; + tm.tm_mday = 5; + tm.tm_hour = 2; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + if (mktime (&tm) == (time_t)-1) + exit (1); +} + +static void +mktime_test1 (now) + time_t now; +{ + struct tm *lt; + if ((lt = localtime (&now)) && mktime (lt) != now) + exit (1); +} + +static void +mktime_test (now) + time_t now; +{ + mktime_test1 (now); + mktime_test1 ((time_t) (time_t_max - now)); + mktime_test1 ((time_t) (time_t_min + now)); +} + +static void +irix_6_4_bug () +{ + /* Based on code from Ariel Faigon. */ + struct tm tm; + tm.tm_year = 96; + tm.tm_mon = 3; + tm.tm_mday = 0; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + mktime (&tm); + if (tm.tm_mon != 2 || tm.tm_mday != 31) + exit (1); +} + +static void +bigtime_test (j) + int j; +{ + struct tm tm; + time_t now; + tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j; + now = mktime (&tm); + if (now != (time_t) -1) + { + struct tm *lt = localtime (&now); + if (! (lt + && lt->tm_year == tm.tm_year + && lt->tm_mon == tm.tm_mon + && lt->tm_mday == tm.tm_mday + && lt->tm_hour == tm.tm_hour + && lt->tm_min == tm.tm_min + && lt->tm_sec == tm.tm_sec + && lt->tm_yday == tm.tm_yday + && lt->tm_wday == tm.tm_wday + && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst) + == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst)))) + exit (1); + } +} + +int +main () +{ + time_t t, delta; + int i, j; + + /* This test makes some buggy mktime implementations loop. + Give up after 60 seconds; a mktime slower than that + isn't worth using anyway. */ + alarm (60); + + for (time_t_max = 1; 0 < time_t_max; time_t_max *= 2) + continue; + time_t_max--; + if ((time_t) -1 < 0) + for (time_t_min = -1; (time_t) (time_t_min * 2) < 0; time_t_min *= 2) + continue; + delta = time_t_max / 997; /* a suitable prime number */ + for (i = 0; i < N_STRINGS; i++) + { + if (tz_strings[i]) + putenv (tz_strings[i]); + + for (t = 0; t <= time_t_max - delta; t += delta) + mktime_test (t); + mktime_test ((time_t) 1); + mktime_test ((time_t) (60 * 60)); + mktime_test ((time_t) (60 * 60 * 24)); + + for (j = 1; 0 < j; j *= 2) + bigtime_test (j); + bigtime_test (j - 1); + } + irix_6_4_bug (); + spring_forward_gap (); + exit (0); +}]])], + [ac_cv_func_working_mktime=yes], + [ac_cv_func_working_mktime=no], + [ac_cv_func_working_mktime=no])]) +if test $ac_cv_func_working_mktime = no; then + AC_LIBOBJ([mktime]) +fi +])# AC_FUNC_MKTIME + +AC_DEFUN([gl_FUNC_MKTIME], +[ + AC_REQUIRE([AC_FUNC_MKTIME]) + if test $ac_cv_func_working_mktime = no; then + AC_DEFINE(mktime, rpl_mktime, + [Define to rpl_mktime if the replacement function should be used.]) + gl_PREREQ_MKTIME + fi +]) + +# Prerequisites of lib/mktime.c. +AC_DEFUN([gl_PREREQ_MKTIME], [ + AC_REQUIRE([AC_HEADER_STDC]) + AC_CHECK_HEADERS_ONCE(limits.h) +]) + #serial 7 dnl From Jim Meyering. @@ -3242,29 +3448,27 @@ AC_DEFUN([jm_AC_FUNC_LINK_FOLLOWS_SYMLINK], fi ]) -#serial 17 +#serial 20 dnl This macro is intended to be used solely in this file. dnl These are the prerequisite macros for GNU's strftime.c replacement. AC_DEFUN([_jm_STRFTIME_PREREQS], [ - dnl strftime.c uses localtime_r and the underyling system strftime - dnl if they exist. - AC_CHECK_FUNCS(localtime_r strftime) + dnl strftime.c uses the underyling system strftime if it exists. + AC_FUNC_STRFTIME - AC_CHECK_HEADERS(limits.h) - AC_CHECK_FUNCS(bcopy tzset mempcpy memcpy memset) + AC_CHECK_HEADERS_ONCE(limits.h) + AC_CHECK_FUNCS_ONCE(memcpy mempcpy) + AC_CHECK_FUNCS(tzset memset) # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE. AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(mblen mbrlen) + AC_TYPE_MBSTATE_T - AC_CHECK_MEMBER([struct tm.tm_gmtoff], - [AC_DEFINE(HAVE_TM_GMTOFF, 1, - [Define if struct tm has the tm_gmtoff member.])], - , - [#include ]) + AC_REQUIRE([gl_TM_GMTOFF]) + AC_REQUIRE([gl_FUNC_TZSET_CLOBBER]) ]) dnl From Jim Meyering. @@ -3276,7 +3480,7 @@ AC_DEFUN([jm_FUNC_GNU_STRFTIME], AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_HEADER_STDC])dnl - AC_CHECK_HEADERS(sys/time.h) + AC_CHECK_HEADERS_ONCE(sys/time.h) AC_DEFINE([my_strftime], [nstrftime], [Define to the name of the strftime replacement function.]) ]) @@ -3286,6 +3490,87 @@ AC_DEFUN([jm_FUNC_STRFTIME], _jm_STRFTIME_PREREQS ]) +# tm_gmtoff.m4 serial 1 +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_TM_GMTOFF], +[ + AC_CHECK_MEMBER([struct tm.tm_gmtoff], + [AC_DEFINE(HAVE_TM_GMTOFF, 1, + [Define if struct tm has the tm_gmtoff member.])], + , + [#include ]) +]) + +#serial 1 +# See if we have a working tzset function. +# If so, arrange to compile the wrapper function. +# For at least Solaris 2.5.1 and 2.6, this is necessary +# because tzset can clobber the contents of the buffer +# used by localtime. + +# Written by Paul Eggert and Jim Meyering. + +AC_DEFUN([gl_FUNC_TZSET_CLOBBER], +[ + AC_REQUIRE([AC_HEADER_TIME]) + AC_CACHE_CHECK([whether tzset clobbers localtime buffer], + gl_cv_func_tzset_clobber, + [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +#include + +int +main () +{ + time_t t1 = 853958121; + struct tm *p, s; + putenv ("TZ=GMT0"); + p = localtime (&t1); + s = *p; + putenv ("TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"); + tzset (); + exit (p->tm_year != s.tm_year + || p->tm_mon != s.tm_mon + || p->tm_mday != s.tm_mday + || p->tm_hour != s.tm_hour + || p->tm_min != s.tm_min + || p->tm_sec != s.tm_sec); +} + ]])], + [gl_cv_func_tzset_clobber=no], + [gl_cv_func_tzset_clobber=yes], + [gl_cv_func_tzset_clobber=yes])]) + + AC_DEFINE(HAVE_RUN_TZSET_TEST, 1, + [Define to 1 if you have run the test for working tzset.]) + + if test $gl_cv_func_tzset_clobber = yes; then + AC_LIBOBJ(gettimeofday) + AC_DEFINE(localtime, rpl_localtime, + [Define to rpl_localtime if the replacement function should be used.]) + AC_DEFINE(tzset, rpl_tzset, + [Define to rpl_tzset if the wrapper function should be used.]) + AC_DEFINE(TZSET_CLOBBERS_LOCALTIME_BUFFER, 1, + [Define if tzset clobbers localtime's static buffer.]) + fi +]) + #serial 3 dnl From Jim Meyering diff --git a/config.hin b/config.hin index b9b4b716d..f1d1a0234 100644 --- a/config.hin +++ b/config.hin @@ -666,6 +666,9 @@ /* Define to 1 if you have the `rpmatch' function. */ #undef HAVE_RPMATCH +/* Define to 1 if you have run the test for working tzset. */ +#undef HAVE_RUN_TZSET_TEST + /* Define to 1 if you have the `sethostname' function. */ #undef HAVE_SETHOSTNAME @@ -1291,6 +1294,9 @@ /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME +/* Define if tzset clobbers localtime's static buffer. */ +#undef TZSET_CLOBBERS_LOCALTIME_BUFFER + /* Define to 1 for Encore UMAX. */ #undef UMAX @@ -1434,6 +1440,9 @@ /* Define to `int' if does not define. */ #undef ssize_t +/* Define to rpl_tzset if the wrapper function should be used. */ +#undef tzset + /* Define to `int' if doesn't define. */ #undef uid_t diff --git a/lib/ChangeLog b/lib/ChangeLog index d904d010d..75bad0326 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,18 @@ +2003-06-08 Jim Meyering + + Clean up, as part of merge with emacs version of strftime.c. + * strftime.c (my_strftime) [!_LIBC && HAVE_TZNAME && HAVE_TZSET]: + Remove function, now that we can rely on a working tzset function. + Ensure that the required autoconf test has been run. + * gettimeofday.c: Also undef tzset. + (rpl_tzset): New function, for use by new macro, gl_FUNC_TZSET_CLOBBER. + 2003-06-07 Jim Meyering + * readtokens.h: Add copyright notice. + Include . + Remove definition and uses of __P. + * readtokens.c: Put `Free Software Foundation, Inc.' in place of my name in the copyright comment. (init_tokenbuffer): Remove unnecessary parentheses around malloc. diff --git a/src/Makefile.in b/src/Makefile.in index fa05b0d07..3d7ba0edf 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -846,7 +846,7 @@ uninstall-binPROGRAMS: done clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) > /dev/null 2>&1 || /bin/rm -f $(bin_PROGRAMS) + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ -- cgit v1.2.3-54-g00ecf