Commit ea47d37c by Richard Stallman

*** empty log message ***

From-SVN: r838
parent 8cbe2917
...@@ -11,11 +11,13 @@ ...@@ -11,11 +11,13 @@
Copyright (c) 1988, 1989, 1990 Steven Pemberton, CWI, Amsterdam. Copyright (c) 1988, 1989, 1990 Steven Pemberton, CWI, Amsterdam.
All rights reserved. All rights reserved.
Changes by Richard Stallman:
Undef CHAR_BIT, etc., if defined in stdio.h, Richard Stallman, Aug 90. Undef CHAR_BIT, etc., if defined in stdio.h, Richard Stallman, Aug 90.
In EPROP, avoid a <= old if bad is set, Richard Stallman, May 91. In EPROP, avoid a <= old if bad is set, Richard Stallman, May 91.
Use gstddef.h, not stddef.h, Richard Stallman, Nov 91. Use gstddef.h, not stddef.h, Richard Stallman, Nov 91.
Don't declare malloc, instead cast the value, Richard Stallman, Nov 91. Don't declare malloc, instead cast the value, Richard Stallman, Nov 91.
Include sys/types.h before signal.h, Apr 92. 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.
COMPILING COMPILING
With luck and a following wind, just the following will work: With luck and a following wind, just the following will work:
...@@ -28,6 +30,7 @@ ...@@ -28,6 +30,7 @@
unsigned short and long -DNO_UI unsigned short and long -DNO_UI
void -DNO_VOID void -DNO_VOID
signal(), or setjmp/longjmp() -DNO_SIG signal(), or setjmp/longjmp() -DNO_SIG
%Lf in printf -DNO_LONG_DOUBLE_IO
Try to compile first with no flags, and see if you get any errors - Try to compile first with no flags, and see if you get any errors -
you might be surprised. (Most non-ANSI compilers need -DNO_SC, though.) you might be surprised. (Most non-ANSI compilers need -DNO_SC, though.)
...@@ -421,6 +424,7 @@ char *malloc ARGS((size_t size)); ...@@ -421,6 +424,7 @@ char *malloc ARGS((size_t size));
Procedure exit ARGS((int status)); Procedure exit ARGS((int status));
char *f_rep ARGS((int precision, Long_double val)); char *f_rep ARGS((int precision, Long_double val));
char *fake_f_rep ARGS((char *type, Long_double val));
int maximum_int NOARGS; int maximum_int NOARGS;
int cprop NOARGS; int cprop NOARGS;
...@@ -810,8 +814,29 @@ Procedure f_define(desc, extra, sort, name, precision, val, mark) ...@@ -810,8 +814,29 @@ Procedure f_define(desc, extra, sort, name, precision, val, mark)
/* Produce a #define for a float/double/long double */ /* Produce a #define for a float/double/long double */
describe(desc, extra); describe(desc, extra);
if (stdc) { if (stdc) {
#ifdef NO_LONG_DOUBLE_IO
static int union_defined = 0;
if (!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(" long double __convert_long_double_d;\n");
printf("};\n");
printf("#endif\n");
union_defined = 1;
}
printf("#define %s%s %s\n",
sort, name, fake_f_rep("long double", val));
} else {
printf("#define %s%s %s%s\n",
sort, name, f_rep(precision, val), mark);
}
#else
printf("#define %s%s %s%s\n", printf("#define %s%s %s%s\n",
sort, name, f_rep(precision, val), mark); sort, name, f_rep(precision, val), mark);
#endif
} else if (*mark == 'F') { } else if (*mark == 'F') {
/* non-ANSI C has no float constants, so cast the constant */ /* non-ANSI C has no float constants, so cast the constant */
printf("#define %s%s ((float)%s)\n", printf("#define %s%s ((float)%s)\n",
...@@ -865,19 +890,38 @@ int exponent(x, fract, exp) Long_double x; double *fract; int *exp; { ...@@ -865,19 +890,38 @@ int exponent(x, fract, exp) Long_double x; double *fract; int *exp; {
return 1; return 1;
} }
/* Print a value of type TYPE with value VAL,
assuming that sprintf can't handle this type properly (without truncation).
We create an expession that uses type casting to create the value from
a bit pattern. */
char *fake_f_rep(type, val) char *type; Long_double val; {
static char buf[1024];
union { int i[4]; Long_double ld;} u;
u.ld = val;
sprintf(buf, "(((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]);
return buf;
}
char *f_rep(precision, val) int precision; Long_double val; { char *f_rep(precision, val) int precision; Long_double val; {
/* Return the floating representation of val */ /* Return the floating representation of val */
static char buf[1024]; static char buf[1024];
char *f1; char *f1;
if (sizeof(double) == sizeof(Long_double)) { #ifdef NO_LONG_DOUBLE_IO
if (1)
#else
if (sizeof(double) == sizeof(Long_double))
#endif
{
double d = val;
/* Assume they're the same, and use non-stdc format */ /* Assume they're the same, and use non-stdc format */
/* This is for stdc compilers using non-stdc libraries */ /* This is for stdc compilers using non-stdc libraries */
f1= "%.*e"; sprintf(buf, "%.*e", precision, d);
} else { } else {
/* It had better support Le then */ /* It had better support Le then */
f1= "%.*Le"; sprintf(buf, "%.*Le", precision, val);
} }
sprintf(buf, f1, precision, val);
return buf; return buf;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment