/* Common code for fixed-size types in the decNumber C Library.
   Copyright (C) 2007-2024 Free Software Foundation, Inc.
   Contributed by IBM Corporation.  Author Mike Cowlishaw.

   This file is part of GCC.

   GCC 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.

   GCC 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/>.  */

/* ------------------------------------------------------------------ */
/* decCommon.c -- common code for all three fixed-size types	      */
/* ------------------------------------------------------------------ */
/* This module comprises code that is shared between all the formats  */
/* (decSingle, decDouble, and decQuad); it includes set and extract   */
/* of format components, widening, narrowing, and string conversions. */
/*								      */
/* Unlike decNumber, parameterization takes place at compile time     */
/* rather than at runtime.  The parameters are set in the decDouble.c */
/* (etc.) files, which then include this one to produce the compiled  */
/* code.  The functions here, therefore, are code shared between      */
/* multiple formats.						      */
/* ------------------------------------------------------------------ */
/* Names here refer to decFloat rather than to decDouble, etc., and */
/* the functions are in strict alphabetical order. */
/* Constants, tables, and debug function(s) are included only for QUAD */
/* (which will always be compiled if DOUBLE or SINGLE are used). */
/* */
/* Whenever a decContext is used, only the status may be set (using */
/* OR) or the rounding mode read; all other fields are ignored and */
/* untouched. */

#include "decCommonSymbols.h"

/* names for simpler testing and default context */
#if DECPMAX==7
  #define SINGLE     1
  #define DOUBLE     0
  #define QUAD	     0
  #define DEFCONTEXT DEC_INIT_DECIMAL32
#elif DECPMAX==16
  #define SINGLE     0
  #define DOUBLE     1
  #define QUAD	     0
  #define DEFCONTEXT DEC_INIT_DECIMAL64
#elif DECPMAX==34
  #define SINGLE     0
  #define DOUBLE     0
  #define QUAD	     1
  #define DEFCONTEXT DEC_INIT_DECIMAL128
#else
  #error Unexpected DECPMAX value
#endif

/* Assertions */

#if DECPMAX!=7 && DECPMAX!=16 && DECPMAX!=34
  #error Unexpected Pmax (DECPMAX) value for this module
#endif

/* Assert facts about digit characters, etc. */
#if ('9'&0x0f)!=9
  #error This module assumes characters are of the form 0b....nnnn
  /* where .... are don't care 4 bits and nnnn is 0000 through 1001 */
#endif
#if ('9'&0xf0)==('.'&0xf0)
  #error This module assumes '.' has a different mask than a digit
#endif

/* Assert ToString lay-out conditions */
#if DECSTRING<DECPMAX+9
  #error ToString needs at least 8 characters for lead-in and dot
#endif
#if DECPMAX+DECEMAXD+5 > DECSTRING
  #error Exponent form can be too long for ToString to lay out safely
#endif
#if DECEMAXD > 4
  #error Exponent form is too long for ToString to lay out
  /* Note: code for up to 9 digits exists in archives [decOct] */
#endif

/* Private functions used here and possibly in decBasic.c, etc. */
static decFloat * decFinalize(decFloat *, bcdnum *, decContext *);
static Flag decBiStr(const char *, const char *, const char *);

/* Macros and private tables; those which are not format-dependent    */
/* are only included if decQuad is being built. 		      */

/* ------------------------------------------------------------------ */
/* Combination field lookup tables (uInts to save measurable work)    */
/*								      */
/*   DECCOMBEXP  - 2 most-significant-bits of exponent (00, 01, or    */
/*		   10), shifted left for format, or DECFLOAT_Inf/NaN  */
/*   DECCOMBWEXP - The same, for the next-wider format (unless QUAD)  */
/*   DECCOMBMSD  - 4-bit most-significant-digit 		      */
/*		   [0 if the index is a special (Infinity or NaN)]    */
/*   DECCOMBFROM - 5-bit combination field from EXP top bits and MSD  */
/*		   (placed in uInt so no shift is needed)	      */
/*								      */
/* DECCOMBEXP, DECCOMBWEXP, and DECCOMBMSD are indexed by the sign    */
/*   and 5-bit combination field (0-63, the second half of the table  */
/*   identical to the first half)				      */
/* DECCOMBFROM is indexed by expTopTwoBits*16 + msd		      */
/*								      */
/* DECCOMBMSD and DECCOMBFROM are not format-dependent and so are     */
/* only included once, when QUAD is being built 		      */
/* ------------------------------------------------------------------ */
static const uInt DECCOMBEXP[64]={
  0, 0, 0, 0, 0, 0, 0, 0,
  1<<DECECONL, 1<<DECECONL, 1<<DECECONL, 1<<DECECONL,
  1<<DECECONL, 1<<DECECONL, 1<<DECECONL, 1<<DECECONL,
  2<<DECECONL, 2<<DECECONL, 2<<DECECONL, 2<<DECECONL,
  2<<DECECONL, 2<<DECECONL, 2<<DECECONL, 2<<DECECONL,
  0,	       0,	    1<<DECECONL, 1<<DECECONL,
  2<<DECECONL, 2<<DECECONL, DECFLOAT_Inf, DECFLOAT_NaN,
  0, 0, 0, 0, 0, 0, 0, 0,
  1<<DECECONL, 1<<DECECONL, 1<<DECECONL, 1<<DECECONL,
  1<<DECECONL, 1<<DECECONL, 1<<DECECONL, 1<<DECECONL,
  2<<DECECONL, 2<<DECECONL, 2<<DECECONL, 2<<DECECONL,
  2<<DECECONL, 2<<DECECONL, 2<<DECECONL, 2<<DECECONL,
  0,	       0,	    1<<DECECONL, 1<<DECECONL,
  2<<DECECONL, 2<<DECECONL, DECFLOAT_Inf, DECFLOAT_NaN};
#if !QUAD
static const uInt DECCOMBWEXP[64]={
  0, 0, 0, 0, 0, 0, 0, 0,
  1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL,
  1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL,
  0,		0,	      1<<DECWECONL, 1<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, DECFLOAT_Inf, DECFLOAT_NaN,
  0, 0, 0, 0, 0, 0, 0, 0,
  1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL,
  1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL, 1<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL, 2<<DECWECONL,
  0,		0,	      1<<DECWECONL, 1<<DECWECONL,
  2<<DECWECONL, 2<<DECWECONL, DECFLOAT_Inf, DECFLOAT_NaN};
#endif

#if QUAD
const uInt DECCOMBMSD[64]={
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, 0, 0,
  0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 9, 8, 9, 0, 0};

const uInt DECCOMBFROM[48]={
  0x00000000, 0x04000000, 0x08000000, 0x0C000000, 0x10000000, 0x14000000,
  0x18000000, 0x1C000000, 0x60000000, 0x64000000, 0x00000000, 0x00000000,
  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x24000000,
  0x28000000, 0x2C000000, 0x30000000, 0x34000000, 0x38000000, 0x3C000000,
  0x68000000, 0x6C000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  0x00000000, 0x00000000, 0x40000000, 0x44000000, 0x48000000, 0x4C000000,
  0x50000000, 0x54000000, 0x58000000, 0x5C000000, 0x70000000, 0x74000000,
  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000};

/* ------------------------------------------------------------------ */
/* Request and include the tables to use for conversions	      */
/* ------------------------------------------------------------------ */
#define DEC_BCD2DPD  1	      /* 0-0x999 -> DPD */
#define DEC_BIN2DPD  1	      /* 0-999 -> DPD */
#define DEC_BIN2BCD8 1	      /* 0-999 -> ddd, len */
#define DEC_DPD2BCD8 1	      /* DPD -> ddd, len */
#define DEC_DPD2BIN  1	      /* DPD -> 0-999 */
#define DEC_DPD2BINK 1	      /* DPD -> 0-999000 */
#define DEC_DPD2BINM 1	      /* DPD -> 0-999000000 */
#include "decDPD.h"	      /* source of the lookup tables */

#endif

/* ----------------------------------------------------------------- */
/* decBiStr -- compare string with pairwise options		     */
/*								     */
/*   targ is the string to compare				     */
/*   str1 is one of the strings to compare against (length may be 0) */
/*   str2 is the other; it must be the same length as str1	     */
/*								     */
/*   returns 1 if strings compare equal, (that is, targ is the same  */
/*   length as str1 and str2, and each character of targ is in one   */
/*   of str1 or str2 in the corresponding position), or 0 otherwise  */
/*								     */
/* This is used for generic caseless compare, including the awkward  */
/* case of the Turkish dotted and dotless Is.  Use as (for example): */
/*   if (decBiStr(test, "mike", "MIKE")) ...			     */
/* ----------------------------------------------------------------- */
static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
  for (;;targ++, str1++, str2++) {
    if (*targ!=*str1 && *targ!=*str2) return 0;
    /* *targ has a match in one (or both, if terminator) */
    if (*targ=='\0') break;
    } /* forever */
  return 1;
  } /* decBiStr */

/* ------------------------------------------------------------------ */
/* decFinalize -- adjust and store a final result		      */
/*								      */
/*  df	is the decFloat format number which gets the final result     */
/*  num is the descriptor of the number to be checked and encoded     */
/*	   [its values, including the coefficient, may be modified]   */
/*  set is the context to use					      */
/*  returns df							      */
/*								      */
/* The num descriptor may point to a bcd8 string of any length; this  */
/* string may have leading insignificant zeros.  If it has more than  */
/* DECPMAX digits then the final digit can be a round-for-reround     */
/* digit (i.e., it may include a sticky bit residue).		      */
/*								      */
/* The exponent (q) may be one of the codes for a special value and   */
/* can be up to 999999999 for conversion from string.		      */
/*								      */
/* No error is possible, but Inexact, Underflow, and/or Overflow may  */
/* be set.							      */
/* ------------------------------------------------------------------ */
/* Constant whose size varies with format; also the check for surprises */
static uByte allnines[DECPMAX]=
#if SINGLE
  {9, 9, 9, 9, 9, 9, 9};
#elif DOUBLE
  {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
#elif QUAD
  {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
#endif

static decFloat * decFinalize(decFloat *df, bcdnum *num,
			      decContext *set) {
  uByte *ub;		      /* work */
  uInt	 dpd;		      /* .. */
  uInt	 uiwork;	      /* for macros */
  uByte *umsd=num->msd;       /* local copy */
  uByte *ulsd=num->lsd;       /* .. */
  uInt	 encode;	      /* encoding accumulator */
  Int	 length;	      /* coefficient length */

  #if DECCHECK
  Int clen=ulsd-umsd+1;
  #if QUAD
    #define COEXTRA 2			     /* extra-long coefficent */
  #else
    #define COEXTRA 0
  #endif
  if (clen<1 || clen>DECPMAX*3+2+COEXTRA)
    printf("decFinalize: suspect coefficient [length=%ld]\n", (LI)clen);
  if (num->sign!=0 && num->sign!=DECFLOAT_Sign)
    printf("decFinalize: bad sign [%08lx]\n", (LI)num->sign);
  if (!EXPISSPECIAL(num->exponent)
      && (num->exponent>1999999999 || num->exponent<-1999999999))
    printf("decFinalize: improbable exponent [%ld]\n", (LI)num->exponent);
  /* decShowNum(num, "final"); */
  #endif

  /* A special will have an 'exponent' which is very positive and a */
  /* coefficient < DECPMAX */
  length=(uInt)(ulsd-umsd+1);		     /* coefficient length */

  if (!NUMISSPECIAL(num)) {
    Int   drop; 			     /* digits to be dropped */
    /* skip leading insignificant zeros to calculate an exact length */
    /* [this is quite expensive] */
    if (*umsd==0) {
      for (; umsd+3<ulsd && UBTOUI(umsd)==0;) umsd+=4;
      for (; *umsd==0 && umsd<ulsd;) umsd++;
      length=ulsd-umsd+1;		     /* recalculate */
      }
    drop=MAXI(length-DECPMAX, DECQTINY-num->exponent);
    /* drop can now be > digits for bottom-clamp (subnormal) cases */
    if (drop>0) {			     /* rounding needed */
      /* (decFloatQuantize has very similar code to this, so any */
      /* changes may need to be made there, too) */
      uByte *roundat;			     /* -> re-round digit */
      uByte reround;			     /* reround value */
      /* printf("Rounding; drop=%ld\n", (LI)drop); */

      num->exponent+=drop;		     /* always update exponent */

      /* Three cases here: */
      /*   1. new LSD is in coefficient (almost always) */
      /*   2. new LSD is digit to left of coefficient (so MSD is */
      /*      round-for-reround digit) */
      /*   3. new LSD is to left of case 2 (whole coefficient is sticky) */
      /* [duplicate check-stickies code to save a test] */
      /* [by-digit check for stickies as runs of zeros are rare] */
      if (drop<length) {		     /* NB lengths not addresses */
	roundat=umsd+length-drop;
	reround=*roundat;
	for (ub=roundat+1; ub<=ulsd; ub++) {
	  if (*ub!=0) { 		     /* non-zero to be discarded */
	    reround=DECSTICKYTAB[reround];   /* apply sticky bit */
	    break;			     /* [remainder don't-care] */
	    }
	  } /* check stickies */
	ulsd=roundat-1; 		     /* new LSD */
	}
       else {				     /* edge case */
	if (drop==length) {
	  roundat=umsd;
	  reround=*roundat;
	  }
	 else {
	  roundat=umsd-1;
	  reround=0;
	  }
	for (ub=roundat+1; ub<=ulsd; ub++) {
	  if (*ub!=0) { 		     /* non-zero to be discarded */
	    reround=DECSTICKYTAB[reround];   /* apply sticky bit */
	    break;			     /* [remainder don't-care] */
	    }
	  } /* check stickies */
	*umsd=0;			     /* coefficient is a 0 */
	ulsd=umsd;			     /* .. */
	}

      if (reround!=0) { 		     /* discarding non-zero */
	uInt bump=0;
	set->status|=DEC_Inexact;
	/* if adjusted exponent [exp+digits-1] is < EMIN then num is */
	/* subnormal -- so raise Underflow */
	if (num->exponent<DECEMIN && (num->exponent+(ulsd-umsd+1)-1)<DECEMIN)
	  set->status|=DEC_Underflow;

	/* next decide whether increment of the coefficient is needed */
	if (set->round==DEC_ROUND_HALF_EVEN) {	  /* fastpath slowest case */
	  if (reround>5) bump=1;		  /* >0.5 goes up */
	   else if (reround==5) 		  /* exactly 0.5000 .. */
	    bump=*ulsd & 0x01;			  /* .. up iff [new] lsd is odd */
	  } /* r-h-e */
	 else switch (set->round) {
	  case DEC_ROUND_DOWN: {
	    /* no change */
	    break;} /* r-d */
	  case DEC_ROUND_HALF_DOWN: {
	    if (reround>5) bump=1;
	    break;} /* r-h-d */
	  case DEC_ROUND_HALF_UP: {
	    if (reround>=5) bump=1;
	    break;} /* r-h-u */
	  case DEC_ROUND_UP: {
	    if (reround>0) bump=1;
	    break;} /* r-u */
	  case DEC_ROUND_CEILING: {
	    /* same as _UP for positive numbers, and as _DOWN for negatives */
	    if (!num->sign && reround>0) bump=1;
	    break;} /* r-c */
	  case DEC_ROUND_FLOOR: {
	    /* same as _UP for negative numbers, and as _DOWN for positive */
	    /* [negative reround cannot occur on 0] */
	    if (num->sign && reround>0) bump=1;
	    break;} /* r-f */
	  case DEC_ROUND_05UP: {
	    if (reround>0) { /* anything out there is 'sticky' */
	      /* bump iff lsd=0 or 5; this cannot carry so it could be */
	      /* effected immediately with no bump -- but the code */
	      /* is clearer if this is done the same way as the others */
	      if (*ulsd==0 || *ulsd==5) bump=1;
	      }
	    break;} /* r-r */
	  default: {	  /* e.g., DEC_ROUND_MAX */
	    set->status|=DEC_Invalid_context;
	    #if DECCHECK
	    printf("Unknown rounding mode: %ld\n", (LI)set->round);
	    #endif
	    break;}
	  } /* switch (not r-h-e) */
	/* printf("ReRound: %ld  bump: %ld\n", (LI)reround, (LI)bump); */

	if (bump!=0) {			     /* need increment */
	  /* increment the coefficient; this might end up with 1000... */
	  /* (after the all nines case) */
	  ub=ulsd;
	  for(; ub-3>=umsd && UBTOUI(ub-3)==0x09090909; ub-=4)	{
	    UBFROMUI(ub-3, 0);		     /* to 00000000 */
	    }
	  /* [note ub could now be to left of msd, and it is not safe */
	  /* to write to the left of the msd] */
	  /* now at most 3 digits left to non-9 (usually just the one) */
	  for (; ub>=umsd; *ub=0, ub--) {
	    if (*ub==9) continue;	     /* carry */
	    *ub+=1;
	    break;
	    }
	  if (ub<umsd) {		     /* had all-nines */
	    *umsd=1;			     /* coefficient to 1000... */
	    /* usually the 1000... coefficient can be used as-is */
	    if ((ulsd-umsd+1)==DECPMAX) {
	      num->exponent++;
	      }
	     else {
	      /* if coefficient is shorter than Pmax then num is */
	      /* subnormal, so extend it; this is safe as drop>0 */
	      /* (or, if the coefficient was supplied above, it could */
	      /* not be 9); this may make the result normal. */
	      ulsd++;
	      *ulsd=0;
	      /* [exponent unchanged] */
	      #if DECCHECK
	      if (num->exponent!=DECQTINY) /* sanity check */
		printf("decFinalize: bad all-nines extend [^%ld, %ld]\n",
		       (LI)num->exponent, (LI)(ulsd-umsd+1));
	      #endif
	      } /* subnormal extend */
	    } /* had all-nines */
	  } /* bump needed */
	} /* inexact rounding */

      length=ulsd-umsd+1;		/* recalculate (may be <DECPMAX) */
      } /* need round (drop>0) */

    /* The coefficient will now fit and has final length unless overflow */
    /* decShowNum(num, "rounded"); */

    /* if exponent is >=emax may have to clamp, overflow, or fold-down */
    if (num->exponent>DECEMAX-(DECPMAX-1)) { /* is edge case */
      /* printf("overflow checks...\n"); */
      if (*ulsd==0 && ulsd==umsd) {	/* have zero */
	num->exponent=DECEMAX-(DECPMAX-1); /* clamp to max */
	}
       else if ((num->exponent+length-1)>DECEMAX) { /* > Nmax */
	/* Overflow -- these could go straight to encoding, here, but */
	/* instead num is adjusted to keep the code cleaner */
	Flag needmax=0; 		/* 1 for finite result */
	set->status|=(DEC_Overflow | DEC_Inexact);
	switch (set->round) {
	  case DEC_ROUND_DOWN: {
	    needmax=1;			/* never Infinity */
	    break;} /* r-d */
	  case DEC_ROUND_05UP: {
	    needmax=1;			/* never Infinity */
	    break;} /* r-05 */
	  case DEC_ROUND_CEILING: {
	    if (num->sign) needmax=1;	/* Infinity iff non-negative */
	    break;} /* r-c */
	  case DEC_ROUND_FLOOR: {
	    if (!num->sign) needmax=1;	/* Infinity iff negative */
	    break;} /* r-f */
	  default: break;		/* Infinity in all other cases */
	  }
	if (!needmax) { 		/* easy .. set Infinity */
	  num->exponent=DECFLOAT_Inf;
	  *umsd=0;			/* be clean: coefficient to 0 */
	  ulsd=umsd;			/* .. */
	  }
	 else { 			/* return Nmax */
	  umsd=allnines;		/* use constant array */
	  ulsd=allnines+DECPMAX-1;
	  num->exponent=DECEMAX-(DECPMAX-1);
	  }
	}
       else { /* no overflow but non-zero and may have to fold-down */
	Int shift=num->exponent-(DECEMAX-(DECPMAX-1));
	if (shift>0) {			/* fold-down needed */
	  /* fold down needed; must copy to buffer in order to pad */
	  /* with zeros safely; fortunately this is not the worst case */
	  /* path because cannot have had a round */
	  uByte buffer[ROUNDUP(DECPMAX+3, 4)]; /* [+3 allows uInt padding] */
	  uByte *s=umsd;		/* source */
	  uByte *t=buffer;		/* safe target */
	  uByte *tlsd=buffer+(ulsd-umsd)+shift; /* target LSD */
	  /* printf("folddown shift=%ld\n", (LI)shift); */
	  for (; s<=ulsd; s+=4, t+=4) UBFROMUI(t, UBTOUI(s));
	  for (t=tlsd-shift+1; t<=tlsd; t+=4) UBFROMUI(t, 0);  /* pad 0s */
	  num->exponent-=shift;
	  umsd=buffer;
	  ulsd=tlsd;
	  }
	} /* fold-down? */
      length=ulsd-umsd+1;		/* recalculate length */
      } /* high-end edge case */
    } /* finite number */

  /*------------------------------------------------------------------*/
  /* At this point the result will properly fit the decFloat	      */
  /* encoding, and it can be encoded with no possibility of error     */
  /*------------------------------------------------------------------*/
  /* Following code does not alter coefficient (could be allnines array) */

  /* fast path possible when DECPMAX digits */
  if (length==DECPMAX) {
    return decFloatFromBCD(df, num->exponent, umsd, num->sign);
    } /* full-length */

  /* slower path when not a full-length number; must care about length */
  /* [coefficient length here will be < DECPMAX] */
  if (!NUMISSPECIAL(num)) {		/* is still finite */
    /* encode the combination field and exponent continuation */
    uInt uexp=(uInt)(num->exponent+DECBIAS); /* biased exponent */
    uInt code=(uexp>>DECECONL)<<4;	/* top two bits of exp */
    /* [msd==0] */
    /* look up the combination field and make high word */
    encode=DECCOMBFROM[code];		/* indexed by (0-2)*16+msd */
    encode|=(uexp<<(32-6-DECECONL)) & 0x03ffffff; /* exponent continuation */
    }
   else encode=num->exponent;		/* special [already in word] */
  encode|=num->sign;			/* add sign */

  /* private macro to extract a declet, n (where 0<=n<DECLETS and 0 */
  /* refers to the declet from the least significant three digits) */
  /* and put the corresponding DPD code into dpd.  Access to umsd and */
  /* ulsd (pointers to the most and least significant digit of the */
  /* variable-length coefficient) is assumed, along with use of a */
  /* working pointer, uInt *ub. */
  /* As not full-length then chances are there are many leading zeros */
  /* [and there may be a partial triad] */
  #define getDPDt(dpd, n) ub=ulsd-(3*(n))-2;			      \
    if (ub<umsd-2) dpd=0;					      \
     else if (ub>=umsd) dpd=BCD2DPD[(*ub*256)+(*(ub+1)*16)+*(ub+2)];  \
     else {dpd=*(ub+2); if (ub+1==umsd) dpd+=*(ub+1)*16; dpd=BCD2DPD[dpd];}

  /* place the declets in the encoding words and copy to result (df), */
  /* according to endianness; in all cases complete the sign word */
  /* first */
  #if DECPMAX==7
    getDPDt(dpd, 1);
    encode|=dpd<<10;
    getDPDt(dpd, 0);
    encode|=dpd;
    DFWORD(df, 0)=encode;     /* just the one word */

  #elif DECPMAX==16
    getDPDt(dpd, 4); encode|=dpd<<8;
    getDPDt(dpd, 3); encode|=dpd>>2;
    DFWORD(df, 0)=encode;
    encode=dpd<<30;
    getDPDt(dpd, 2); encode|=dpd<<20;
    getDPDt(dpd, 1); encode|=dpd<<10;
    getDPDt(dpd, 0); encode|=dpd;
    DFWORD(df, 1)=encode;

  #elif DECPMAX==34
    getDPDt(dpd,10); encode|=dpd<<4;
    getDPDt(dpd, 9); encode|=dpd>>6;
    DFWORD(df, 0)=encode;

    encode=dpd<<26;
    getDPDt(dpd, 8); encode|=dpd<<16;
    getDPDt(dpd, 7); encode|=dpd<<6;
    getDPDt(dpd, 6); encode|=dpd>>4;
    DFWORD(df, 1)=encode;

    encode=dpd<<28;
    getDPDt(dpd, 5); encode|=dpd<<18;
    getDPDt(dpd, 4); encode|=dpd<<8;
    getDPDt(dpd, 3); encode|=dpd>>2;
    DFWORD(df, 2)=encode;

    encode=dpd<<30;
    getDPDt(dpd, 2); encode|=dpd<<20;
    getDPDt(dpd, 1); encode|=dpd<<10;
    getDPDt(dpd, 0); encode|=dpd;
    DFWORD(df, 3)=encode;
  #endif

  /* printf("Status: %08lx\n", (LI)set->status); */
  /* decFloatShow(df, "final2"); */
  return df;
  } /* decFinalize */

/* ------------------------------------------------------------------ */
/* decFloatFromBCD -- set decFloat from exponent, BCD8, and sign      */
/*								      */
/*  df is the target decFloat					      */
/*  exp is the in-range unbiased exponent, q, or a special value in   */
/*    the form returned by decFloatGetExponent			      */
/*  bcdar holds DECPMAX digits to set the coefficient from, one       */
/*    digit in each byte (BCD8 encoding); the first (MSD) is ignored  */
/*    if df is a NaN; all are ignored if df is infinite.	      */
/*    All bytes must be in 0-9; results are undefined otherwise.      */
/*  sig is DECFLOAT_Sign to set the sign bit, 0 otherwise	      */
/*  returns df, which will be canonical 			      */
/*								      */
/* No error is possible, and no status will be set.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromBCD(decFloat *df, Int exp, const uByte *bcdar,
			   Int sig) {
  uInt encode, dpd;			/* work */
  const uByte *ub;			/* .. */

  if (EXPISSPECIAL(exp)) encode=exp|sig;/* specials already encoded */
   else {				/* is finite */
    /* encode the combination field and exponent continuation */
    uInt uexp=(uInt)(exp+DECBIAS);	/* biased exponent */
    uInt code=(uexp>>DECECONL)<<4;	/* top two bits of exp */
    code+=bcdar[0];			/* add msd */
    /* look up the combination field and make high word */
    encode=DECCOMBFROM[code]|sig;	/* indexed by (0-2)*16+msd */
    encode|=(uexp<<(32-6-DECECONL)) & 0x03ffffff; /* exponent continuation */
    }

  /* private macro to extract a declet, n (where 0<=n<DECLETS and 0 */
  /* refers to the declet from the least significant three digits) */
  /* and put the corresponding DPD code into dpd. */
  /* Use of a working pointer, uInt *ub, is assumed. */

  #define getDPDb(dpd, n) ub=bcdar+DECPMAX-1-(3*(n))-2;     \
    dpd=BCD2DPD[(*ub*256)+(*(ub+1)*16)+*(ub+2)];

  /* place the declets in the encoding words and copy to result (df), */
  /* according to endianness; in all cases complete the sign word */
  /* first */
  #if DECPMAX==7
    getDPDb(dpd, 1);
    encode|=dpd<<10;
    getDPDb(dpd, 0);
    encode|=dpd;
    DFWORD(df, 0)=encode;     /* just the one word */

  #elif DECPMAX==16
    getDPDb(dpd, 4); encode|=dpd<<8;
    getDPDb(dpd, 3); encode|=dpd>>2;
    DFWORD(df, 0)=encode;
    encode=dpd<<30;
    getDPDb(dpd, 2); encode|=dpd<<20;
    getDPDb(dpd, 1); encode|=dpd<<10;
    getDPDb(dpd, 0); encode|=dpd;
    DFWORD(df, 1)=encode;

  #elif DECPMAX==34
    getDPDb(dpd,10); encode|=dpd<<4;
    getDPDb(dpd, 9); encode|=dpd>>6;
    DFWORD(df, 0)=encode;

    encode=dpd<<26;
    getDPDb(dpd, 8); encode|=dpd<<16;
    getDPDb(dpd, 7); encode|=dpd<<6;
    getDPDb(dpd, 6); encode|=dpd>>4;
    DFWORD(df, 1)=encode;

    encode=dpd<<28;
    getDPDb(dpd, 5); encode|=dpd<<18;
    getDPDb(dpd, 4); encode|=dpd<<8;
    getDPDb(dpd, 3); encode|=dpd>>2;
    DFWORD(df, 2)=encode;

    encode=dpd<<30;
    getDPDb(dpd, 2); encode|=dpd<<20;
    getDPDb(dpd, 1); encode|=dpd<<10;
    getDPDb(dpd, 0); encode|=dpd;
    DFWORD(df, 3)=encode;
  #endif
  /* decFloatShow(df, "fromB"); */
  return df;
  } /* decFloatFromBCD */

/* ------------------------------------------------------------------ */
/* decFloatFromPacked -- set decFloat from exponent and packed BCD    */
/*								      */
/*  df is the target decFloat					      */
/*  exp is the in-range unbiased exponent, q, or a special value in   */
/*    the form returned by decFloatGetExponent			      */
/*  packed holds DECPMAX packed decimal digits plus a sign nibble     */
/*    (all 6 codes are OK); the first (MSD) is ignored if df is a NaN */
/*    and all except sign are ignored if df is infinite.  For DOUBLE  */
/*    and QUAD the first (pad) nibble is also ignored in all cases.   */
/*    All coefficient nibbles must be in 0-9 and sign in A-F; results */
/*    are undefined otherwise.					      */
/*  returns df, which will be canonical 			      */
/*								      */
/* No error is possible, and no status will be set.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromPacked(decFloat *df, Int exp, const uByte *packed) {
  uByte bcdar[DECPMAX+2];		/* work [+1 for pad, +1 for sign] */
  const uByte *ip;			/* .. */
  uByte *op;				/* .. */
  Int	sig=0;				/* sign */

  /* expand coefficient and sign to BCDAR */
  #if SINGLE
  op=bcdar+1;				/* no pad digit */
  #else
  op=bcdar;				/* first (pad) digit ignored */
  #endif
  for (ip=packed; ip<packed+((DECPMAX+2)/2); ip++) {
    *op++=*ip>>4;
    *op++=(uByte)(*ip&0x0f);		/* [final nibble is sign] */
    }
  op--; 				/* -> sign byte */
  if (*op==DECPMINUS || *op==DECPMINUSALT) sig=DECFLOAT_Sign;

  if (EXPISSPECIAL(exp)) {		/* Infinity or NaN */
    if (!EXPISINF(exp)) bcdar[1]=0;	/* a NaN: ignore MSD */
     else memset(bcdar+1, 0, DECPMAX);	/* Infinite: coefficient to 0 */
    }
  return decFloatFromBCD(df, exp, bcdar+1, sig);
  } /* decFloatFromPacked */

