This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
cb1be5454b337fbcf482d19d77a585cdfd017589
[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 i_values
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 ?T:yyy
54 : Check the max offset that gmtime and localtime accept
55 echo "Checking max offsets that gmtime () accepts"
56
57 case $i_values in
58     define) yyy="#include <values.h>" ;;
59     *)      yyy="" ;;
60     esac
61
62 $cat >try.c <<EOCP
63 #include <sys/types.h>
64 #include <stdio.h>
65 #include <time.h>
66 $yyy
67
68 int i;
69 struct tm *tmp;
70 time_t pt;
71
72 void gm_check (time_t t)
73 {
74     tmp = gmtime (&t);
75     if (tmp == NULL || tmp->tm_year < -1900)
76         tmp = NULL;
77     else
78         pt = t;
79     } /* gm_check */
80
81 int check_max ()
82 {
83     tmp = NULL;
84     pt  = 0;
85 #ifdef MAXLONG
86     gm_check (MAXLONG);
87 #endif
88     if (tmp == NULL || tmp->tm_year < 0) {
89         for (i = 63; i >= 0; i--) {
90             time_t x = pt | ((time_t)1 << i);
91             if (x < 0) continue;
92             gm_check (x);
93             }
94         }
95     printf ("sGMTIME_max=%ld\n", pt);
96     return (0);
97   } /* check_max */
98
99 int check_min ()
100 {
101     tmp = NULL;
102     pt  = 0;
103 #ifdef MINLONG
104     gm_check (MINLONG);
105 #endif
106     if (tmp == NULL) {
107         for (i = 36; i >= 0; i--) {
108             time_t x = pt - ((time_t)1 << i);
109             if (x > 0) continue;
110             gm_check (x);
111             }
112         }
113     printf ("sGMTIME_min=%ld\n", pt);
114     return (0);
115     } /* check_min */
116
117 int main (int argc, char *argv[])
118 {
119     fprintf (stderr, "Sizeof time_t = %ld\n", sizeof (time_t));
120     check_max ();
121     check_min ();
122     return (0);
123     } /* main */
124 EOCP
125 set try
126 if eval $compile; then
127     eval `$run ./try`
128 else
129     echo "Cannot determine sGMTIME_max and sGMTIME_min." >&4
130     fi
131 $rm_try
132
133 echo "Checking max offsets that localtime () accepts"
134
135 $cat >try.c <<EOCP
136 #include <sys/types.h>
137 #include <stdio.h>
138 #include <time.h>
139 $yyy
140
141 int i;
142 struct tm *tmp;
143 time_t pt;
144
145 void local_check (time_t t)
146 {
147     tmp = localtime (&t);
148     if (tmp == NULL || tmp->tm_year < -1900)
149         tmp = NULL;
150     else
151         pt = t;
152     } /* local_check */
153
154 int check_max ()
155 {
156     tmp = NULL;
157     pt  = 0;
158 #ifdef MAXLONG
159     local_check (MAXLONG);
160 #endif
161     if (tmp == NULL || tmp->tm_year < 0) {
162         for (i = 63; i >= 0; i--) {
163             time_t x = pt | ((time_t)1 << i);
164             if (x < 0) continue;
165             local_check (x);
166             }
167         }
168     printf ("sLOCALTIME_max=%ld\n", pt);
169     return (0);
170   } /* check_max */
171
172 int check_min ()
173 {
174     tmp = NULL;
175     pt  = 0;
176 #ifdef MINLONG
177     local_check (MINLONG);
178 #endif
179     if (tmp == NULL) {
180         for (i = 36; i >= 0; i--) {
181             time_t x = pt - ((time_t)1 << i);
182             if (x > 0) continue;
183             local_check (x);
184             }
185         }
186     printf ("sLOCALTIME_min=%ld\n", pt);
187     return (0);
188     } /* check_min */
189
190 int main (int argc, char *argv[])
191 {
192     check_max ();
193     check_min ();
194     return (0);
195     } /* main */
196 EOCP
197 set try
198 if eval $compile; then
199     eval `$run ./try`
200 else
201     echo "Cannot determine sLOCALTIME_max and sLOCALTIME_min." >&4
202     fi
203 $rm_try
204