/* Copyright (C) 2007-2025 Free Software Foundation, Inc.
   Contributed by Andy Vaught
   Write float code factoring to this file by Jerry DeLisle
   F2003 I/O support contributed by Jerry DeLisle

This file is part of the GNU Fortran runtime library (libgfortran).

Libgfortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

Libgfortran is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

#include "config.h"

typedef enum
{ S_NONE, S_MINUS, S_PLUS }
sign_t;

/* Given a flag that indicates if a value is negative or not, return a
   sign_t that gives the sign that we need to produce.  */

static sign_t
calculate_sign (st_parameter_dt *dtp, int negative_flag)
{
  sign_t s = S_NONE;

  if (negative_flag)
    s = S_MINUS;
  else
    switch (dtp->u.p.sign_status)
      {
      case SIGN_SP:	/* Show sign. */
	s = S_PLUS;
	break;
      case SIGN_SS:	/* Suppress sign. */
	s = S_NONE;
	break;
      case SIGN_S:	/* Processor defined. */
      case SIGN_UNSPECIFIED:
	s = options.optional_plus ? S_PLUS : S_NONE;
	break;
      }

  return s;
}


/* Determine the precision except for EN format. For G format,
   determines an upper bound to be used for sizing the buffer. */

static int
determine_precision (st_parameter_dt * dtp, const fnode * f, int len)
{
  int precision = f->u.real.d;

  switch (f->format)
    {
    case FMT_F:
    case FMT_G:
      precision += dtp->u.p.scale_factor;
      break;
    case FMT_ES:
      /* Scale factor has no effect on output.  */
      break;
    case FMT_E:
    case FMT_D:
      /* See F2008 10.7.2.3.3.6 */
      if (dtp->u.p.scale_factor <= 0)
	precision += dtp->u.p.scale_factor - 1;
      break;
    default:
      return -1;
    }

  /* If the scale factor has a large negative value, we must do our
     own rounding? Use ROUND='NEAREST', which should be what snprintf
     is using as well.  */
  if (precision < 0 &&
      (dtp->u.p.current_unit->round_status == ROUND_UNSPECIFIED
       || dtp->u.p.current_unit->round_status == ROUND_PROCDEFINED))
    dtp->u.p.current_unit->round_status = ROUND_NEAREST;

  /* Add extra guard digits up to at least full precision when we do
     our own rounding.  */
  if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED
      && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED)
    {
      precision += 2 * len + 4;
      if (precision < 0)
	precision = 0;
    }

  return precision;
}


/* Build a real number according to its format which is FMT_G free.  */

