This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Teach Configure and cflags.SH about C99
[metaconfig.git] / U / perl / time_size.U
1 ?RCS: $Id$
2 ?RCS:
3 ?RCS: Copyright (c) 2008 H.Merijn Brand
4 ?RCS:
5 ?RCS: You may distribute under the terms of either the GNU General Public
6 ?RCS: License or the Artistic License, as specified in the README file.
7 ?RCS:
8 ?MAKE:sGMTIME_max sGMTIME_min sLOCALTIME_max sLOCALTIME_min: cat rm_try \
9         Setvar Compile run
10 ?MAKE:  -pick add $@ %<
11 ?S:sGMTIME_max:
12 ?S:     This variable defines the maximum value of the time_t offset that
13 ?S:     the system function gmtime () accepts
14 ?S:.
15 ?S:sGMTIME_min:
16 ?S:     This variable defines the minimum value of the time_t offset that
17 ?S:     the system function gmtime () accepts
18 ?S:.
19 ?S:sLOCALTIME_max:
20 ?S:     This variable defines the maximum value of the time_t offset that
21 ?S:     the system function localtime () accepts
22 ?S:.
23 ?S:sLOCALTIME_min:
24 ?S:     This variable defines the minimum value of the time_t offset that
25 ?S:     the system function localtime () accepts
26 ?S:.
27 ?C:GMTIME_MAX:
28 ?C:     This symbol contains the maximum value for the time_t offset that
29 ?C:     the system function gmtime () accepts, and defaults to 0
30 ?C:.
31 ?C:GMTIME_MIN:
32 ?C:     This symbol contains the minimum value for the time_t offset that
33 ?C:     the system function gmtime () accepts, and defaults to 0
34 ?C:.
35 ?C:LOCALTIME_MAX:
36 ?C:     This symbol contains the maximum value for the time_t offset that
37 ?C:     the system function localtime () accepts, and defaults to 0
38 ?C:.
39 ?C:LOCALTIME_MIN:
40 ?C:     This symbol contains the minimum value for the time_t offset that
41 ?C:     the system function localtime () accepts, and defaults to 0
42 ?C:.
43 ?H:#define GMTIME_MAX           $sGMTIME_max    /**/
44 ?H:#define GMTIME_MIN           $sGMTIME_min    /**/
45 ?H:#define LOCALTIME_MAX        $sLOCALTIME_max /**/
46 ?H:#define LOCALTIME_MIN        $sLOCALTIME_min /**/
47 ?H:.
48 ?D:sGMTIME_max=0
49 ?D:sGMTIME_min=0
50 ?D:sLOCALTIME_max=0
51 ?D:sLOCALTIME_min=0
52 ?F:!try
53 : Check the max offset that gmtime and localtime accept
54 echo "Checking max offsets that gmtime () accepts"
55
56 case "$sGMTIME_min/$sGMTIME_max" in
57     0/0|/)
58         $cat >try.c <<EOCP
59 #include <sys/types.h>
60 #include <stdio.h>
61 #include <time.h>
62
63 int i;
64 struct tm *tmp;
65 time_t pt;
66
67 void gm_check (time_t t, int min_year, int max_year)
68 {
69     tmp = gmtime (&t);
70     if ( tmp == NULL ||
71         /* Check tm_year overflow */
72          tmp->tm_year < min_year || tmp->tm_year > max_year)
73         tmp = NULL;
74     else
75         pt = t;
76     } /* gm_check */
77
78 int check_max ()
79 {
80     tmp = NULL;
81     pt  = 0;
82 #ifdef MAXLONG
83     gm_check (MAXLONG, 69, 0x7fffffff);
84 #endif
85     if (tmp == NULL || tmp->tm_year < 0) {
86         for (i = 63; i >= 0; i--) {
87             time_t x = pt | ((time_t)1 << i);
88             if (x < 0 || x < pt) continue;
89             gm_check (x, 69, 0x7fffffff);
90             }
91         }
92     printf ("sGMTIME_max=%ld\n", pt);
93     return (0);
94     } /* check_max */
95
96 int check_min ()
97 {
98     tmp = NULL;
99     pt  = 0;
100 #ifdef MINLONG
101     gm_check (MINLONG, -1900, 70);
102 #endif
103     if (tmp == NULL) {
104         for (i = 36; i >= 0; i--) {
105             time_t x = pt - ((time_t)1 << i);
106             if (x > 0) continue;
107             gm_check (x, -1900, 70);
108             }
109         }
110     printf ("sGMTIME_min=%ld\n", pt);
111     return (0);
112     } /* check_min */
113
114 int main (int argc, char *argv[])
115 {
116     /* fprintf (stderr, "Sizeof time_t = %ld\n", sizeof (time_t)); */
117     check_max ();
118     check_min ();
119     return (0);
120     } /* main */
121 EOCP
122         set try
123         if eval $compile; then
124             eval `$run ./try 2>/dev/null`
125         else
126             echo "Cannot determine sGMTIME_max and sGMTIME_min." >&4
127             fi
128         $rm_try
129         ;;
130     esac
131
132 echo "Checking max offsets that localtime () accepts"
133
134 case "$sLOCALTIME_min/$sLOCALTIME_max" in
135     0/0|/)
136         $cat >try.c <<EOCP
137 #include <sys/types.h>
138 #include <stdio.h>
139 #include <time.h>
140
141 int i;
142 struct tm *tmp;
143 time_t pt;
144
145 void local_check (time_t t, int min_year, int max_year)
146 {
147     if (sizeof (time_t) > 4 && t > 0x7ffffffffffff000LL)
148         tmp = NULL;
149     else
150         tmp = localtime (&t);
151     if ( tmp == NULL ||
152         /* Check tm_year overflow */
153          tmp->tm_year < min_year || tmp->tm_year > max_year)
154         tmp = NULL;
155     else
156         pt = t;
157     } /* local_check */
158
159 int check_max ()
160 {
161     tmp = NULL;
162     pt  = 0;
163 #ifdef MAXLONG
164     local_check (MAXLONG, 69, 0x7fffffff);
165 #endif
166     if (tmp == NULL || tmp->tm_year < 0) {
167         for (i = 63; i >= 0; i--) {
168             time_t x = pt | ((time_t)1 << i);
169             if (x < 0 || x < pt) continue;
170             local_check (x, 69, 0x7fffffff);
171             }
172         }
173     printf ("sLOCALTIME_max=%ld\n", pt);
174     return (0);
175    } /* check_max */
176
177 int check_min ()
178 {
179     tmp = NULL;
180     pt  = 0;
181 #ifdef MINLONG
182     local_check (MINLONG, -1900, 70);
183 #endif
184     if (tmp == NULL) {
185         for (i = 36; i >= 0; i--) {
186             time_t x = pt - ((time_t)1 << i);
187             if (x > 0) continue;
188             local_check (x, -1900, 70);
189             }
190         }
191     printf ("sLOCALTIME_min=%ld\n", pt);
192     return (0);
193     } /* check_min */
194
195 int main (int argc, char *argv[])
196 {
197     check_max ();
198     check_min ();
199     return (0);
200     } /* main */
201 EOCP
202         set try
203         if eval $compile; then
204             eval `$run ./try 2>/dev/null`
205         else
206             echo "Cannot determine sLOCALTIME_max and sLOCALTIME_min." >&4
207             fi
208         $rm_try
209         ;;
210     esac
211