/* ------------------------------------------------------------------ */
/* decFloatFromPackedChecked -- set from exponent and packed; checked */
/*								      */
/*  df is the target decFloat					      */
/*  exp is the in-range unbiased exponent, q, or a special value in   */
/*    the form returned by decFloatGetExponent			      */
/*  packed holds DECPMAX packed decimal digits plus a sign nibble     */
/*    (all 6 codes are OK); the first (MSD) must be 0 if df is a NaN  */
/*    and all digits must be 0 if df is infinite.  For DOUBLE and     */
/*    QUAD the first (pad) nibble must be 0.			      */
/*    All coefficient nibbles must be in 0-9 and sign in A-F.	      */
/*  returns df, which will be canonical or NULL if any of the	      */
/*    requirements are not met (if this case df is unchanged); that   */
/*    is, the input data must be as returned by decFloatToPacked,     */
/*    except that all six sign codes are accepted.		      */
/*								      */
/* No status will be set.					      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromPackedChecked(decFloat *df, Int exp,
				     const uByte *packed) {
  uByte bcdar[DECPMAX+2];		/* work [+1 for pad, +1 for sign] */
  const uByte *ip;			/* .. */
  uByte *op;				/* .. */
  Int	sig=0;				/* sign */

  /* expand coefficient and sign to BCDAR */
  #if SINGLE
  op=bcdar+1;				/* no pad digit */
  #else
  op=bcdar;				/* first (pad) digit here */
  #endif
  for (ip=packed; ip<packed+((DECPMAX+2)/2); ip++) {
    *op=*ip>>4;
    if (*op>9) return NULL;
    op++;
    *op=(uByte)(*ip&0x0f);		/* [final nibble is sign] */
    if (*op>9 && ip<packed+((DECPMAX+2)/2)-1) return NULL;
    op++;
    }
  op--; 				/* -> sign byte */
  if (*op<=9) return NULL;		/* bad sign */
  if (*op==DECPMINUS || *op==DECPMINUSALT) sig=DECFLOAT_Sign;

  #if !SINGLE
  if (bcdar[0]!=0) return NULL; 	/* bad pad nibble */
  #endif

  if (EXPISNAN(exp)) {			/* a NaN */
    if (bcdar[1]!=0) return NULL;	/* bad msd */
    } /* NaN */
   else if (EXPISINF(exp)) {		/* is infinite */
    Int i;
    for (i=0; i<DECPMAX; i++) {
      if (bcdar[i+1]!=0) return NULL;	/* should be all zeros */
      }
    } /* infinity */
   else {				/* finite */
    /* check the exponent is in range */
    if (exp>DECEMAX-DECPMAX+1) return NULL;
    if (exp<DECEMIN-DECPMAX+1) return NULL;
    }
  return decFloatFromBCD(df, exp, bcdar+1, sig);
  } /* decFloatFromPacked */

/* ------------------------------------------------------------------ */
/* decFloatFromString -- conversion from numeric string 	      */
/*								      */
/*  result  is the decFloat format number which gets the result of    */
/*	    the conversion					      */
/*  *string is the character string which should contain a valid      */
/*	    number (which may be a special value), \0-terminated      */
/*	    If there are too many significant digits in the	      */
/*	    coefficient it will be rounded.			      */
/*  set     is the context					      */
/*  returns result						      */
/*								      */
/* The length of the coefficient and the size of the exponent are     */
/* checked by this routine, so the correct error (Underflow or	      */
/* Overflow) can be reported or rounding applied, as necessary.       */
/*								      */
/* There is no limit to the coefficient length for finite inputs;     */
/* NaN payloads must be integers with no more than DECPMAX-1 digits.  */
/* Exponents may have up to nine significant digits.		      */
/*								      */
/* If bad syntax is detected, the result will be a quiet NaN.	      */
/* ------------------------------------------------------------------ */
decFloat * decFloatFromString(decFloat *result, const char *string,
			      decContext *set) {
  Int	 digits;		   /* count of digits in coefficient */
  const  char *dotchar=NULL;	   /* where dot was found [NULL if none] */
  const  char *cfirst=string;	   /* -> first character of decimal part */
  const  char *c;		   /* work */
  uByte *ub;			   /* .. */
  uInt	 uiwork;		   /* for macros */
  bcdnum num;			   /* collects data for finishing */
  uInt	 error=DEC_Conversion_syntax;	/* assume the worst */
  uByte  buffer[ROUNDUP(DECSTRING+11, 8)]; /* room for most coefficents, */
				   /* some common rounding, +3, & pad */
  #if DECTRACE
  /* printf("FromString %s ...\n", string); */
  #endif

  for(;;) {				/* once-only 'loop' */
    num.sign=0; 			/* assume non-negative */
    num.msd=buffer;			/* MSD is here always */

    /* detect and validate the coefficient, including any leading, */
    /* trailing, or embedded '.' */
    /* [could test four-at-a-time here (saving 10% for decQuads), */
    /* but that risks storage violation because the position of the */
    /* terminator is unknown] */
    for (c=string;; c++) {		/* -> input character */
      if (((unsigned)(*c-'0'))<=9) continue; /* '0' through '9' is good */
      if (*c=='\0') break;		/* most common non-digit */
      if (*c=='.') {
	if (dotchar!=NULL) break;	/* not first '.' */
	dotchar=c;			/* record offset into decimal part */
	continue;}
      if (c==string) {			/* first in string... */
	if (*c=='-') {			/* valid - sign */
	  cfirst++;
	  num.sign=DECFLOAT_Sign;
	  continue;}
	if (*c=='+') {			/* valid + sign */
	  cfirst++;
	  continue;}
	}
      /* *c is not a digit, terminator, or a valid +, -, or '.' */
      break;
      } /* c loop */

    digits=(uInt)(c-cfirst);		/* digits (+1 if a dot) */

    if (digits>0) {			/* had digits and/or dot */
      const char *clast=c-1;		/* note last coefficient char position */
      Int exp=0;			/* exponent accumulator */
      if (*c!='\0') {			/* something follows the coefficient */
	uInt edig;			/* unsigned work */
	/* had some digits and more to come; expect E[+|-]nnn now */
	const char *firstexp;		/* exponent first non-zero */
	if (*c!='E' && *c!='e') break;
	c++;				/* to (optional) sign */
	if (*c=='-' || *c=='+') c++;	/* step over sign (c=clast+2) */
	if (*c=='\0') break;		/* no digits!  (e.g., '1.2E') */
	for (; *c=='0';) c++;		/* skip leading zeros [even last] */
	firstexp=c;			/* remember start [maybe '\0'] */
	/* gather exponent digits */
	edig=(uInt)*c-(uInt)'0';
	if (edig<=9) {			/* [check not bad or terminator] */
	  exp+=edig;			/* avoid initial X10 */
	  c++;
	  for (;; c++) {
	    edig=(uInt)*c-(uInt)'0';
	    if (edig>9) break;
	    exp=exp*10+edig;
	    }
	  }
	/* if not now on the '\0', *c must not be a digit */
	if (*c!='\0') break;

	/* (this next test must be after the syntax checks) */
	/* if definitely more than the possible digits for format then */
	/* the exponent may have wrapped, so simply set it to a certain */
	/* over/underflow value */
	if (c>firstexp+DECEMAXD) exp=DECEMAX*2;
	if (*(clast+2)=='-') exp=-exp;	/* was negative */
	} /* digits>0 */

      if (dotchar!=NULL) {		/* had a '.' */
	digits--;			/* remove from digits count */
	if (digits==0) break;		/* was dot alone: bad syntax */
	exp-=(Int)(clast-dotchar);	/* adjust exponent */
	/* [the '.' can now be ignored] */
	}
      num.exponent=exp; 		/* exponent is good; store it */

      /* Here when whole string has been inspected and syntax is good */
      /* cfirst->first digit or dot, clast->last digit or dot */
      error=0;				/* no error possible now */

      /* if the number of digits in the coefficient will fit in buffer */
      /* then it can simply be converted to bcd8 and copied -- decFinalize */
      /* will take care of leading zeros and rounding; the buffer is big */
      /* enough for all canonical coefficients, including 0.00000nn... */
      ub=buffer;
      if (digits<=(Int)(sizeof(buffer)-3)) { /* [-3 allows by-4s copy] */
	c=cfirst;
	if (dotchar!=NULL) {		     /* a dot to worry about */
	  if (*(c+1)=='.') {		     /* common canonical case */
	    *ub++=(uByte)(*c-'0');	     /* copy leading digit */
	    c+=2;			     /* prepare to handle rest */
	    }
	   else for (; c<=clast;) {	     /* '.' could be anywhere */
	    /* as usual, go by fours when safe; NB it has been asserted */
	    /* that a '.' does not have the same mask as a digit */
	    if (c<=clast-3			       /* safe for four */
	     && (UBTOUI(c)&0xf0f0f0f0)==CHARMASK) {    /* test four */
	      UBFROMUI(ub, UBTOUI(c)&0x0f0f0f0f);      /* to BCD8 */
	      ub+=4;
	      c+=4;
	      continue;
	      }
	    if (*c=='.') {		     /* found the dot */
	      c++;			     /* step over it .. */
	      break;			     /* .. and handle the rest */
	      }
	    *ub++=(uByte)(*c++-'0');
	    }
	  } /* had dot */
	/* Now no dot; do this by fours (where safe) */
	for (; c<=clast-3; c+=4, ub+=4) UBFROMUI(ub, UBTOUI(c)&0x0f0f0f0f);
	for (; c<=clast; c++, ub++) *ub=(uByte)(*c-'0');
	num.lsd=buffer+digits-1;	     /* record new LSD */
	} /* fits */

       else {				     /* too long for buffer */
	/* [This is a rare and unusual case; arbitrary-length input] */
	/* strip leading zeros [but leave final 0 if all 0's] */
	if (*cfirst=='.') cfirst++;	     /* step past dot at start */
	if (*cfirst=='0') {		     /* [cfirst always -> digit] */
	  for (; cfirst<clast; cfirst++) {
	    if (*cfirst!='0') { 	     /* non-zero found */
	      if (*cfirst=='.') continue;    /* [ignore] */
	      break;			     /* done */
	      }
	    digits--;			     /* 0 stripped */
	    } /* cfirst */
	  } /* at least one leading 0 */

	/* the coefficient is now as short as possible, but may still */
	/* be too long; copy up to Pmax+1 digits to the buffer, then */
	/* just record any non-zeros (set round-for-reround digit) */
	for (c=cfirst; c<=clast && ub<=buffer+DECPMAX; c++) {
	  /* (see commentary just above) */
	  if (c<=clast-3			  /* safe for four */
	   && (UBTOUI(c)&0xf0f0f0f0)==CHARMASK) { /* four digits */
	    UBFROMUI(ub, UBTOUI(c)&0x0f0f0f0f);   /* to BCD8 */
	    ub+=4;
	    c+=3;			     /* [will become 4] */
	    continue;
	    }
	  if (*c=='.') continue;	     /* [ignore] */
	  *ub++=(uByte)(*c-'0');
	  }
	ub--;				     /* -> LSD */
	for (; c<=clast; c++) { 	     /* inspect remaining chars */
	  if (*c!='0') {		     /* sticky bit needed */
	    if (*c=='.') continue;	     /* [ignore] */
	    *ub=DECSTICKYTAB[*ub];	     /* update round-for-reround */
	    break;			     /* no need to look at more */
	    }
	  }
	num.lsd=ub;			     /* record LSD */
	/* adjust exponent for dropped digits */
	num.exponent+=digits-(Int)(ub-buffer+1);
	} /* too long for buffer */
      } /* digits or dot */

     else {				/* no digits or dot were found */
      if (*c=='\0') break;		/* nothing to come is bad */
      /* only Infinities and NaNs are allowed, here */
      buffer[0]=0;			/* default a coefficient of 0 */
      num.lsd=buffer;			/* .. */
      if (decBiStr(c, "infinity", "INFINITY")
       || decBiStr(c, "inf", "INF")) num.exponent=DECFLOAT_Inf;
       else {				/* should be a NaN */
	num.exponent=DECFLOAT_qNaN;	/* assume quiet NaN */
	if (*c=='s' || *c=='S') {	/* probably an sNaN */
	  c++;
	  num.exponent=DECFLOAT_sNaN;	/* assume is in fact sNaN */
	  }
	if (*c!='N' && *c!='n') break;	/* check caseless "NaN" */
	c++;
	if (*c!='a' && *c!='A') break;	/* .. */
	c++;
	if (*c!='N' && *c!='n') break;	/* .. */
	c++;
	/* now either nothing, or nnnn payload (no dots), expected */
	/* -> start of integer, and skip leading 0s [including plain 0] */
	for (cfirst=c; *cfirst=='0';) cfirst++;
	if (*cfirst!='\0') {		/* not empty or all-0, payload */
	  /* payload found; check all valid digits and copy to buffer as bcd8 */
	  ub=buffer;
	  for (c=cfirst;; c++, ub++) {
	    if ((unsigned)(*c-'0')>9) break; /* quit if not 0-9 */
	    if (c-cfirst==DECPMAX-1) break;  /* too many digits */
	    *ub=(uByte)(*c-'0');	/* good bcd8 */
	    }
	  if (*c!='\0') break;		/* not all digits, or too many */
	  num.lsd=ub-1; 		/* record new LSD */
	  }
	} /* NaN or sNaN */
      error=0;				/* syntax is OK */
      break;				/* done with specials */
      } /* digits=0 (special expected) */
    break;
    }					/* [for(;;) break] */

  /* decShowNum(&num, "fromStr"); */

  if (error!=0) {
    set->status|=error;
    num.exponent=DECFLOAT_qNaN; 	/* set up quiet NaN */
    num.sign=0; 			/* .. with 0 sign */
    buffer[0]=0;			/* .. and coefficient */
    num.lsd=buffer;			/* .. */
    /* decShowNum(&num, "oops"); */
    }

  /* decShowNum(&num, "dffs"); */
  decFinalize(result, &num, set);	/* round, check, and lay out */
  /* decFloatShow(result, "fromString"); */
  return result;
  } /* decFloatFromString */