static void
build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
		    size_t size, int nprinted, int precision, int sign_bit,
		    bool zero_flag, int npad, int default_width, char *result,
		    size_t *len)
{
  char *put;
  char *digits;
  int e, w, d, p, i;
  char expchar, rchar;
  format_token ft;
  /* Number of digits before the decimal point.  */
  int nbefore;
  /* Number of zeros after the decimal point.  */
  int nzero;
  /* Number of digits after the decimal point.  */
  int nafter;
  int leadzero;
  int nblanks;
  int ndigits, edigits;
  sign_t sign;

  ft = f->format;
  if (f->u.real.w == DEFAULT_WIDTH)
    /* This codepath can only be reached with -fdec-format-defaults. */
    {
      w = default_width;
      d = precision;
    }
  else
    {
      w = f->u.real.w;
      d = f->u.real.d;
    }
  p = dtp->u.p.scale_factor;
  *len = 0;

  rchar = '5';

  /* We should always know the field width and precision.  */
  if (d < 0)
    internal_error (&dtp->common, "Unspecified precision");

  sign = calculate_sign (dtp, sign_bit);

  /* Calculate total number of digits.  */
  if (ft == FMT_F)
    ndigits = nprinted - 2;
  else
    ndigits = precision + 1;

  /* Read the exponent back in.  */
  if (ft != FMT_F)
    e = atoi (&buffer[ndigits + 3]) + 1;
  else
    e = 0;

  /* Make sure zero comes out as 0.0e0.   */
  if (zero_flag)
    e = 0;

  /* Normalize the fractional component.  */
  if (ft != FMT_F)
    {
      buffer[2] = buffer[1];
      digits = &buffer[2];
    }
  else
    digits = &buffer[1];

  /* Figure out where to place the decimal point.  */
  switch (ft)
    {
    case FMT_F:
      nbefore = ndigits - precision;
      if ((w > 0) && (nbefore > (int) size))
        {
	  *len = w;
	  star_fill (result, w);
	  result[w] = '\0';
	  return;
	}
      /* Make sure the decimal point is a '.'; depending on the
	 locale, this might not be the case otherwise.  */
      digits[nbefore] = '.';
      if (p != 0)
	{
	  if (p > 0)
	    {
	      memmove (digits + nbefore, digits + nbefore + 1, p);
	      digits[nbefore + p] = '.';
	      nbefore += p;
	      nafter = d;
	      nzero = 0;
	    }
	  else /* p < 0  */
	    {
	      if (nbefore + p >= 0)
		{
		  nzero = 0;
		  memmove (digits + nbefore + p + 1, digits + nbefore + p, -p);
		  nbefore += p;
		  digits[nbefore] = '.';
		  nafter = d;
		}
	      else
		{
		  nzero = -(nbefore + p);
		  memmove (digits + 1, digits, nbefore);
		  nafter = d - nzero;
		  if (nafter == 0 && d > 0)
		    {
		      /* This is needed to get the correct rounding. */
		      memmove (digits + 1, digits, ndigits - 1);
		      digits[1] = '0';
		      nafter = 1;
		      nzero = d - 1;
		    }
		  else if (nafter < 0)
		    {
		      /* Reset digits to 0 in order to get correct rounding
			 towards infinity. */
		      for (i = 0; i < ndigits; i++)
			digits[i] = '0';
		      digits[ndigits - 1] = '1';
		      nafter = d;
		      nzero = 0;
		    }
		  nbefore = 0;
		}
	    }
	}
      else
	{
	  nzero = 0;
	  nafter = d;
	}

      while (digits[0] == '0' && nbefore > 0)
	{
	  digits++;
	  nbefore--;
	  ndigits--;
	}

      expchar = 0;
      /* If we need to do rounding ourselves, get rid of the dot by
	 moving the fractional part.  */
      if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED
	  && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED)
	memmove (digits + nbefore, digits + nbefore + 1, ndigits - nbefore);
      break;

    case FMT_E:
    case FMT_D:
      i = dtp->u.p.scale_factor;
      if (d < 0 && p == 0)
	{
	  generate_error (&dtp->common, LIBERROR_FORMAT, "Precision not "
			  "greater than zero in format specifier 'E' or 'D'");
	  return;
	}
      if (p <= -d || p >= d + 2)
	{
	  generate_error (&dtp->common, LIBERROR_FORMAT, "Scale factor "
			  "out of range in format specifier 'E' or 'D'");
	  return;
	}

      if (!zero_flag)
	e -= p;
      if (p < 0)
	{
	  nbefore = 0;
	  nzero = -p;
	  nafter = d + p;
	}
      else if (p > 0)
	{
	  nbefore = p;
	  nzero = 0;
	  nafter = (d - p) + 1;
	}
      else /* p == 0 */
	{
	  nbefore = 0;
	  nzero = 0;
	  nafter = d;
	}

      if (ft == FMT_E)
	expchar = 'E';
      else
	expchar = 'D';
      break;

    case FMT_EN:
      /* The exponent must be a multiple of three, with 1-3 digits before
	 the decimal point.  */
      if (!zero_flag)
        e--;
      if (e >= 0)
	nbefore = e % 3;
      else
	{
	  nbefore = (-e) % 3;
	  if (nbefore != 0)
	    nbefore = 3 - nbefore;
	}
      e -= nbefore;
      nbefore++;
      nzero = 0;
      nafter = d;
      expchar = 'E';
      break;

    case FMT_ES:
      if (!zero_flag)
        e--;
      nbefore = 1;
      nzero = 0;
      nafter = d;
      expchar = 'E';
      break;

    default:
      /* Should never happen.  */
      internal_error (&dtp->common, "Unexpected format token");
    }

  if (zero_flag)
    goto skip;

  /* Round the value.  The value being rounded is an unsigned magnitude.  */
  switch (dtp->u.p.current_unit->round_status)
    {
      /* For processor defined and unspecified rounding we use
	 snprintf to print the exact number of digits needed, and thus
	 let snprintf handle the rounding.  On system claiming support
	 for IEEE 754, this ought to be round to nearest, ties to
	 even, corresponding to the Fortran ROUND='NEAREST'.  */
      case ROUND_PROCDEFINED:
      case ROUND_UNSPECIFIED:
      case ROUND_ZERO: /* Do nothing and truncation occurs.  */
	goto skip;
      case ROUND_UP:
	if (sign_bit)
	  goto skip;
	goto updown;
      case ROUND_DOWN:
	if (!sign_bit)
	  goto skip;
	goto updown;
      case ROUND_NEAREST:
	/* Round compatible unless there is a tie. A tie is a 5 with
	   all trailing zero's.  */
	i = nafter + nbefore;
	if (digits[i] == '5')
	  {
	    for(i++ ; i < ndigits; i++)
	      {
		if (digits[i] != '0')
		  goto do_rnd;
	      }
	    /* It is a tie so round to even.  */
	    switch (digits[nafter + nbefore - 1])
	      {
		case '1':
		case '3':
		case '5':
		case '7':
		case '9':
		  /* If odd, round away from zero to even.  */
		  break;
		default:
		  /* If even, skip rounding, truncate to even.  */
		  goto skip;
	      }
	  }
	/* Fall through.  */
	/* The ROUND_COMPATIBLE is rounding away from zero when there is a tie.  */
      case ROUND_COMPATIBLE:
	rchar = '5';
	goto do_rnd;
    }

  updown:

  rchar = '0';
  /* Do not reset nbefore for FMT_F and FMT_EN.  */
  if (ft != FMT_F && ft !=FMT_EN && w > 0 && d == 0 && p == 0)
    nbefore = 1;
  /* Scan for trailing zeros to see if we really need to round it.  */
  for(i = nbefore + nafter; i < ndigits; i++)
    {
      if (digits[i] != '0')
	goto do_rnd;
    }
  goto skip;

  do_rnd:

  if (nbefore + nafter == 0)
    /* Handle the case Fw.0 and value < 1.0 */
    {
      ndigits = 0;
      if (digits[0] >= rchar)
	{
	  /* We rounded to zero but shouldn't have */
	  nbefore = 1;
	  digits--;
	  digits[0] = '1';
	  ndigits = 1;
	}
    }
  else if (nbefore + nafter < ndigits)
    {
      i = ndigits = nbefore + nafter;
      if (digits[i] >= rchar)
	{
	  /* Propagate the carry.  */
	  for (i--; i >= 0; i--)
	    {
	      if (digits[i] != '9')
		{
		  digits[i]++;
		  break;
		}
	      digits[i] = '0';
	    }

	  if (i < 0)
	    {
	      /* The carry overflowed.  Fortunately we have some spare
	         space at the start of the buffer.  We may discard some
	         digits, but this is ok because we already know they are
	         zero.  */
	      digits--;
	      digits[0] = '1';
	      if (ft == FMT_F)
		{
		  if (nzero > 0)
		    {
		      nzero--;
		      nafter++;
		    }
		  else
		    nbefore++;
		}
	      else if (ft == FMT_EN)
		{
		  nbefore++;
		  if (nbefore == 4)
		    {
		      nbefore = 1;
		      e += 3;
		    }
		}
	      else
		e++;
	    }
	}
    }

  skip:

  /* Calculate the format of the exponent field.  The number of exponent digits
     required is needed to determine padding of the float string before the
     expenent is written down. */
  edigits = 0; // Assume there is no exponent character set.
  if (expchar)
    {
      switch (ft)
      {
	case FMT_D:
	case FMT_E:
	case FMT_EN:
	case FMT_ES:
	  if (f->pushed == FMT_NONE)
	    {
	      if (f->u.real.e == 0 && e == 0)
		{
		  edigits = 3;
		  break;
		}
	      else if (f->u.real.e > 0)
		edigits = f->u.real.e + 2;
	    }
	/* Fall through.  */
	default:
	  if (!(dtp->u.p.g0_no_blanks && e == 0))
	    {
	      edigits = 1;
	      for (i = abs (e); i >= 10; i /= 10)
		edigits++;

	      if (f->u.real.e < 0)
		{
		  /* Width not specified.  Must be no more than 3 digits.  */
		  if (e > 999 || e < -999)
		    edigits = -1;
		  else
		    {
		      edigits = 4;
		      if (e > 99 || e < -99)
			expchar = ' ';
		    }
		}
	      else if (f->u.real.e == 0)
		{
		  /* Zero width specified, no leading zeros in exponent  */
		  if (e > 999 || e < -999)
		    edigits = 6;
		  else if (e > 99 || e < -99)
		    edigits = 5;
		  else if (e > 9 || e < -9)
		    edigits = 4;
		  else
		    edigits = 3;
		}
	      else
		{
		  /* Exponent width specified, check it is wide enough.  */
		  if (edigits > f->u.real.e)
		    edigits = -1;
		  else
		    edigits = f->u.real.e + 2;
		}
	    }
      }
  }
  /* Scan the digits string and count the number of zeros.  If we make it
     all the way through the loop, we know the value is zero after the
     rounding completed above.  */
  int hasdot = 0;
  for (i = 0; i < ndigits + hasdot; i++)
    {
      if (digits[i] == '.')
	hasdot = 1;
      else if (digits[i] != '0')
	break;
    }

  /* To format properly, we need to know if the rounded result is zero and if
     so, we set the zero_flag which may have been already set for
     actual zero.  */
  if (i == ndigits + hasdot)
    {
      zero_flag = true;
      /* The output is zero, so set the sign according to the sign bit unless
	 -fno-sign-zero was specified.  */
      if (compile_options.sign_zero == 1)
        sign = calculate_sign (dtp, sign_bit);
      else
	sign = calculate_sign (dtp, 0);
    }

  /* Pick a field size if none was specified, taking into account small
     values that may have been rounded to zero.  */
  if (w <= 0)
    {
      if (zero_flag)
	w = d + (sign != S_NONE ? 2 : 1) + (d == 0 ? 1 : 0);
      else
	{
	  w = nbefore + nzero + nafter + (sign != S_NONE ? 2 : 1);
	  w = w == 1 ? 2 : w;
	}
    }

  /* Work out how much padding is needed.  */
  nblanks = w - (nbefore + nzero + nafter + edigits + 1);
  if (sign != S_NONE)
    nblanks--;

  /* See if we have space for a zero before the decimal point.  */
  if (nbefore == 0 && nblanks > 0)
    {
      leadzero = 1;
      nblanks--;
    }
  else
    leadzero = 0;

  if (dtp->u.p.g0_no_blanks)
    {
      w -= nblanks;
      nblanks = 0;
    }

  /* Create the final float string.  */
  *len = w + npad;
  put = result;

  /* Check the value fits in the specified field width.  */
  if (nblanks < 0 || edigits == -1 || w == 1 || (w == 2 && sign != S_NONE))
    {
      star_fill (put, *len);
      return;
    }

  /* Pad to full field width.  */
  if ( ( nblanks > 0 ) && !dtp->u.p.no_leading_blank)
    {
      memset (put, ' ', nblanks);
      put += nblanks;
    }

  /* Set the initial sign (if any).  */
  if (sign == S_PLUS)
    *(put++) = '+';
  else if (sign == S_MINUS)
    *(put++) = '-';

  /* Set an optional leading zero.  */
  if (leadzero)
    *(put++) = '0';

  /* Set the part before the decimal point, padding with zeros.  */
  if (nbefore > 0)
    {
      if (nbefore > ndigits)
	{
	  i = ndigits;
	  memcpy (put, digits, i);
	  ndigits = 0;
	  while (i < nbefore)
	    put[i++] = '0';
	}
      else
	{
	  i = nbefore;
	  memcpy (put, digits, i);
	  ndigits -= i;
	}

      digits += i;
      put += nbefore;
    }

  /* Set the decimal point.  */
  *(put++) = dtp->u.p.current_unit->decimal_status == DECIMAL_POINT ? '.' : ',';
  if (ft == FMT_F
	  && (dtp->u.p.current_unit->round_status == ROUND_UNSPECIFIED
	      || dtp->u.p.current_unit->round_status == ROUND_PROCDEFINED))
    digits++;

  /* Set leading zeros after the decimal point.  */
  if (nzero > 0)
    {
      for (i = 0; i < nzero; i++)
	*(put++) = '0';
    }

  /* Set digits after the decimal point, padding with zeros.  */
  if (ndigits >= 0 && nafter > 0)
    {
      if (nafter > ndigits)
	i = ndigits;
      else
	i = nafter;

      if (i > 0)
	memcpy (put, digits, i);
      while (i < nafter)
	put[i++] = '0';

      digits += i;
      ndigits -= i;
      put += nafter;
    }

  /* Set the exponent.  */
  if (expchar)
    {
      switch (ft)
      {
	case FMT_D:
	case FMT_E:
	case FMT_EN:
	case FMT_ES:
	if (f->pushed == FMT_NONE)
	  {
	    if ((f->u.real.e == 0) && (e == 0))
	      {
		*(put++) = expchar;
		edigits--;
		snprintf (buffer, size, "%+0*d", edigits, e);
		memcpy (put, buffer, edigits);
		put += edigits;
		break;
	      }
	    if (f->u.real.e > 0)
	      {
		*(put++) = expchar;
		edigits--;
		snprintf (buffer, size, "%+0*d", edigits, e);
		memcpy (put, buffer, edigits);
		put += edigits;
		break;
	      }
	  }
	  /* Fall through.  */
	default:
	  if (!(dtp->u.p.g0_no_blanks && e == 0))
	    {
	      if (expchar != ' ')
		{
		  *(put++) = expchar;
		  edigits--;
		}
	      snprintf (buffer, size, "%+0*d", edigits, e);
	      memcpy (put, buffer, edigits);
	      put += edigits;
	    }
	}
    }

  if (dtp->u.p.no_leading_blank)
    {
      memset (put , ' ' , nblanks);
      dtp->u.p.no_leading_blank = 0;
      put += nblanks;
    }

  if (npad > 0 && !dtp->u.p.g0_no_blanks)
    {
      memset (put , ' ' , npad);
      put += npad;
    }

  /* NULL terminate the string.  */
  *put = '\0';

  return;
}


