Include sys/types.h before signal.h, Apr 92.
Support NO_LONG_DOUBLE_IO in f_define and f_rep; new fn fake_f_rep, Apr 92.
Enclose -f output in #ifndef _FLOAT_H___, Richard Stallman, May 92.
+
Add #undef before every #define, Jim Wilson, Dec 92.
+ Changes by Paul Eggert, installed Feb 93:
+ (fake_f_rep): Clear all of u, initially. Make the ints in u unsigned.
+ (f_define): Use ordinary constants for long double
+ if it's same width as double. Make __convert_long_double_i unsigned.
+ Richard Stallman, May 93:
+ In F_check, check NO_LONG_DOUBLE_IO.
+
COMPILING
With luck and a following wind, just the following will work:
cc enquire.c -o enquire
if (stdc) {
#ifdef NO_LONG_DOUBLE_IO
static int union_defined = 0;
- if (!strcmp(sort, "LDBL")) {
+ if (sizeof(double) != sizeof(Long_double)
+ && !strcmp(sort, "LDBL")) {
if (!union_defined) {
printf("#ifndef __LDBL_UNION__\n");
printf("#define __LDBL_UNION__\n");
printf("union __convert_long_double {\n");
- printf(" int __convert_long_double_i[4];\n");
+ printf(" unsigned __convert_long_double_i[4];\n");
printf(" long double __convert_long_double_d;\n");
printf("};\n");
printf("#endif\n");
char *fake_f_rep(type, val) char *type; Long_double val; {
static char buf[1024];
- union { int i[4]; Long_double ld;} u;
+ union { unsigned int i[4]; Long_double ld;} u;
+ u.i[0] = u.i[1] = u.i[2] = u.i[3] = 0;
u.ld = val;
sprintf(buf, "(__extension__ ((union __convert_long_double) {0x%x, 0x%x, 0x%x, 0x%x}).__convert_long_double_d)",
u.i[0], u.i[1], u.i[2], u.i[3]);
that sscanf read the number back identically. Harsh yes, but
sometimes you've got to be cruel to be kind.
*/
- Long_double new1;
Number val, new, diff;
double rem;
int e;
char *rep;
char *f2;
+#ifdef NO_LONG_DOUBLE_IO
+ double new1;
+ /* On the Sun 3, sscanf clobbers 4 words,
+ which leads to a crash when this function tries to return. */
+ f2= "%le"; /* Input */
+ /* It is no use checking long doubles if we can't
+ read and write them. */
+ if (sizeof (Number) > sizeof(double))
+ return;
+#else
+ Long_double new1;
if (sizeof(double) == sizeof(Long_double)) {
/* Assume they're the same, and use non-stdc format */
/* This is for stdc compilers using non-stdc libraries */
/* It had better support Le then */
f2= "%Le";
}
+#endif
val= val1;
rep= f_rep(precision, (Long_double) val);
if (setjmp(lab)==0) {