/* ------------------------------------------------------------------ */
/* decFloatFromWider -- conversion from next-wider format	      */
/*								      */
/*  result  is the decFloat format number which gets the result of    */
/*	    the conversion					      */
/*  wider   is the decFloatWider format number which will be narrowed */
/*  set     is the context					      */
/*  returns result						      */
/*								      */
/* Narrowing can cause rounding, overflow, etc., but not Invalid      */
/* operation (sNaNs are copied and do not signal).		      */
/* ------------------------------------------------------------------ */
/* narrow-to is not possible for decQuad format numbers; simply omit */
#if !QUAD
decFloat * decFloatFromWider(decFloat *result, const decFloatWider *wider,
			     decContext *set) {
  bcdnum num;				/* collects data for finishing */
  uByte  bcdar[DECWPMAX];		/* room for wider coefficient */
  uInt	 widerhi=DFWWORD(wider, 0);	/* top word */
  Int	 exp;

  GETWCOEFF(wider, bcdar);

  num.msd=bcdar;			/* MSD is here always */
  num.lsd=bcdar+DECWPMAX-1;		/* LSD is here always */
  num.sign=widerhi&0x80000000;		/* extract sign [DECFLOAT_Sign=Neg] */

  /* decode the wider combination field to exponent */
  exp=DECCOMBWEXP[widerhi>>26]; 	/* decode from wider combination field */
  /* if it is a special there's nothing to do unless sNaN; if it's */
  /* finite then add the (wider) exponent continuation and unbias */
  if (EXPISSPECIAL(exp)) exp=widerhi&0x7e000000; /* include sNaN selector */
   else exp+=GETWECON(wider)-DECWBIAS;
  num.exponent=exp;

  /* decShowNum(&num, "dffw"); */
  return decFinalize(result, &num, set);/* round, check, and lay out */
  } /* decFloatFromWider */
#endif

/* ------------------------------------------------------------------ */
/* decFloatGetCoefficient -- get coefficient as BCD8		      */
/*								      */
/*  df is the decFloat from which to extract the coefficient	      */
/*  bcdar is where DECPMAX bytes will be written, one BCD digit in    */
/*    each byte (BCD8 encoding); if df is a NaN the first byte will   */
/*    be zero, and if it is infinite they will all be zero	      */
/*  returns the sign of the coefficient (DECFLOAT_Sign if negative,   */
/*    0 otherwise)						      */
/*								      */
/* No error is possible, and no status will be set.  If df is a       */
/* special value the array is set to zeros (for Infinity) or to the   */
/* payload of a qNaN or sNaN.					      */
/* ------------------------------------------------------------------ */
Int decFloatGetCoefficient(const decFloat *df, uByte *bcdar) {
  if (DFISINF(df)) memset(bcdar, 0, DECPMAX);
   else {
    GETCOEFF(df, bcdar);	   /* use macro */
    if (DFISNAN(df)) bcdar[0]=0;   /* MSD needs correcting */
    }
  return DFISSIGNED(df);
  } /* decFloatGetCoefficient */

/* ------------------------------------------------------------------ */
/* decFloatGetExponent -- get unbiased exponent 		      */
/*								      */
/*  df is the decFloat from which to extract the exponent	      */
/*  returns the exponent, q.					      */
/*								      */
/* No error is possible, and no status will be set.  If df is a       */
/* special value the first seven bits of the decFloat are returned,   */
/* left adjusted and with the first (sign) bit set to 0 (followed by  */
/* 25 0 bits).	e.g., -sNaN would return 0x7e000000 (DECFLOAT_sNaN).  */
/* ------------------------------------------------------------------ */
Int decFloatGetExponent(const decFloat *df) {
  if (DFISSPECIAL(df)) return DFWORD(df, 0)&0x7e000000;
  return GETEXPUN(df);
  } /* decFloatGetExponent */

/* ------------------------------------------------------------------ */
/* decFloatSetCoefficient -- set coefficient from BCD8		      */
/*								      */
/*  df is the target decFloat (and source of exponent/special value)  */
/*  bcdar holds DECPMAX digits to set the coefficient from, one       */
/*    digit in each byte (BCD8 encoding); the first (MSD) is ignored  */
/*    if df is a NaN; all are ignored if df is infinite.	      */
/*  sig is DECFLOAT_Sign to set the sign bit, 0 otherwise	      */
/*  returns df, which will be canonical 			      */
/*								      */
/* No error is possible, and no status will be set.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatSetCoefficient(decFloat *df, const uByte *bcdar,
				  Int sig) {
  uInt exp;			   /* for exponent */
  uByte bcdzero[DECPMAX];	   /* for infinities */

  /* Exponent/special code is extracted from df */
  if (DFISSPECIAL(df)) {
    exp=DFWORD(df, 0)&0x7e000000;
    if (DFISINF(df)) {
      memset(bcdzero, 0, DECPMAX);
      return decFloatFromBCD(df, exp, bcdzero, sig);
      }
    }
   else exp=GETEXPUN(df);
  return decFloatFromBCD(df, exp, bcdar, sig);
  } /* decFloatSetCoefficient */

/* ------------------------------------------------------------------ */
/* decFloatSetExponent -- set exponent or special value 	      */
/*								      */
/*  df	is the target decFloat (and source of coefficient/payload)    */
/*  set is the context for reporting status			      */
/*  exp is the unbiased exponent, q, or a special value in the form   */
/*    returned by decFloatGetExponent				      */
/*  returns df, which will be canonical 			      */
/*								      */
/* No error is possible, but Overflow or Underflow might occur.       */
/* ------------------------------------------------------------------ */
decFloat * decFloatSetExponent(decFloat *df, decContext *set, Int exp) {
  uByte  bcdcopy[DECPMAX];	   /* for coefficient */
  bcdnum num;			   /* work */
  num.exponent=exp;
  num.sign=decFloatGetCoefficient(df, bcdcopy); /* extract coefficient */
  if (DFISSPECIAL(df)) {	   /* MSD or more needs correcting */
    if (DFISINF(df)) memset(bcdcopy, 0, DECPMAX);
    bcdcopy[0]=0;
    }
  num.msd=bcdcopy;
  num.lsd=bcdcopy+DECPMAX-1;
  return decFinalize(df, &num, set);
  } /* decFloatSetExponent */

/* ------------------------------------------------------------------ */
/* decFloatRadix -- returns the base (10)			      */
/*								      */
/*   df is any decFloat of this format				      */
/* ------------------------------------------------------------------ */
uInt decFloatRadix(const decFloat *df) {
  if (df) return 10;			     /* to placate compiler */
  return 10;
  } /* decFloatRadix */