/* Write "Infinite" or "Nan" as appropriate for the given format.  */

static void
build_infnan_string (st_parameter_dt *dtp, const fnode *f, int isnan_flag,
		    int sign_bit, char *p, size_t *len)
{
  char fin;
  int nb = 0;
  sign_t sign;
  int mark;

  if (f->format != FMT_B && f->format != FMT_O && f->format != FMT_Z)
    {
      sign = calculate_sign (dtp, sign_bit);
      mark = (sign == S_PLUS || sign == S_MINUS) ? 8 : 7;

      nb =  f->u.real.w;
      *len = nb;

      /* If the field width is zero, the processor must select a width
	 not zero.  4 is chosen to allow output of '-Inf' or '+Inf' */

      if ((nb == 0) || dtp->u.p.g0_no_blanks)
	{
	  if (isnan_flag)
	    nb = 3;
	  else
	    nb = (sign == S_PLUS || sign == S_MINUS) ? 4 : 3;
	  *len = nb;
	}

      p[*len] = '\0';
      if (nb < 3)
	{
	  memset (p, '*', nb);
	  return;
	}

      memset(p, ' ', nb);

      if (!isnan_flag)
	{
	  if (sign_bit)
	    {
	      /* If the sign is negative and the width is 3, there is
		 insufficient room to output '-Inf', so output asterisks */
	      if (nb == 3)
		{
		  memset (p, '*', nb);
		  return;
		}
	      /* The negative sign is mandatory */
	      fin = '-';
	    }
	  else
	    /* The positive sign is optional, but we output it for
	       consistency */
	    fin = '+';

	  if (nb > mark)
	    /* We have room, so output 'Infinity' */
	    memcpy(p + nb - 8, "Infinity", 8);
	  else
	    /* For the case of width equals 8, there is not enough room
	       for the sign and 'Infinity' so we go with 'Inf' */
	    memcpy(p + nb - 3, "Inf", 3);

	  if (sign == S_PLUS || sign == S_MINUS)
	    {
	      if (nb < 9 && nb > 3)
		p[nb - 4] = fin;  /* Put the sign in front of Inf */
	      else if (nb > 8)
		p[nb - 9] = fin;  /* Put the sign in front of Infinity */
	    }
	}
      else
	memcpy(p + nb - 3, "NaN", 3);
    }
}


