#include "gdtoa.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int getround ANSI((int,char*));
static char ibuf[2048], obuf[2048];
#define U (unsigned long)
#undef _0
#undef _1
#ifdef IEEE_BIG_ENDIAN
#define _0 0
#define _1 1
#define _2 2
#endif
#ifdef IEEE_LITTLE_ENDIAN
#define _0 2
#define _1 1
#define _2 0
#endif
int
main(Void)
{
char *s, *s1, *se, *se1;
int dItry, i, ndig = 0, r = 1;
union { long double d; ULong bits[3]; } u, v[2];
while((s = fgets(ibuf, sizeof(ibuf), stdin))) {
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);
}
printf("\nInput: %s", ibuf);
printf(" --> f = #%lx %lx %lx\n", U u.bits[_0],
U u.bits[_1], U u.bits[_2]);
goto fmt_test;
}
dItry = 1;
printf("\nInput: %s", ibuf);
i = strtorxL(ibuf, &se, r, u.bits);
if (r == 1 && (i != strtopxL(ibuf, &se1, v[0].bits) || se1 != se
|| memcmp(u.bits, v[0].bits, 12)))
printf("***strtoxL and strtorxL disagree!!\n:");
printf("\nstrtoxL consumes %d bytes and returns %d\n",
(int)(se-ibuf), i);
printf("with bits = #%lx %lx %lx\n",
U u.bits[_0], U u.bits[_1], U u.bits[_2]);
if (sizeof(long double) == 12)
printf("printf(\"%%.21Lg\") gives %.21Lg\n", u.d);
fmt_test:
se = g_xLfmt(obuf, u.bits, ndig, sizeof(obuf));
printf("g_xLfmt(%d) gives %d bytes: \"%s\"\n\n",
ndig, (int)(se-obuf), se ? obuf : "<null>");
if (!dItry)
continue;
printf("strtoIxL returns %d,",
strtoIxL(ibuf, &se, v[0].bits, v[1].bits));
printf(" consuming %d bytes.\n", (int)(se-ibuf));
if (!memcmp(v[0].bits, v[1].bits, 12)) {
if (!memcmp(u.bits, v[0].bits, 12))
printf("fI[0] == fI[1] == strtoxL\n");
else {
printf("fI[0] == fI[1] = #%lx %lx %lx\n",
U v[0].bits[_0], U v[0].bits[_1],
U v[0].bits[_2]);
if (sizeof(long double) == 12)
printf("= %.21Lg\n", v[0].d);
}
}
else {
printf("fI[0] = #%lx %lx %lx\n",
U v[0].bits[_0], U v[0].bits[_1],
U v[0].bits[_2]);
if (sizeof(long double) == 12)
printf("= %.21Lg\n", v[0].d);
printf("fI[1] = #%lx %lx %lx\n",
U v[1].bits[_0], U v[1].bits[_1],
U v[1].bits[_2]);
if (sizeof(long double) == 12)
printf("= %.21Lg\n", v[1].d);
if (!memcmp(v[0].bits, u.bits, 12))
printf("fI[0] == strtoxL\n");
else if (!memcmp(v[1].bits, u.bits, 12))
printf("fI[1] == strtoxL\n");
else
printf("**** Both differ from strtod ****\n");
}
printf("\n");
}
return 0;
}