ORCA-C/Tests/Conformance/c99printfa.c

144 lines
4.5 KiB
C

/*
* Test 'a' and 'A' conversions in printf (C99).
*
* This makes certain assumptions about implementation-defined
* behavior like the positioning of bits in hex float output.
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main(void) {
char buf[100];
snprintf(buf, sizeof(buf), "%.15La %0.10LA", 123.0L, -234.0L);
if (strcmp(buf, "0xf.600000000000000p+3 -0XE.A000000000P+4"))
goto Fail;
snprintf(buf, sizeof(buf), "% 10.15La", 123.0L);
if (strcmp(buf, " 0xf.600000000000000p+3"))
goto Fail;
snprintf(buf, sizeof(buf), "%+ 25.15La", 123.0L);
if (strcmp(buf, " +0xf.600000000000000p+3"))
goto Fail;
snprintf(buf, sizeof(buf), "%.0La %#.0La", 123.0L, 123.0L);
if (strcmp(buf, "0xfp+3 0xf.p+3"))
goto Fail;
snprintf(buf, sizeof(buf), "%10.0La", 123.0L);
if (strcmp(buf, " 0xfp+3"))
goto Fail;
snprintf(buf, sizeof(buf), "%0#10.0La", 123.0L);
if (strcmp(buf, "0x000f.p+3"))
goto Fail;
snprintf(buf, sizeof(buf), "%-010.0La", 123.0L);
if (strcmp(buf, "0xfp+3 "))
goto Fail;
snprintf(buf, sizeof(buf), "%La", 0xf.abcdef012345678p-16000L);
if (strcmp(buf, "0xf.abcdef012345678p-16000"))
goto Fail;
snprintf(buf, sizeof(buf), "%30La", -0xf.abcdef012345678p+16000L);
if (strcmp(buf, " -0xf.abcdef012345678p+16000"))
goto Fail;
snprintf(buf, sizeof(buf), "%.15A", -0.0);
if (strcmp(buf, "-0X0.000000000000000P+0"))
goto Fail;
snprintf(buf, sizeof(buf), "%010A", -INFINITY);
if (strcmp(buf, " -INF"))
goto Fail;
snprintf(buf, sizeof(buf), "%A", NAN);
if (!strstr(buf, "NAN"))
goto Fail;
snprintf(buf, sizeof(buf), "%LA", (long double)LDBL_MAX);
if (strcmp(buf, "0XF.FFFFFFFFFFFFFFFP+16380"))
goto Fail;
#ifdef __ORCAC__
snprintf(buf, sizeof(buf), "%.10LA", -(long double)LDBL_MAX);
if (strcmp(buf, "-0X8.0000000000P+16381"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", (long double)LDBL_MAX);
if (strcmp(buf, "0X8.00000000000000P+16381"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", 0XF.FFFFFFFFFFFFFF8P+16380L);
if (strcmp(buf, "0X8.00000000000000P+16381"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", 0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "0XF.FFFFFFFFFFFFFFP+16380"))
goto Fail;
snprintf(buf, sizeof(buf), "%.6LA", 0XF.1234567p-50L);
if (strcmp(buf, "0XF.123456P-50"))
goto Fail;
snprintf(buf, sizeof(buf), "%.6LA", 0XF.1234568p+500L);
if (strcmp(buf, "0XF.123456P+500"))
goto Fail;
snprintf(buf, sizeof(buf), "%.6LA", -0XF.1234569p+5000L);
if (strcmp(buf, "-0XF.123457P+5000"))
goto Fail;
fesetround(FE_UPWARD);
snprintf(buf, sizeof(buf), "%.14LA", 0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "0X8.00000000000000P+16381"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", -0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "-0XF.FFFFFFFFFFFFFFP+16380"))
goto Fail;
fesetround(FE_DOWNWARD);
snprintf(buf, sizeof(buf), "%.14LA", -0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "-0X8.00000000000000P+16381"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", 0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "0XF.FFFFFFFFFFFFFFP+16380"))
goto Fail;
fesetround(FE_TOWARDZERO);
snprintf(buf, sizeof(buf), "%.14LA", -0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "-0XF.FFFFFFFFFFFFFFP+16380"))
goto Fail;
snprintf(buf, sizeof(buf), "%.14LA", 0XF.FFFFFFFFFFFFFF7P+16380L);
if (strcmp(buf, "0XF.FFFFFFFFFFFFFFP+16380"))
goto Fail;
fesetround(FE_TONEAREST);
snprintf(buf, sizeof(buf), "%La", (long double)0x1p-16445);
if (strcmp(buf, "0x0.000000000000002p-16386"))
goto Fail;
#endif
printf ("Passed Conformance Test c99printfa\n");
return 0;
Fail:
printf ("Failed Conformance Test c99printfa\n");
}