/* Returns the value of 10**d.  */

#define CALCULATE_EXP(x) \
static GFC_REAL_ ## x \
calculate_exp_ ## x  (int d)\
{\
  int i;\
  GFC_REAL_ ## x r = 1.0;\
  for (i = 0; i< (d >= 0 ? d : -d); i++)\
    r *= 10;\
  r = (d >= 0) ? r : 1.0 / r;\
  return r;\
}

CALCULATE_EXP(4)

CALCULATE_EXP(8)

#ifdef HAVE_GFC_REAL_10
CALCULATE_EXP(10)
#endif

#ifdef HAVE_GFC_REAL_16
CALCULATE_EXP(16)
#endif

#ifdef HAVE_GFC_REAL_17
CALCULATE_EXP(17)
#endif
#undef CALCULATE_EXP


/* Define macros to build code for format_float.  */

  /* Note: Before output_float is called, snprintf is used to print to buffer the
     number in the format +D.DDDDe+ddd.

     #   The result will always contain a decimal point, even if no
	 digits follow it

     -   The converted value is to be left adjusted on the field boundary

     +   A sign (+ or -) always be placed before a number

     *   prec is used as the precision

     e format: [-]d.dddeÂ±dd where there is one digit before the
       decimal-point character and the number of digits after it is
       equal to the precision. The exponent always contains at least two
       digits; if the value is zero, the exponent is 00.  */


