/* Copyright (C) 2007-2022 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.  */
  if (expchar && !(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;
	}
    }
  else
    edigits = 0;

  /* 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 && !(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(HAVE_GFC_REAL_17)
# if defined(POWER_IEEE128)
#  define DTOA2Q(prec,val) \
__snprintfieee128 (buffer, size, "%+-#.*Le", (prec), (val))
# else
#  define DTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qe", (prec), (val))
# endif
#elif defined(GFC_REAL_16_IS_FLOAT128)
# define DTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qe", (prec), (val))
#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))
# else
# define FDTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qf", (prec), (val))
# endif
#elif defined(GFC_REAL_16_IS_FLOAT128)
# define FDTOA2Q(prec,val) \
quadmath_snprintf (buffer, size, "%+-#.*Qf", (prec), (val))
#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);\
  if (f->format == FMT_G)\
    {\
      int e = f->u.real.e;\
      int d = f->u.real.d;\
      int w = f->u.real.w;\
      fnode newf;\
      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);\
	}\
      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\
    {\
      if (f->format == FMT_F)\
	nprinted = FDTOA(y,precision,m);\
      else\
	nprinted = DTOA(y,precision,m);\
      build_float_string (dtp, f, 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;
}