#if (DECCHECK || DECTRACE)
/* ------------------------------------------------------------------ */
/* decFloatShow -- printf a decFloat in hexadecimal and decimal       */
/*   df  is the decFloat to show				      */
/*   tag is a tag string displayed with the number		      */
/*								      */
/* This is a debug aid; the precise format of the string may change.  */
/* ------------------------------------------------------------------ */
void decFloatShow(const decFloat *df, const char *tag) {
  char hexbuf[DECBYTES*2+DECBYTES/4+1]; /* NB blank after every fourth */
  char buff[DECSTRING]; 		/* for value in decimal */
  Int i, j=0;

  for (i=0; i<DECBYTES; i++) {
    #if DECLITEND
      sprintf(&hexbuf[j], "%02x", df->bytes[DECBYTES-1-i]);
    #else
      sprintf(&hexbuf[j], "%02x", df->bytes[i]);
    #endif
    j+=2;
    /* the next line adds blank (and terminator) after final pair, too */
    if ((i+1)%4==0) {strcpy(&hexbuf[j], " "); j++;}
    }
  decFloatToString(df, buff);
  printf(">%s> %s [big-endian]	%s\n", tag, hexbuf, buff);
  return;
  } /* decFloatShow */
#endif

/* ------------------------------------------------------------------ */
/* decFloatToBCD -- get sign, exponent, and BCD8 from a decFloat      */
/*								      */
/*  df is the source decFloat					      */
/*  exp will be set to the unbiased exponent, q, or to a special      */
/*    value in the form returned by decFloatGetExponent 	      */
/*  bcdar is where DECPMAX bytes will be written, one BCD digit in    */
/*    each byte (BCD8 encoding); if df is a NaN the first byte will   */
/*    be zero, and if it is infinite they will all be zero	      */
/*  returns the sign of the coefficient (DECFLOAT_Sign if negative,   */
/*    0 otherwise)						      */
/*								      */
/* No error is possible, and no status will be set.		      */
/* ------------------------------------------------------------------ */
Int decFloatToBCD(const decFloat *df, Int *exp, uByte *bcdar) {
  if (DFISINF(df)) {
    memset(bcdar, 0, DECPMAX);
    *exp=DFWORD(df, 0)&0x7e000000;
    }
   else {
    GETCOEFF(df, bcdar);	   /* use macro */
    if (DFISNAN(df)) {
      bcdar[0]=0;		   /* MSD needs correcting */
      *exp=DFWORD(df, 0)&0x7e000000;
      }
     else {			   /* finite */
      *exp=GETEXPUN(df);
      }
    }
  return DFISSIGNED(df);
  } /* decFloatToBCD */

/* ------------------------------------------------------------------ */
/* decFloatToEngString -- conversion to numeric string, engineering   */
/*								      */
/*  df is the decFloat format number to convert 		      */
/*  string is the string where the result will be laid out	      */
/*								      */
/* string must be at least DECPMAX+9 characters (the worst case is    */
/* "-0.00000nnn...nnn\0", which is as long as the exponent form when  */
/* DECEMAXD<=4); this condition is asserted above		      */
/*								      */
/* No error is possible, and no status will be set		      */
/* ------------------------------------------------------------------ */
char * decFloatToEngString(const decFloat *df, char *string){
  uInt msd;			   /* coefficient MSD */
  Int  exp;			   /* exponent top two bits or full */
  uInt comb;			   /* combination field */
  char *cstart; 		   /* coefficient start */
  char *c;			   /* output pointer in string */
  char *s, *t;			   /* .. (source, target) */
  Int  pre, e;			   /* work */
  const uByte *u;		   /* .. */
  uInt	uiwork; 		   /* for macros [one compiler needs */
				   /* volatile here to avoid bug, but */
				   /* that doubles execution time] */

  /* Source words; macro handles endianness */
  uInt sourhi=DFWORD(df, 0);	   /* word with sign */
  #if DECPMAX==16
  uInt sourlo=DFWORD(df, 1);
  #elif DECPMAX==34
  uInt sourmh=DFWORD(df, 1);
  uInt sourml=DFWORD(df, 2);
  uInt sourlo=DFWORD(df, 3);
  #endif

  c=string;			   /* where result will go */
  if (((Int)sourhi)<0) *c++='-';   /* handle sign */
  comb=sourhi>>26;		   /* sign+combination field */
  msd=DECCOMBMSD[comb]; 	   /* decode the combination field */
  exp=DECCOMBEXP[comb]; 	   /* .. */

  if (EXPISSPECIAL(exp)) {	   /* special */
    if (exp==DECFLOAT_Inf) {	   /* infinity */
      strcpy(c,   "Inf");
      strcpy(c+3, "inity");
      return string;		   /* easy */
      }
    if (sourhi&0x02000000) *c++='s'; /* sNaN */
    strcpy(c, "NaN");		   /* complete word */
    c+=3;			   /* step past */
    /* quick exit if the payload is zero */
    #if DECPMAX==7
    if ((sourhi&0x000fffff)==0) return string;
    #elif DECPMAX==16
    if (sourlo==0 && (sourhi&0x0003ffff)==0) return string;
    #elif DECPMAX==34
    if (sourlo==0 && sourml==0 && sourmh==0
     && (sourhi&0x00003fff)==0) return string;
    #endif
    /* otherwise drop through to add integer; set correct exp etc. */
    exp=0; msd=0;		   /* setup for following code */
    }
   else { /* complete exponent; top two bits are in place */
    exp+=GETECON(df)-DECBIAS;	   /* .. + continuation and unbias */
    }

  /* convert the digits of the significand to characters */
  cstart=c;			   /* save start of coefficient */
  if (msd) *c++=(char)('0'+(char)msd);	/* non-zero most significant digit */

  /* Decode the declets.  After extracting each declet, it is */
  /* decoded to a 4-uByte sequence by table lookup; the four uBytes */
  /* are the three encoded BCD8 digits followed by a 1-byte length */
  /* (significant digits, except that 000 has length 0).  This allows */
  /* us to left-align the first declet with non-zero content, then */
  /* the remaining ones are full 3-char length.  Fixed-length copies */
  /* are used because variable-length memcpy causes a subroutine call */
  /* in at least two compilers.  (The copies are length 4 for speed */
  /* and are safe because the last item in the array is of length */
  /* three and has the length byte following.) */
  #define dpd2char(dpdin) u=&DPD2BCD8[((dpdin)&0x3ff)*4];	 \
	 if (c!=cstart) {UBFROMUI(c, UBTOUI(u)|CHARMASK); c+=3;} \
	  else if (*(u+3)) {					 \
	   UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK); c+=*(u+3);}

  #if DECPMAX==7
  dpd2char(sourhi>>10); 		/* declet 1 */
  dpd2char(sourhi);			/* declet 2 */

  #elif DECPMAX==16
  dpd2char(sourhi>>8);			/* declet 1 */
  dpd2char((sourhi<<2) | (sourlo>>30)); /* declet 2 */
  dpd2char(sourlo>>20); 		/* declet 3 */
  dpd2char(sourlo>>10); 		/* declet 4 */
  dpd2char(sourlo);			/* declet 5 */

  #elif DECPMAX==34
  dpd2char(sourhi>>4);			/* declet 1 */
  dpd2char((sourhi<<6) | (sourmh>>26)); /* declet 2 */
  dpd2char(sourmh>>16); 		/* declet 3 */
  dpd2char(sourmh>>6);			/* declet 4 */
  dpd2char((sourmh<<4) | (sourml>>28)); /* declet 5 */
  dpd2char(sourml>>18); 		/* declet 6 */
  dpd2char(sourml>>8);			/* declet 7 */
  dpd2char((sourml<<2) | (sourlo>>30)); /* declet 8 */
  dpd2char(sourlo>>20); 		/* declet 9 */
  dpd2char(sourlo>>10); 		/* declet 10 */
  dpd2char(sourlo);			/* declet 11 */
  #endif

  if (c==cstart) *c++='0';	   /* all zeros, empty -- make "0" */

  if (exp==0) { 		   /* integer or NaN case -- easy */
    *c='\0';			   /* terminate */
    return string;
    }
  /* non-0 exponent */

  e=0;				   /* assume no E */
  pre=(Int)(c-cstart)+exp;	   /* length+exp  [c->LSD+1] */
  /* [here, pre-exp is the digits count (==1 for zero)] */

  if (exp>0 || pre<-5) {	   /* need exponential form */
    e=pre-1;			   /* calculate E value */
    pre=1;			   /* assume one digit before '.' */
    if (e!=0) { 		   /* engineering: may need to adjust */
      Int adj;			   /* adjustment */
      /* The C remainder operator is undefined for negative numbers, so */
      /* a positive remainder calculation must be used here */
      if (e<0) {
	adj=(-e)%3;
	if (adj!=0) adj=3-adj;
	}
       else { /* e>0 */
	adj=e%3;
	}
      e=e-adj;
      /* if dealing with zero still produce an exponent which is a */
      /* multiple of three, as expected, but there will only be the */
      /* one zero before the E, still.	Otherwise note the padding. */
      if (!DFISZERO(df)) pre+=adj;
       else {  /* is zero */
	if (adj!=0) {		   /* 0.00Esnn needed */
	  e=e+3;
	  pre=-(2-adj);
	  }
	} /* zero */
      } /* engineering adjustment */
    } /* exponential form */
  /* printf("e=%ld pre=%ld exp=%ld\n", (LI)e, (LI)pre, (LI)exp); */

  /* modify the coefficient, adding 0s, '.', and E+nn as needed */
  if (pre>0) {			   /* ddd.ddd (plain), perhaps with E */
				   /* or dd00 padding for engineering */
    char *dotat=cstart+pre;
    if (dotat<c) {			/* if embedded dot needed... */
      /* move by fours; there must be space for junk at the end */
      /* because there is still space for exponent */
      s=dotat+ROUNDDOWN4(c-dotat);	/* source */
      t=s+1;				/* target */
      /* open the gap [cannot use memcpy] */
      for (; s>=dotat; s-=4, t-=4) UBFROMUI(t, UBTOUI(s));
      *dotat='.';
      c++;				/* length increased by one */
      } /* need dot? */
     else for (; c<dotat; c++) *c='0';	/* pad for engineering */
    } /* pre>0 */
   else {
    /* -5<=pre<=0: here for plain 0.ddd or 0.000ddd forms (may have
       E, but only for 0.00E+3 kind of case -- with plenty of spare
       space in this case */
    pre=-pre+2; 			/* gap width, including "0." */
    t=cstart+ROUNDDOWN4(c-cstart)+pre;	/* preferred first target point */
    /* backoff if too far to the right */
    if (t>string+DECSTRING-5) t=string+DECSTRING-5; /* adjust to fit */
    /* now shift the entire coefficient to the right, being careful not */
    /* to access to the left of string [cannot use memcpy] */
    for (s=t-pre; s>=string; s-=4, t-=4) UBFROMUI(t, UBTOUI(s));
    /* for Quads and Singles there may be a character or two left... */
    s+=3;				/* where next would come from */
    for(; s>=cstart; s--, t--) *(t+3)=*(s);
    /* now have fill 0. through 0.00000; use overlaps to avoid tests */
    if (pre>=4) {
      memcpy(cstart+pre-4, "0000", 4);
      memcpy(cstart, "0.00", 4);
      }
     else { /* 2 or 3 */
      *(cstart+pre-1)='0';
      memcpy(cstart, "0.", 2);
      }
    c+=pre;				/* to end */
    }

  /* finally add the E-part, if needed; it will never be 0, and has */
  /* a maximum length of 3 or 4 digits (asserted above) */
  if (e!=0) {
    memcpy(c, "E+", 2); 		/* starts with E, assume + */
    c++;
    if (e<0) {
      *c='-';				/* oops, need '-' */
      e=-e;				/* uInt, please */
      }
    c++;
    /* Three-character exponents are easy; 4-character a little trickier */
    #if DECEMAXD<=3
      u=&BIN2BCD8[e*4]; 		/* -> 3 digits + length byte */
      /* copy fixed 4 characters [is safe], starting at non-zero */
      /* and with character mask to convert BCD to char */
      UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK);
      c+=*(u+3);			/* bump pointer appropriately */
    #elif DECEMAXD==4
      if (e<1000) {			/* 3 (or fewer) digits case */
	u=&BIN2BCD8[e*4];		/* -> 3 digits + length byte */
	UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK); /* [as above] */
	c+=*(u+3);			/* bump pointer appropriately */
	}
       else {				/* 4-digits */
	Int thou=((e>>3)*1049)>>17;	/* e/1000 */
	Int rem=e-(1000*thou);		/* e%1000 */
	*c++=(char)('0'+(char)thou);	/* the thousands digit */
	u=&BIN2BCD8[rem*4];		/* -> 3 digits + length byte */
	UBFROMUI(c, UBTOUI(u)|CHARMASK);/* copy fixed 3+1 characters [is safe] */
	c+=3;				/* bump pointer, always 3 digits */
	}
    #endif
    }
  *c='\0';				/* terminate */
  /*printf("res %s\n", string); */
  return string;
  } /* decFloatToEngString */

