#include "gdtoa.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int getround ANSI((int,char*));
static char ibuf[2048], obuf[2048];
#undef _0
#undef _1
#ifdef IEEE_BIG_ENDIAN
#define _0 0
#define _1 1
#define _2 2
#define _3 3
#endif
#ifdef IEEE_LITTLE_ENDIAN
#define _0 3
#define _1 2
#define _2 1
#define _3 0
#endif
#define U (unsigned long)
int
main(Void)
{
char *s, *s1, *se, *se1;
int Ltest, i, dItry, ndig = 0, r = 1;
union { long double d; ULong bits[4]; } u, v[2], w;
w.bits[0] = w.bits[3] = 0;
w.d = 1.;
u.d = 3.;
w.d = w.d / u.d;
Ltest = sizeof(long double) == 16 && w.bits[0] && w.bits[3];
while( (s = fgets(ibuf, sizeof(ibuf), stdin)) !=0) {
while(*s <= ' ')
if (!*s++)
continue;
dItry = 0;
switch(*s) {
case 'r':
r = getround(r, s);
continue;
case 'n':
i = s[1];
if (i <= ' ' || (i >= '0' && i <= '9')) {
ndig = atoi(s+1);
continue;
}
break;
case '#':
u.bits[_0] = (ULong)strtoul(s1 = s+1, &se, 16);
if (se > s1) {
u.bits[_1] = (ULong)strtoul(s1 = se, &se, 16);
if (se > s1) {
u.bits[_2] = (ULong)strtoul(s1 = se, &se, 16);
if (se > s1)
u.bits[_3] = (ULong)strtoul(s1 = se, &se, 16);
}
}
printf("\nInput: %s", ibuf);
printf(" --> f = #%lx %lx %lx %lx\n", U u.bits[_0],
U u.bits[_1], U u.bits[_2], U u.bits[_3]);
goto fmt_test;
}
dItry = 1;
printf("\nInput: %s", ibuf);
i = strtorQ(ibuf, &se, r, u.bits);
if (r == 1 && (strtopQ(ibuf,&se1,v[0].bits) != i
|| se != se1 || memcmp(u.bits, v[0].bits, 16)))
printf("***strtoQ and strtorQ disagree!!\n:");
printf("\nstrtoQ consumes %d bytes and returns %d\n",
(int)(se-ibuf), i);
printf("with bits = #%lx %lx %lx %lx\n",
U u.bits[_0], U u.bits[_1], U u.bits[_2], U u.bits[_3]);
fmt_test:
if (Ltest)
printf("printf(\"%%.35Lg\") gives %.35Lg\n", u.d);
se = g_Qfmt(obuf, u.bits, ndig, sizeof(obuf));
printf("g_Qfmt(%d) gives %d bytes: \"%s\"\n\n", ndig,
(int)(se-obuf), se ? obuf : "<null>");
if (!dItry)
continue;
printf("strtoIQ returns %d,",
strtoIQ(ibuf, &se, v[0].bits, v[1].bits));
printf(" consuming %d bytes.\n", (int)(se-ibuf));
if (!memcmp(v[0].bits, v[1].bits, 16)) {
if (!memcpy(u.bits, v[0].bits, 16))
printf("fI[0] == fI[1] == strtoQ\n");
else {
printf("fI[0] == fI[1] = #%lx %lx %lx %lx\n",
U v[0].bits[_0], U v[0].bits[_1],
U v[0].bits[_2], U v[0].bits[_3]);
if (Ltest)
printf("= %.35Lg\n", v[0].d);
}
}
else {
printf("fI[0] = #%lx %lx %lx %lx\n",
U v[0].bits[_0], U v[0].bits[_1],
U v[0].bits[_2], U v[0].bits[_3]);
if (Ltest)
printf("= %.35Lg\n", v[0].d);
printf("fI[1] = #%lx %lx %lx %lx\n",
U v[1].bits[_0], U v[1].bits[_1],
U v[1].bits[_2], U v[1].bits[_3]);
if (Ltest)
printf("= %.35Lg\n", v[1].d);
if (!memcmp(v[0].bits, u.bits, 16))
printf("fI[0] == strtod\n");
else if (!memcmp(v[1].bits, u.bits, 16))
printf("fI[1] == strtod\n");
else
printf("**** Both differ from strtod ****\n");
}
printf("\n");
}
return 0;
}