#define TOKENPASTE(x, y) TOKENPASTE2(x, y)
#define TOKENPASTE2(x, y) x ## y

#define DTOA(suff,prec,val) TOKENPASTE(DTOA2,suff)(prec,val)

#define DTOA2(prec,val) \
snprintf (buffer, size, "%+-#.*e", (prec), (val))

#define DTOA2L(prec,val) \
snprintf (buffer, size, "%+-#.*Le", (prec), (val))

#if defined(GFC_REAL_16_USE_IEC_60559) || defined(GFC_REAL_17_USE_IEC_60559)
/* strfromf128 unfortunately doesn't allow +, - and # modifiers
   nor .* (only allows .number).  For +, work around it by adding
   leading + manually for !signbit values.  For - I don't see why
   we need it, when we don't specify field minimum width.
   For #, add . if it is missing.  Assume size is at least 2.  */
static int
gfor_strfromf128 (char *buffer, size_t size, int kind, int prec, _Float128 val)
{
  int ret, n = 0;
  char fmt[sizeof (int) * 3 + 5];
  snprintf (fmt, sizeof fmt, "%%.%d%c", prec, kind);
  if (!__builtin_signbit (val))
    {
      n = 1;
      buffer[0] = '+';
    }
  ret = strfromf128 (buffer + n, size - n, fmt, val) + n;
  if ((size_t) ret < size - 1)
    {
      size_t s = strcspn (buffer, ".e");
      if (buffer[s] != '.')
	{
	  if (buffer[s] == '\0')
	    buffer[s + 1] = '\0';
	  else
	    memmove (buffer + s + 1, buffer + s, ret + 1 - s);
	  buffer[s] = '.';
	  ++ret;
	}
    }
  return ret;
}
#endif

