This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #81910] [PATCH] Fix typos (spelling errors) in Porting/*.
[metaconfig.git] / U / compline / d_castneg.U
CommitLineData
959f3c4c
JH
1?RCS: $Id: d_castneg.U,v 3.0.1.2 1995/05/12 12:11:21 ram Exp $
2?RCS:
3?RCS: Copyright (c) 1991-1993, Raphael Manfredi
0065f4af 4?RCS:
959f3c4c
JH
5?RCS: You may redistribute only under the terms of the Artistic Licence,
6?RCS: as specified in the README file that comes with the distribution.
7?RCS: You may reuse parts of this distribution only within the terms of
8?RCS: that same Artistic Licence; a copy of which may be found at the root
9?RCS: of the source tree for dist 3.0.
10?RCS:
11?RCS: $Log: d_castneg.U,v $
12?RCS: Revision 3.0.1.2 1995/05/12 12:11:21 ram
13?RCS: patch54: made sure cc and ccflags are conditional dependencies
14?RCS: patch54: added improved test case for Interactive Unix
15?RCS:
16?RCS: Revision 3.0.1.1 1994/10/29 16:10:50 ram
17?RCS: patch36: don't forget to tell user about compilation failures (ADO)
18?RCS: patch36: declare signal handler correctly using 'signal_t' (ADO)
19?RCS:
20?RCS: Revision 3.0 1993/08/18 12:05:47 ram
21?RCS: Baseline for dist 3.0 netwide release.
22?RCS:
23?X:
24?X: Can the compiler cast negative / odd floats to unsigned values.
25?X:
2cb64bf6 26?MAKE:d_castneg castflags: cat Compile rm_try Setvar signal_t run i_stdlib
959f3c4c
JH
27?MAKE: -pick add $@ %<
28?S:d_castneg:
29?S: This variable conditionally defines CASTNEG, which indicates
4dd7201d 30?S: whether the C compiler can cast negative float to unsigned.
959f3c4c
JH
31?S:.
32?S:castflags:
33?S: This variable contains a flag that precise difficulties the
34?S: compiler has casting odd floating values to unsigned long:
35?S: 0 = ok
36?S: 1 = couldn't cast < 0
37?S: 2 = couldn't cast >= 0x80000000
38?S: 4 = couldn't cast in argument expression list
39?S:.
40?C:CASTNEGFLOAT:
41?C: This symbol is defined if the C compiler can cast negative
42?C: numbers to unsigned longs, ints and shorts.
43?C:.
44?C:CASTFLAGS:
45?C: This symbol contains flags that say what difficulties the compiler
46?C: has casting odd floating values to unsigned long:
47?C: 0 = ok
48?C: 1 = couldn't cast < 0
49?C: 2 = couldn't cast >= 0x80000000
50?C: 4 = couldn't cast in argument expression list
51?C:.
52?H:#$d_castneg CASTNEGFLOAT /**/
53?H:#define CASTFLAGS $castflags /**/
54?H:.
0065f4af 55?F:!try
959f3c4c
JH
56?LINT:set d_castneg
57: check for ability to cast negative floats to unsigned
58echo " "
59echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4
60$cat >try.c <<EOCP
61#include <stdio.h>
3b148aa9
JH
62#$i_stdlib I_STDLIB
63#ifdef I_STDLIB
64#include <stdlib.h>
65#endif
959f3c4c
JH
66#include <sys/types.h>
67#include <signal.h>
dc952a08
JH
68$signal_t blech(int s) { exit(7); }
69$signal_t blech_in_list(int s) { exit(4); }
70unsigned long dummy_long(unsigned long p) { return p; }
71unsigned int dummy_int(unsigned int p) { return p; }
72unsigned short dummy_short(unsigned short p) { return p; }
959f3c4c
JH
73int main()
74{
75 double f;
76 unsigned long along;
77 unsigned int aint;
78 unsigned short ashort;
79 int result = 0;
80 char str[16];
2cb64bf6 81
959f3c4c
JH
82 /* Frustrate gcc-2.7.2's optimizer which failed this test with
83 a direct f = -123. assignment. gcc-2.8.0 reportedly
84 optimized the whole file away
85 */
2cb64bf6 86 /* Store the number in a writable string for gcc to pass to
191290bc 87 sscanf under HP-UX.
959f3c4c
JH
88 */
89 sprintf(str, "-123");
90 sscanf(str, "%lf", &f); /* f = -123.; */
91
92 signal(SIGFPE, blech);
93 along = (unsigned long)f;
94 aint = (unsigned int)f;
95 ashort = (unsigned short)f;
96 if (along != (unsigned long)-123)
97 result |= 1;
98 if (aint != (unsigned int)-123)
99 result |= 1;
100 if (ashort != (unsigned short)-123)
101 result |= 1;
102 sprintf(str, "1073741824.");
103 sscanf(str, "%lf", &f); /* f = (double)0x40000000; */
104 f = f + f;
105 along = 0;
106 along = (unsigned long)f;
107 if (along != 0x80000000)
108 result |= 2;
109 f -= 1.;
110 along = 0;
111 along = (unsigned long)f;
112 if (along != 0x7fffffff)
113 result |= 1;
114 f += 2.;
115 along = 0;
116 along = (unsigned long)f;
117 if (along != 0x80000001)
118 result |= 2;
119 if (result)
120 exit(result);
121?X:
122?X: The following is a test for Interactive Unix Version 4.1, which
123?X: has an 'improved' compiler which can correctly cast negative
124?X: floats in expression lists, but apparently not in argument lists.
125?X: Contributed by Winfried Koenig <win@incom.rhein-main.de>
126?X:
127 signal(SIGFPE, blech_in_list);
128 sprintf(str, "123.");
129 sscanf(str, "%lf", &f); /* f = 123.; */
130 along = dummy_long((unsigned long)f);
131 aint = dummy_int((unsigned int)f);
132 ashort = dummy_short((unsigned short)f);
133 if (along != (unsigned long)123)
134 result |= 4;
135 if (aint != (unsigned int)123)
136 result |= 4;
137 if (ashort != (unsigned short)123)
138 result |= 4;
139 exit(result);
140
141}
142EOCP
143set try
144if eval $compile_ok; then
0f00356b 145 $run ./try
959f3c4c
JH
146 castflags=$?
147else
148 echo "(I can't seem to compile the test program--assuming it can't)"
149 castflags=7
150fi
151case "$castflags" in
1520) val="$define"
153 echo "Yup, it can."
154 ;;
155*) val="$undef"
156 echo "Nope, it can't."
157 ;;
158esac
159set d_castneg
160eval $setvar
2cb64bf6 161$rm_try
959f3c4c 162