/* ------------------------------------------------------------------ */
/* decFloatToPacked -- convert decFloat to Packed decimal + exponent  */
/*								      */
/*  df is the source decFloat					      */
/*  exp will be set to the unbiased exponent, q, or to a special      */
/*    value in the form returned by decFloatGetExponent 	      */
/*  packed is where DECPMAX nibbles will be written with the sign as  */
/*    final nibble (0x0c for +, 0x0d for -); a NaN has a first nibble */
/*    of zero, and an infinity is all zeros. decDouble and decQuad    */
/*    have a additional leading zero nibble, leading to result	      */
/*    lengths of 4, 9, and 18 bytes.				      */
/*  returns the sign of the coefficient (DECFLOAT_Sign if negative,   */
/*    0 otherwise)						      */
/*								      */
/* No error is possible, and no status will be set.		      */
/* ------------------------------------------------------------------ */
Int decFloatToPacked(const decFloat *df, Int *exp, uByte *packed) {
  uByte bcdar[DECPMAX+2];	   /* work buffer */
  uByte *ip=bcdar, *op=packed;	   /* work pointers */
  if (DFISINF(df)) {
    memset(bcdar, 0, DECPMAX+2);
    *exp=DECFLOAT_Inf;
    }
   else {
    GETCOEFF(df, bcdar+1);	   /* use macro */
    if (DFISNAN(df)) {
      bcdar[1]=0;		   /* MSD needs clearing */
      *exp=DFWORD(df, 0)&0x7e000000;
      }
     else {			   /* finite */
      *exp=GETEXPUN(df);
      }
    }
  /* now pack; coefficient currently at bcdar+1 */
  #if SINGLE
    ip++;			   /* ignore first byte */
  #else
    *ip=0;			   /* need leading zero */
  #endif
  /* set final byte to Packed BCD sign value */
  bcdar[DECPMAX+1]=(DFISSIGNED(df) ? DECPMINUS : DECPPLUS);
  /* pack an even number of bytes... */
  for (; op<packed+((DECPMAX+2)/2); op++, ip+=2) {
    *op=(uByte)((*ip<<4)+*(ip+1));
    }
  return (bcdar[DECPMAX+1]==DECPMINUS ? DECFLOAT_Sign : 0);
  } /* decFloatToPacked */

/* ------------------------------------------------------------------ */
/* decFloatToString -- conversion to numeric string		      */
/*								      */
/*  df is the decFloat format number to convert 		      */
/*  string is the string where the result will be laid out	      */
/*								      */
/* string must be at least DECPMAX+9 characters (the worst case is    */
/* "-0.00000nnn...nnn\0", which is as long as the exponent form when  */
/* DECEMAXD<=4); this condition is asserted above		      */
/*								      */
/* No error is possible, and no status will be set		      */
/* ------------------------------------------------------------------ */
char * decFloatToString(const decFloat *df, char *string){
  uInt msd;			   /* coefficient MSD */
  Int  exp;			   /* exponent top two bits or full */
  uInt comb;			   /* combination field */
  char *cstart; 		   /* coefficient start */
  char *c;			   /* output pointer in string */
  char *s, *t;			   /* .. (source, target) */
  Int  pre, e;			   /* work */
  const uByte *u;		   /* .. */
  uInt	uiwork; 		   /* for macros [one compiler needs */
				   /* volatile here to avoid bug, but */
				   /* that doubles execution time] */

  /* Source words; macro handles endianness */
  uInt sourhi=DFWORD(df, 0);	   /* word with sign */
  #if DECPMAX==16
  uInt sourlo=DFWORD(df, 1);
  #elif DECPMAX==34
  uInt sourmh=DFWORD(df, 1);
  uInt sourml=DFWORD(df, 2);
  uInt sourlo=DFWORD(df, 3);
  #endif

  c=string;			   /* where result will go */
  if (((Int)sourhi)<0) *c++='-';   /* handle sign */
  comb=sourhi>>26;		   /* sign+combination field */
  msd=DECCOMBMSD[comb]; 	   /* decode the combination field */
  exp=DECCOMBEXP[comb]; 	   /* .. */

  if (!EXPISSPECIAL(exp)) {	   /* finite */
    /* complete exponent; top two bits are in place */
    exp+=GETECON(df)-DECBIAS;	   /* .. + continuation and unbias */
    }
   else {			   /* IS special */
    if (exp==DECFLOAT_Inf) {	   /* infinity */
      strcpy(c, "Infinity");
      return string;		   /* easy */
      }
    if (sourhi&0x02000000) *c++='s'; /* sNaN */
    strcpy(c, "NaN");		   /* complete word */
    c+=3;			   /* step past */
    /* quick exit if the payload is zero */
    #if DECPMAX==7
    if ((sourhi&0x000fffff)==0) return string;
    #elif DECPMAX==16
    if (sourlo==0 && (sourhi&0x0003ffff)==0) return string;
    #elif DECPMAX==34
    if (sourlo==0 && sourml==0 && sourmh==0
     && (sourhi&0x00003fff)==0) return string;
    #endif
    /* otherwise drop through to add integer; set correct exp etc. */
    exp=0; msd=0;		   /* setup for following code */
    }

  /* convert the digits of the significand to characters */
  cstart=c;			   /* save start of coefficient */
  if (msd) *c++=(char)('0'+(char)msd);	/* non-zero most significant digit */

  /* Decode the declets.  After extracting each declet, it is */
  /* decoded to a 4-uByte sequence by table lookup; the four uBytes */
  /* are the three encoded BCD8 digits followed by a 1-byte length */
  /* (significant digits, except that 000 has length 0).  This allows */
  /* us to left-align the first declet with non-zero content, then */
  /* the remaining ones are full 3-char length.  Fixed-length copies */
  /* are used because variable-length memcpy causes a subroutine call */
  /* in at least two compilers.  (The copies are length 4 for speed */
  /* and are safe because the last item in the array is of length */
  /* three and has the length byte following.) */
  #define dpd2char(dpdin) u=&DPD2BCD8[((dpdin)&0x3ff)*4];	 \
	 if (c!=cstart) {UBFROMUI(c, UBTOUI(u)|CHARMASK); c+=3;} \
	  else if (*(u+3)) {					 \
	   UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK); c+=*(u+3);}

  #if DECPMAX==7
  dpd2char(sourhi>>10); 		/* declet 1 */
  dpd2char(sourhi);			/* declet 2 */

  #elif DECPMAX==16
  dpd2char(sourhi>>8);			/* declet 1 */
  dpd2char((sourhi<<2) | (sourlo>>30)); /* declet 2 */
  dpd2char(sourlo>>20); 		/* declet 3 */
  dpd2char(sourlo>>10); 		/* declet 4 */
  dpd2char(sourlo);			/* declet 5 */

  #elif DECPMAX==34
  dpd2char(sourhi>>4);			/* declet 1 */
  dpd2char((sourhi<<6) | (sourmh>>26)); /* declet 2 */
  dpd2char(sourmh>>16); 		/* declet 3 */
  dpd2char(sourmh>>6);			/* declet 4 */
  dpd2char((sourmh<<4) | (sourml>>28)); /* declet 5 */
  dpd2char(sourml>>18); 		/* declet 6 */
  dpd2char(sourml>>8);			/* declet 7 */
  dpd2char((sourml<<2) | (sourlo>>30)); /* declet 8 */
  dpd2char(sourlo>>20); 		/* declet 9 */
  dpd2char(sourlo>>10); 		/* declet 10 */
  dpd2char(sourlo);			/* declet 11 */
  #endif

  if (c==cstart) *c++='0';	   /* all zeros, empty -- make "0" */

  /*[This fast path is valid but adds 3-5 cycles to worst case length] */
  /*if (exp==0) {		   // integer or NaN case -- easy */
  /*  *c='\0';			   // terminate */
  /*  return string; */
  /*  } */

  e=0;				   /* assume no E */
  pre=(Int)(c-cstart)+exp;	   /* length+exp  [c->LSD+1] */
  /* [here, pre-exp is the digits count (==1 for zero)] */

  if (exp>0 || pre<-5) {	   /* need exponential form */
    e=pre-1;			   /* calculate E value */
    pre=1;			   /* assume one digit before '.' */
    } /* exponential form */

  /* modify the coefficient, adding 0s, '.', and E+nn as needed */
  if (pre>0) {			   /* ddd.ddd (plain), perhaps with E */
    char *dotat=cstart+pre;
    if (dotat<c) {			/* if embedded dot needed... */
      /* [memmove is a disaster, here] */
      /* move by fours; there must be space for junk at the end */
      /* because exponent is still possible */
      s=dotat+ROUNDDOWN4(c-dotat);	/* source */
      t=s+1;				/* target */
      /* open the gap [cannot use memcpy] */
      for (; s>=dotat; s-=4, t-=4) UBFROMUI(t, UBTOUI(s));
      *dotat='.';
      c++;				/* length increased by one */
      } /* need dot? */

    /* finally add the E-part, if needed; it will never be 0, and has */
    /* a maximum length of 3 or 4 digits (asserted above) */
    if (e!=0) {
      memcpy(c, "E+", 2);		/* starts with E, assume + */
      c++;
      if (e<0) {
	*c='-'; 			/* oops, need '-' */
	e=-e;				/* uInt, please */
	}
      c++;
      /* Three-character exponents are easy; 4-character a little trickier */
      #if DECEMAXD<=3
	u=&BIN2BCD8[e*4];		/* -> 3 digits + length byte */
	/* copy fixed 4 characters [is safe], starting at non-zero */
	/* and with character mask to convert BCD to char */
	UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK);
	c+=*(u+3);			/* bump pointer appropriately */
      #elif DECEMAXD==4
	if (e<1000) {			/* 3 (or fewer) digits case */
	  u=&BIN2BCD8[e*4];		/* -> 3 digits + length byte */
	  UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK); /* [as above] */
	  c+=*(u+3);			/* bump pointer appropriately */
	  }
	 else { 			/* 4-digits */
	  Int thou=((e>>3)*1049)>>17;	/* e/1000 */
	  Int rem=e-(1000*thou);	/* e%1000 */
	  *c++=(char)('0'+(char)thou);	/* the thousands digit */
	  u=&BIN2BCD8[rem*4];		/* -> 3 digits + length byte */
	  UBFROMUI(c, UBTOUI(u)|CHARMASK); /* copy fixed 3+1 characters [is safe] */
	  c+=3; 			/* bump pointer, always 3 digits */
	  }
      #endif
      }
    *c='\0';				/* add terminator */
    /*printf("res %s\n", string); */
    return string;
    } /* pre>0 */

  /* -5<=pre<=0: here for plain 0.ddd or 0.000ddd forms (can never have E) */
  /* Surprisingly, this is close to being the worst-case path, so the */
  /* shift is done by fours; this is a little tricky because the */
  /* rightmost character to be written must not be beyond where the */
  /* rightmost terminator could be -- so backoff to not touch */
  /* terminator position if need be (this can make exact alignments */
  /* for full Doubles, but in some cases needs care not to access too */
  /* far to the left) */

  pre=-pre+2;				/* gap width, including "0." */
  t=cstart+ROUNDDOWN4(c-cstart)+pre;	/* preferred first target point */
  /* backoff if too far to the right */
  if (t>string+DECSTRING-5) t=string+DECSTRING-5; /* adjust to fit */
  /* now shift the entire coefficient to the right, being careful not */
  /* to access to the left of string [cannot use memcpy] */
  for (s=t-pre; s>=string; s-=4, t-=4) UBFROMUI(t, UBTOUI(s));
  /* for Quads and Singles there may be a character or two left... */
  s+=3; 				/* where next would come from */
  for(; s>=cstart; s--, t--) *(t+3)=*(s);
  /* now have fill 0. through 0.00000; use overlaps to avoid tests */
  if (pre>=4) {
    memcpy(cstart+pre-4, "0000", 4);
    memcpy(cstart, "0.00", 4);
    }
   else { /* 2 or 3 */
    *(cstart+pre-1)='0';
    memcpy(cstart, "0.", 2);
    }
  *(c+pre)='\0';			/* terminate */
  return string;
  } /* decFloatToString */

