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
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
4 ?RCS:
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:
26 ?MAKE:d_castneg castflags: cat Compile rm_try Setvar signal_t run i_stdlib
27 ?MAKE:  -pick add $@ %<
28 ?S:d_castneg:
29 ?S:     This variable conditionally defines CASTNEG, which indicates
30 ?S:     whether the C compiler can cast negative float to unsigned.
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:.
55 ?F:!try
56 ?LINT:set d_castneg
57 : check for ability to cast negative floats to unsigned
58 echo " "
59 echo 'Checking whether your C compiler can cast negative float to unsigned.' >&4
60 $cat >try.c <<EOCP
61 #include <stdio.h>
62 #$i_stdlib I_STDLIB
63 #ifdef I_STDLIB
64 #include <stdlib.h>
65 #endif
66 #include <sys/types.h>
67 #include <signal.h>
68 $signal_t blech(int s) { exit(7); }
69 $signal_t blech_in_list(int s) { exit(4); }
70 unsigned long dummy_long(unsigned long p) { return p; }
71 unsigned int dummy_int(unsigned int p) { return p; }
72 unsigned short dummy_short(unsigned short p) { return p; }
73 int 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];
81
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         */
86         /* Store the number in a writable string for gcc to pass to
87            sscanf under HP-UX.
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 }
142 EOCP
143 set try
144 if eval $compile_ok; then
145         $run ./try
146         castflags=$?
147 else
148         echo "(I can't seem to compile the test program--assuming it can't)"
149         castflags=7
150 fi
151 case "$castflags" in
152 0)      val="$define"
153         echo "Yup, it can."
154         ;;
155 *)      val="$undef"
156         echo "Nope, it can't."
157         ;;
158 esac
159 set d_castneg
160 eval $setvar
161 $rm_try
162