#if defined(HAVE_GFC_REAL_17)
# if defined(POWER_IEEE128)
#  define DTOA2Q(prec,val) \
__snprintfieee128 (buffer, size, "%+-#.*Le", (prec), (val))
# elif defined(GFC_REAL_17_USE_IEC_60559)
#  define DTOA2Q(prec,val) \
gfor_strfromf128 (buffer, size, 'e', (prec), (val))
# else
#  define DTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qe", (prec), (val))
# endif
#elif defined(GFC_REAL_16_IS_FLOAT128)
# if defined(GFC_REAL_16_USE_IEC_60559)
#  define DTOA2Q(prec,val) \
gfor_strfromf128 (buffer, size, 'e', (prec), (val))
# else
#  define DTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qe", (prec), (val))
# endif
#endif

#define FDTOA(suff,prec,val) TOKENPASTE(FDTOA2,suff)(prec,val)

/* For F format, we print to the buffer with f format.  */
#define FDTOA2(prec,val) \
snprintf (buffer, size, "%+-#.*f", (prec), (val))

#define FDTOA2L(prec,val) \
snprintf (buffer, size, "%+-#.*Lf", (prec), (val))


#if defined(HAVE_GFC_REAL_17)
# if defined(POWER_IEEE128)
#  define FDTOA2Q(prec,val) \
__snprintfieee128 (buffer, size, "%+-#.*Lf", (prec), (val))
# elif defined(GFC_REAL_17_USE_IEC_60559)
#  define FDTOA2Q(prec,val) \
gfor_strfromf128 (buffer, size, 'f', (prec), (val))
# else
# define FDTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qf", (prec), (val))
# endif
#elif defined(GFC_REAL_16_IS_FLOAT128)
# if defined(GFC_REAL_16_USE_IEC_60559)
#  define FDTOA2Q(prec,val) \
gfor_strfromf128 (buffer, size, 'f', (prec), (val))
# else
#  define FDTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qf", (prec), (val))
# endif
#endif


/* EN format is tricky since the number of significant digits depends
   on the magnitude.  Solve it by first printing a temporary value and
   figure out the number of significant digits from the printed
   exponent.  Values y, 0.95*10.0**e <= y <10.0**e, are rounded to
   10.0**e even when the final result will not be rounded to 10.0**e.
   For these values the exponent returned by atoi has to be decremented
   by one. The values y in the ranges
       (1000.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*(n+1))
        (100.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+2)
         (10.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+1)
   are correctly rounded respectively to 1.0...0*10.0*(3*(n+1)),
   100.0...0*10.0*(3*n), and 10.0...0*10.0*(3*n), where 0...0
   represents d zeroes, by the lines 279 to 297. */
