diff options
Diffstat (limited to 'test/pftest.c')
-rw-r--r-- | test/pftest.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/test/pftest.c b/test/pftest.c new file mode 100644 index 0000000000000..99d78ee451c1a --- /dev/null +++ b/test/pftest.c @@ -0,0 +1,158 @@ +/**************************************************************** + +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; + } |