/* ------------------------------------------------------------------ */
/* decFloatToWider -- conversion to next-wider format		      */
/*								      */
/*  source  is the decFloat format number which gets the result of    */
/*	    the conversion					      */
/*  wider   is the decFloatWider format number which will be narrowed */
/*  returns wider						      */
/*								      */
/* Widening is always exact; no status is set (sNaNs are copied and   */
/* do not signal).  The result will be canonical if the source is,    */
/* and may or may not be if the source is not.			      */
/* ------------------------------------------------------------------ */
/* widening is not possible for decQuad format numbers; simply omit */
#if !QUAD
decFloatWider * decFloatToWider(const decFloat *source, decFloatWider *wider) {
  uInt msd;

  /* Construct and copy the sign word */
  if (DFISSPECIAL(source)) {
    /* copy sign, combination, and first bit of exponent (sNaN selector) */
    DFWWORD(wider, 0)=DFWORD(source, 0)&0xfe000000;
    msd=0;
    }
   else { /* is finite number */
    uInt exp=GETEXPUN(source)+DECWBIAS; /* get unbiased exponent and rebias */
    uInt code=(exp>>DECWECONL)<<29;	/* set two bits of exp [msd=0] */
    code|=(exp<<(32-6-DECWECONL)) & 0x03ffffff; /* add exponent continuation */
    code|=DFWORD(source, 0)&0x80000000; /* add sign */
    DFWWORD(wider, 0)=code;		/* .. and place top word in wider */
    msd=GETMSD(source); 		/* get source coefficient MSD [0-9] */
    }
  /* Copy the coefficient and clear any 'unused' words to left */
  #if SINGLE
    DFWWORD(wider, 1)=(DFWORD(source, 0)&0x000fffff)|(msd<<20);
  #elif DOUBLE
    DFWWORD(wider, 2)=(DFWORD(source, 0)&0x0003ffff)|(msd<<18);
    DFWWORD(wider, 3)=DFWORD(source, 1);
    DFWWORD(wider, 1)=0;
  #endif
  return wider;
  } /* decFloatToWider */
#endif

/* ------------------------------------------------------------------ */
/* decFloatVersion -- return package version string		      */
/*								      */
/*  returns a constant string describing this package		      */
/* ------------------------------------------------------------------ */
const char *decFloatVersion(void) {
  return DECVERSION;
  } /* decFloatVersion */

/* ------------------------------------------------------------------ */
/* decFloatZero -- set to canonical (integer) zero		      */
/*								      */
/*  df is the decFloat format number to integer +0 (q=0, c=+0)	      */
/*  returns df							      */
/*								      */
/* No error is possible, and no status can be set.		      */
/* ------------------------------------------------------------------ */
decFloat * decFloatZero(decFloat *df){
  DFWORD(df, 0)=ZEROWORD;     /* set appropriate top word */
  #if DOUBLE || QUAD
    DFWORD(df, 1)=0;
    #if QUAD
      DFWORD(df, 2)=0;
      DFWORD(df, 3)=0;
    #endif
  #endif
  /* decFloatShow(df, "zero"); */
  return df;
  } /* decFloatZero */

/* ------------------------------------------------------------------ */
/* Private generic function (not format-specific) for development use */
/* ------------------------------------------------------------------ */
/* This is included once only, for all to use */
#if QUAD && (DECCHECK || DECTRACE)
  /* ---------------------------------------------------------------- */
  /* decShowNum -- display bcd8 number in debug form		      */
  /*								      */
  /*   num is the bcdnum to display				      */
  /*   tag is a string to label the display			      */
  /* ---------------------------------------------------------------- */
  void decShowNum(const bcdnum *num, const char *tag) {
    const char *csign="+";		/* sign character */
    uByte *ub;				/* work */
    uInt  uiwork;			/* for macros */
    if (num->sign==DECFLOAT_Sign) csign="-";

    printf(">%s> ", tag);
    if (num->exponent==DECFLOAT_Inf) printf("%sInfinity", csign);
    else if (num->exponent==DECFLOAT_qNaN) printf("%sqNaN", csign);
    else if (num->exponent==DECFLOAT_sNaN) printf("%ssNaN", csign);
    else {				/* finite */
     char qbuf[10];			/* for right-aligned q */
     char *c;				/* work */
     const uByte *u;			/* .. */
     Int e=num->exponent;		/* .. exponent */
     strcpy(qbuf, "q=");
     c=&qbuf[2];			/* where exponent will go */
     /* lay out the exponent */
     if (e<0) {
       *c++='-';			/* add '-' */
       e=-e;				/* uInt, please */
       }
     #if DECEMAXD>4
       #error Exponent form is too long for ShowNum to lay out
     #endif
     if (e==0) *c++='0';		/* 0-length case */
      else if (e<1000) {		/* 3 (or fewer) digits case */
       u=&BIN2BCD8[e*4];		/* -> 3 digits + length byte */
       UBFROMUI(c, UBTOUI(u+3-*(u+3))|CHARMASK); /* [as above] */
       c+=*(u+3);			/* bump pointer appropriately */
       }
      else {				/* 4-digits */
       Int thou=((e>>3)*1049)>>17;	/* e/1000 */
       Int rem=e-(1000*thou);		/* e%1000 */
       *c++=(char)('0'+(char)thou);	/* the thousands digit */
       u=&BIN2BCD8[rem*4];		/* -> 3 digits + length byte */
       UBFROMUI(c, UBTOUI(u)|CHARMASK); /* copy fixed 3+1 characters [is safe] */
       c+=3;				/* bump pointer, always 3 digits */
       }
     *c='\0';				/* add terminator */
     printf("%7s c=%s", qbuf, csign);
     }

    if (!EXPISSPECIAL(num->exponent) || num->msd!=num->lsd || *num->lsd!=0) {
      for (ub=num->msd; ub<=num->lsd; ub++) { /* coefficient... */
	printf("%1x", *ub);
	if ((num->lsd-ub)%3==0 && ub!=num->lsd) printf(" "); /* 4-space */
	}
      }
    printf("\n");
    } /* decShowNum */
#endif