#define EN_PREC(x,y)\
{\
    volatile GFC_REAL_ ## x tmp, one = 1.0;\
    tmp = * (GFC_REAL_ ## x *)source;\
    if (isfinite (tmp))\
      {\
	nprinted = DTOA(y,0,tmp);\
	int e = atoi (&buffer[4]);\
	if (buffer[1] == '1')\
	  {\
	    tmp = (calculate_exp_ ## x (-e)) * tmp;\
	    tmp = one - (tmp < 0 ? -tmp : tmp);\
	    if (tmp > 0)\
	      e = e - 1;\
	  }\
	nbefore = e%3;\
	if (nbefore < 0)\
	  nbefore = 3 + nbefore;\
      }\
    else\
      nprinted = -1;\
}\

static int
determine_en_precision (st_parameter_dt *dtp, const fnode *f,
			const char *source, int len)
{
  int nprinted;
  char buffer[10];
  const size_t size = 10;
  int nbefore; /* digits before decimal point - 1.  */

  switch (len)
    {
    case 4:
      EN_PREC(4,)
      break;

    case 8:
      EN_PREC(8,)
      break;

#ifdef HAVE_GFC_REAL_10
    case 10:
      EN_PREC(10,L)
      break;
#endif
#ifdef HAVE_GFC_REAL_16
    case 16:
# ifdef GFC_REAL_16_IS_FLOAT128
      EN_PREC(16,Q)
# else
      EN_PREC(16,L)
# endif
      break;
#endif
#ifdef HAVE_GFC_REAL_17
    case 17:
      EN_PREC(17,Q)
#endif
      break;
    default:
      internal_error (NULL, "bad real kind");
    }

  if (nprinted == -1)
    return -1;

  int prec = f->u.real.d + nbefore;
  if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED
      && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED)
    prec += 2 * len + 4;
  return prec;
}


/* Generate corresponding I/O format. and output.
   The rules to translate FMT_G to FMT_E or FMT_F from DEC fortran
   LRM (table 11-2, Chapter 11, "I/O Formatting", P11-25) is:

   Data Magnitude                              Equivalent Conversion
   0< m < 0.1-0.5*10**(-d-1)                   Ew.d[Ee]
   m = 0                                       F(w-n).(d-1), n' '
   0.1-0.5*10**(-d-1)<= m < 1-0.5*10**(-d)     F(w-n).d, n' '
   1-0.5*10**(-d)<= m < 10-0.5*10**(-d+1)      F(w-n).(d-1), n' '
   10-0.5*10**(-d+1)<= m < 100-0.5*10**(-d+2)  F(w-n).(d-2), n' '
   ................                           ..........
   10**(d-1)-0.5*10**(-1)<= m <10**d-0.5       F(w-n).0,n(' ')
   m >= 10**d-0.5                              Ew.d[Ee]

   notes: for Gw.d ,  n' ' means 4 blanks
	  for Gw.dEe, n' ' means e+2 blanks
	  for rounding modes adjustment, r, See Fortran F2008 10.7.5.2.2
	  the asm volatile is required for 32-bit x86 platforms.  */
#define FORMAT_FLOAT(x,y)\
{\
  int npad = 0;\
  GFC_REAL_ ## x m;\
  m = * (GFC_REAL_ ## x *)source;\
  sign_bit = signbit (m);\
  if (!isfinite (m))\
    { \
      build_infnan_string (dtp, f, isnan (m), sign_bit, result, res_len);\
      return;\
    }\
  m = sign_bit ? -m : m;\
  zero_flag = (m == 0.0);\
  fnode newf;\
  int e = f->u.real.e;\
  int d = f->u.real.d;\
  int w = f->u.real.w;\
  if (f->format == FMT_G)\
    {\
      GFC_REAL_ ## x exp_d, r = 0.5, r_sc;\
      int low, high, mid;\
      int ubound, lbound;\
      int save_scale_factor;\
      volatile GFC_REAL_ ## x temp;\
      save_scale_factor = dtp->u.p.scale_factor;\
      if (w == DEFAULT_WIDTH)\
	{\
	  w = default_width;\
	  d = precision;\
	}\
      /* The switch between FMT_E and FMT_F is based on the absolute value.  \
         Set r=0 for rounding toward zero and r = 1 otherwise.  \
	 If (exp_d - m) == 1 there is no rounding needed.  */\
      switch (dtp->u.p.current_unit->round_status)\
	{\
	  case ROUND_ZERO:\
	    r = 0.0;\
	    break;\
	  case ROUND_UP:\
	    r = sign_bit ? 0.0 : 1.0;\
	    break;\
	  case ROUND_DOWN:\
	    r = sign_bit ? 1.0 : 0.0;\
	    break;\
	  default:\
	    break;\
	}\
      exp_d = calculate_exp_ ## x (d);\
      r_sc = (1 - r / exp_d);\
      temp = 0.1 * r_sc;\
      if ((m > 0.0 && ((m < temp) || (r < 1 && r >= (exp_d - m))\
				  || (r == 1 && 1 > (exp_d - m))))\
	  || ((m == 0.0) && !(compile_options.allow_std\
			      & (GFC_STD_F2003 | GFC_STD_F2008)))\
	  ||  d == 0)\
	{ \
	  newf.format = FMT_E;\
	  newf.u.real.w = w;\
	  newf.u.real.d = d - comp_d;\
	  newf.u.real.e = e;\
	  npad = 0;\
	  precision = determine_precision (dtp, &newf, x);\
	  nprinted = DTOA(y,precision,m);\
	}\
      else \
	{\
	  mid = 0;\
	  low = 0;\
	  high = d + 1;\
	  lbound = 0;\
	  ubound = d + 1;\
	  while (low <= high)\
	    {\
	      mid = (low + high) / 2;\
	      temp = (calculate_exp_ ## x (mid - 1) * r_sc);\
	      if (m < temp)\
		{ \
		  ubound = mid;\
		  if (ubound == lbound + 1)\
		    break;\
		  high = mid - 1;\
		}\
	      else if (m > temp)\
		{ \
		  lbound = mid;\
		  if (ubound == lbound + 1)\
		    { \
		      mid ++;\
		      break;\
		    }\
		  low = mid + 1;\
		}\
	      else\
		{\
		  mid++;\
		  break;\
		}\
	    }\
	  npad = e <= 0 ? 4 : e + 2;\
	  npad = npad >= w ? w - 1 : npad;\
	  npad = dtp->u.p.g0_no_blanks ? 0 : npad;\
	  newf.format = FMT_F;\
	  newf.u.real.w = w - npad;\
	  newf.u.real.d = m == 0.0 ? d - 1 : -(mid - d - 1) ;\
	  dtp->u.p.scale_factor = 0;\
	  precision = determine_precision (dtp, &newf, x);\
	  nprinted = FDTOA(y,precision,m);\
	}\
      newf.pushed = FMT_G;\
      build_float_string (dtp, &newf, buffer, size, nprinted, precision,\
				   sign_bit, zero_flag, npad, default_width,\
				   result, res_len);\
      dtp->u.p.scale_factor = save_scale_factor;\
    }\
  else\
    {\
      newf.format = f->format;\
      newf.u.real.w = w;\
      newf.u.real.d = d;\
      newf.u.real.e = e;\
      newf.pushed = FMT_NONE;\
      if (f->format == FMT_F)\
	nprinted = FDTOA(y,precision,m);\
      else\
	nprinted = DTOA(y,precision,m);\
      build_float_string (dtp, &newf, buffer, size, nprinted, precision,\
				   sign_bit, zero_flag, npad, default_width,\
				   result, res_len);\
    }\
}\

/* Output a real number according to its format.  */


static void
get_float_string (st_parameter_dt *dtp, const fnode *f, const char *source,
		  int kind, int comp_d, char *buffer, int precision,
		  size_t size, char *result, size_t *res_len)
{
  int sign_bit, nprinted;
  bool zero_flag;
  int default_width = 0;

  if (f->u.real.w == DEFAULT_WIDTH)
    /* This codepath can only be reached with -fdec-format-defaults. The default
     * values are based on those used in the Oracle Fortran compiler.
     */
    {
      default_width = default_width_for_float (kind);
      precision = default_precision_for_float (kind);
    }

  switch (kind)
    {
    case 4:
      FORMAT_FLOAT(4,)
      break;

    case 8:
      FORMAT_FLOAT(8,)
      break;

#ifdef HAVE_GFC_REAL_10
    case 10:
      FORMAT_FLOAT(10,L)
      break;
#endif
#ifdef HAVE_GFC_REAL_16
    case 16:
# ifdef GFC_REAL_16_IS_FLOAT128
      FORMAT_FLOAT(16,Q)
# else
      FORMAT_FLOAT(16,L)
# endif
      break;
#endif
#ifdef HAVE_GFC_REAL_17
    case 17:
      FORMAT_FLOAT(17,Q)
      break;
#endif
    default:
      internal_error (NULL, "bad real kind");
    }
  return;
}
