minix/lib/libc/gdtoa/test/pftest.c
Lionel Sambuc f14fb60209 Libraries updates and cleanup
* Updating common/lib
 * Updating lib/csu
 * Updating lib/libc
 * Updating libexec/ld.elf_so
 * Corrected test on __minix in featuretest to actually follow the
   meaning of the comment.
 * Cleaned up _REENTRANT-related defintions.
 * Disabled -D_REENTRANT for libfetch
 * Removing some unneeded __NBSD_LIBC defines and tests

Change-Id: Ic1394baef74d11b9f86b312f5ff4bbc3cbf72ce2
2013-01-14 11:36:26 +01:00

159 lines
3.4 KiB
C

/****************************************************************
The author of this software is David M. Gay.
Copyright (C) 2009 by David M. Gay
All Rights Reserved
Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
source-code copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation.
THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
****************************************************************/
#include "stdio1.h"
#include "gdtoa.h"
#include <string.h>
#undef allow_Quad
#undef want_Quad
#undef want_Ux
#define want_LD
typedef union Ud {double x; unsigned int u[2]; } Ud;
#ifdef __x86_64 /*{{*/
#define want_Ux
#ifndef NO_GDTOA_i386_Quad /*{*/
typedef union UQ {__float128 x; unsigned int u[4]; } UQ;
#define allow_Quad(x) x
#define want_Quad
#endif /*}*/
#else /*}{*/
#ifdef __i386 /*{{*/
#define want_Ux
#else /*}{*/
#ifdef __sparc /*{{*/
typedef union UQ {long double x; unsigned int u[4]; } Ux;
#else /*}{*/
#ifdef __INTEL_COMPILER /*{*/
#undef want_Quad
#undef want_Ux
#undef want_LD
#endif /*}*/
#endif /*}}*/
#endif /*}}*/
#endif /*}}*/
#ifndef allow_Quad
#define allow_Quad(x) /*nothing*/
#endif
#ifdef want_Ux /*{{*/
typedef union Ux {long double x; unsigned short u[5]; } Ux;
#else /*}{*/
#ifdef __sparc
#define want_Ux
#endif
#endif /*}}*/
int
main(void)
{
Ud d;
allow_Quad(UQ q;)
char *b, buf[256], fmt[32], *s;
#ifdef want_Ux
Ux x;
x.x = 0.;
#endif
int k;
k = 0;
strcpy(fmt, "%.g");
d.x = 0.;
allow_Quad(q.x = 0.;)
while(fgets(buf, sizeof(buf), stdin)) {
for(b = buf; *b && *b != '\n'; ++b);
*b = 0;
if (b == buf)
continue;
b = buf;
if (*b == '%') {
for(k = 0; *b > ' '; ++b)
#ifdef want_LD /*{{*/
switch(*b) {
case 'L':
k = 1;
#ifdef want_Quad
break;
case 'q':
if (k >= 1)
k = 2;
#endif
}
#else /*}{*/
;
#endif /*}}*/
if (*b)
*b++ = 0;
if (b - buf < sizeof(fmt)) {
strcpy(fmt, buf);
}
}
if (*b) {
switch(k) {
case 0:
d.x = strtod(b,&s);
break;
case 1:
#ifdef want_Ux
#ifdef __sparc
strtopQ(b,&s,&x.x);
#else
strtopx(b,&s,&x.x);
#endif
#else
strtopQ(b,&s,&q.x);
#endif
break;
allow_Quad(case 2: strtopQ(b,&s,&q.x);)
}
if (*s)
printf("Ignoring \"%s\"\n", s);
}
switch(k) {
case 0:
printf("d.x = %.g = #%x %x; %s ==> ", d.x, d.u[1], d.u[0], fmt);
printf(fmt, d.x);
break;
case 1:
#ifdef __sparc
printf("x.x = %.Lg = #%x %x %x %x; %s ==> ", x.x,
x.u[0], x.u[1], x.u[2], x.u[3], fmt);
#else
printf("x.x = %.Lg = #%x %x %x %x %x; %s ==> ", x.x,
x.u[4], x.u[3], x.u[2], x.u[1], x.u[0], fmt);
#endif
printf(fmt, x.x);
#ifdef want_Quad
break;
case 2:
printf("q.x = %.Lqg = #%x %x %x %x; %s ==> ", q.x,
q.u[3], q.u[2], q.u[1], q.u[0], fmt);
printf(fmt, q.x);
#endif
}
putchar('\n');
}
return 0;
}