~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to m4/jm-mktime.m4

  • Committer: Arnold D. Robbins
  • Date: 2010-07-16 10:09:56 UTC
  • Revision ID: git-v1:bc70de7b3302d5a81515b901cae376b8b51d2004
Tags: gawk-3.1.0
Move to gawk-3.1.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#serial 7
 
2
 
 
3
dnl From Jim Meyering.
 
4
dnl A wrapper around AC_FUNC_MKTIME.
 
5
 
 
6
AC_DEFUN(jm_FUNC_MKTIME,
 
7
[AC_REQUIRE([AC_FUNC_MKTIME])dnl
 
8
 
 
9
 dnl mktime.c uses localtime_r if it exists.  Check for it.
 
10
 AC_CHECK_FUNCS(localtime_r)
 
11
 
 
12
 if test $ac_cv_func_working_mktime = no; then
 
13
   AC_DEFINE_UNQUOTED(mktime, rpl_mktime,
 
14
    [Define to rpl_mktime if the replacement function should be used.])
 
15
 fi
 
16
])
 
17
 
 
18
# AC_FUNC_MKTIME
 
19
# --------------
 
20
# Stolen from CVS Autoconf.  Should be removed once you use Autoconf 2.15.
 
21
AC_DEFUN(AC_FUNC_MKTIME,
 
22
[AC_REQUIRE([AC_HEADER_TIME])dnl
 
23
AC_CHECK_HEADERS(sys/time.h unistd.h)
 
24
AC_CHECK_FUNCS(alarm)
 
25
AC_CACHE_CHECK([for working mktime], ac_cv_func_working_mktime,
 
26
[AC_TRY_RUN(
 
27
[/* Test program from Paul Eggert (eggert@twinsun.com)
 
28
   and Tony Leneis (tony@plaza.ds.adp.com).  */
 
29
#if TIME_WITH_SYS_TIME
 
30
# include <sys/time.h>
 
31
# include <time.h>
 
32
#else
 
33
# if HAVE_SYS_TIME_H
 
34
#  include <sys/time.h>
 
35
# else
 
36
#  include <time.h>
 
37
# endif
 
38
#endif
 
39
 
 
40
#if HAVE_UNISTD_H
 
41
# include <unistd.h>
 
42
#endif
 
43
 
 
44
#if !HAVE_ALARM
 
45
# define alarm(X) /* empty */
 
46
#endif
 
47
 
 
48
/* Work around redefinition to rpl_putenv by other config tests.  */
 
49
#undef putenv
 
50
 
 
51
static time_t time_t_max;
 
52
 
 
53
/* Values we'll use to set the TZ environment variable.  */
 
54
static const char *const tz_strings[] = {
 
55
  (const char *) 0, "TZ=GMT0", "TZ=JST-9",
 
56
  "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
 
57
};
 
58
#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
 
59
 
 
60
/* Fail if mktime fails to convert a date in the spring-forward gap.
 
61
   Based on a problem report from Andreas Jaeger.  */
 
62
static void
 
63
spring_forward_gap ()
 
64
{
 
65
  /* glibc (up to about 1998-10-07) failed this test) */
 
66
  struct tm tm;
 
67
 
 
68
  /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
 
69
     instead of "TZ=America/Vancouver" in order to detect the bug even
 
70
     on systems that don't support the Olson extension, or don't have the
 
71
     full zoneinfo tables installed.  */
 
72
  putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
 
73
 
 
74
  tm.tm_year = 98;
 
75
  tm.tm_mon = 3;
 
76
  tm.tm_mday = 5;
 
77
  tm.tm_hour = 2;
 
78
  tm.tm_min = 0;
 
79
  tm.tm_sec = 0;
 
80
  tm.tm_isdst = -1;
 
81
  if (mktime (&tm) == (time_t)-1)
 
82
    exit (1);
 
83
}
 
84
 
 
85
static void
 
86
mktime_test (now)
 
87
     time_t now;
 
88
{
 
89
  struct tm *lt;
 
90
  if ((lt = localtime (&now)) && mktime (lt) != now)
 
91
    exit (1);
 
92
  now = time_t_max - now;
 
93
  if ((lt = localtime (&now)) && mktime (lt) != now)
 
94
    exit (1);
 
95
}
 
96
 
 
97
static void
 
98
irix_6_4_bug ()
 
99
{
 
100
  /* Based on code from Ariel Faigon.  */
 
101
  struct tm tm;
 
102
  tm.tm_year = 96;
 
103
  tm.tm_mon = 3;
 
104
  tm.tm_mday = 0;
 
105
  tm.tm_hour = 0;
 
106
  tm.tm_min = 0;
 
107
  tm.tm_sec = 0;
 
108
  tm.tm_isdst = -1;
 
109
  mktime (&tm);
 
110
  if (tm.tm_mon != 2 || tm.tm_mday != 31)
 
111
    exit (1);
 
112
}
 
113
 
 
114
static void
 
115
bigtime_test (j)
 
116
     int j;
 
117
{
 
118
  struct tm tm;
 
119
  time_t now;
 
120
  tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
 
121
  now = mktime (&tm);
 
122
  if (now != (time_t) -1)
 
123
    {
 
124
      struct tm *lt = localtime (&now);
 
125
      if (! (lt
 
126
             && lt->tm_year == tm.tm_year
 
127
             && lt->tm_mon == tm.tm_mon
 
128
             && lt->tm_mday == tm.tm_mday
 
129
             && lt->tm_hour == tm.tm_hour
 
130
             && lt->tm_min == tm.tm_min
 
131
             && lt->tm_sec == tm.tm_sec
 
132
             && lt->tm_yday == tm.tm_yday
 
133
             && lt->tm_wday == tm.tm_wday
 
134
             && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
 
135
                  == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
 
136
        exit (1);
 
137
    }
 
138
}
 
139
 
 
140
int
 
141
main ()
 
142
{
 
143
  time_t t, delta;
 
144
  int i, j;
 
145
 
 
146
  /* This test makes some buggy mktime implementations loop.
 
147
     Give up after 60 seconds; a mktime slower than that
 
148
     isn't worth using anyway.  */
 
149
  alarm (60);
 
150
 
 
151
  for (time_t_max = 1; 0 < time_t_max; time_t_max *= 2)
 
152
    continue;
 
153
  time_t_max--;
 
154
  delta = time_t_max / 997; /* a suitable prime number */
 
155
  for (i = 0; i < N_STRINGS; i++)
 
156
    {
 
157
      if (tz_strings[i])
 
158
        putenv (tz_strings[i]);
 
159
 
 
160
      for (t = 0; t <= time_t_max - delta; t += delta)
 
161
        mktime_test (t);
 
162
      mktime_test ((time_t) 60 * 60);
 
163
      mktime_test ((time_t) 60 * 60 * 24);
 
164
 
 
165
      for (j = 1; 0 < j; j *= 2)
 
166
        bigtime_test (j);
 
167
      bigtime_test (j - 1);
 
168
    }
 
169
  irix_6_4_bug ();
 
170
  spring_forward_gap ();
 
171
  exit (0);
 
172
}],
 
173
ac_cv_func_working_mktime=yes, ac_cv_func_working_mktime=no,
 
174
ac_cv_func_working_mktime=no)])
 
175
if test $ac_cv_func_working_mktime = no; then
 
176
  LIBOBJS="$LIBOBJS mktime.${ac_objext}"
 
177
fi
 
178
])# AC_FUNC_MKTIME
 
 
b'\\ No newline at end of file'