/* Test program for %a printf formats.  */

#include <stdio.h>
#include <string.h>

#ifndef WIDE
# define STR_LEN strlen
# define STR_CMP strcmp
# define SPRINT snprintf
# define CHAR_T char
# define PRINT printf
# define L_(Str) Str
# define S "%s"
#else
# define STR_LEN wcslen
# define SPRINT swprintf
# define STR_CMP wcscmp
# define CHAR_T wchar_t
# define PRINT wprintf
# define L_(Str) L##Str
# define S "%ls"
#endif

struct testcase
{
  double value;
  const CHAR_T *fmt;
  const CHAR_T *expect;
};

static const struct testcase testcases[] =
  {
    { 0x0.0030p+0, L_("%a"),		L_("0x1.8p-11") },
    { 0x0.0040p+0, L_("%a"),		L_("0x1p-10") },
    { 0x0.0030p+0, L_("%040a"),		L_("0x00000000000000000000000000000001.8p-11") },
    { 0x0.0040p+0, L_("%040a"),		L_("0x0000000000000000000000000000000001p-10") },
    { 0x0.0040p+0, L_("%40a"),		L_("                                 0x1p-10") },
    { 0x0.0040p+0, L_("%#40a"),		L_("                                0x1.p-10") },
    { 0x0.0040p+0, L_("%-40a"),		L_("0x1p-10                                 ") },
    { 0x0.0040p+0, L_("%#-40a"),	L_("0x1.p-10                                ") },
    { 0x0.0030p+0, L_("%040e"),		L_("00000000000000000000000000007.324219e-04") },
    { 0x0.0040p+0, L_("%040e"),		L_("00000000000000000000000000009.765625e-04") },
  };


static int
do_test (void)
{
  const struct testcase *t;
  int result = 0;

  for (t = testcases;
       t < &testcases[sizeof testcases / sizeof testcases[0]];
       ++t)
    {
      CHAR_T buf[1024];
      int n = SPRINT (buf, sizeof buf / sizeof (buf[0]), t->fmt, t->value);
      if (n != STR_LEN (t->expect) || STR_CMP (buf, t->expect) != 0)
	{
	  PRINT (L_("" S "\tExpected \"" S "\" (%Zu)\n\tGot      \""
		    S "\" (%d, %Zu)\n"),
		 t->fmt, t->expect, STR_LEN (t->expect),
		 buf, n, STR_LEN (buf));
	  result = 1;
	}
    }

  return result;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
