/* Decimal number arithmetic module for the decNumber C Library.
   Copyright (C) 2005, 2007 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 2, or (at your option) any later
   version.

   In addition to the permissions in the GNU General Public License,
   the Free Software Foundation gives you unlimited permission to link
   the compiled version of this file into combinations with other
   programs, and to distribute those combinations without any
   restriction coming from the use of this file.  (The General Public
   License restrictions do apply in other respects; for example, they
   cover modification of the file, and distribution when not linked
   into a combine executable.)

   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.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301, USA.  */

/* ------------------------------------------------------------------ */
/* Decimal Number arithmetic module				      */
/* ------------------------------------------------------------------ */
/* This module comprises the routines for General Decimal Arithmetic  */
/* as defined in the specification which may be found on the	      */
/* http://www2.hursley.ibm.com/decimal web pages.  It implements both */
/* the full ('extended') arithmetic and the simpler ('subset')	      */
/* arithmetic.							      */
/*								      */
/* Usage notes:							      */
/*								      */
/* 1. This code is ANSI C89 except:				      */
/*								      */
/*       If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and	      */
/*	 uint64_t types may be used.  To avoid these, set DECUSE64=0  */
/*	 and DECDPUN<=4 (see documentation).			      */
/*								      */
/* 2. The decNumber format which this library uses is optimized for   */
/*    efficient processing of relatively short numbers; in particular */
/*    it allows the use of fixed sized structures and minimizes copy  */
/*    and move operations.  It does, however, support arbitrary	      */
/*    precision (up to 999,999,999 digits) and arbitrary exponent     */
/*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
/*    range -999,999,999 through 0).  Mathematical functions (for     */
/*    example decNumberExp) as identified below are restricted more   */
/*    tightly: digits, emax, and -emin in the context must be <=      */
/*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
/*    these bounds.						      */
/*								      */
/* 3. Logical functions are further restricted; their operands must   */
/*    be finite, positive, have an exponent of zero, and all digits   */
/*    must be either 0 or 1.  The result will only contain digits     */
/*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
/*								      */
/* 4. Operands to operator functions are never modified unless they   */
/*    are also specified to be the result number (which is always     */
/*    permitted).  Other than that case, operands must not overlap.   */
/*								      */
/* 5. Error handling: the type of the error is ORed into the status   */
/*    flags in the current context (decContext structure).  The	      */
/*    SIGFPE signal is then raised if the corresponding trap-enabler  */
/*    flag in the decContext is set (is 1).			      */
/*								      */
/*    It is the responsibility of the caller to clear the status      */
/*    flags as required.					      */
/*								      */
/*    The result of any routine which returns a number will always    */
/*    be a valid number (which may be a special value, such as an     */
/*    Infinity or NaN).						      */
/*								      */
/* 6. The decNumber format is not an exchangeable concrete	      */
/*    representation as it comprises fields which may be machine-     */
/*    dependent (packed or unpacked, or special length, for example). */
/*    Canonical conversions to and from strings are provided; other   */
/*    conversions are available in separate modules.		      */
/*								      */
/* 7. Normally, input operands are assumed to be valid.	 Set DECCHECK */
/*    to 1 for extended operand checking (including NULL operands).   */
/*    Results are undefined if a badly-formed structure (or a NULL    */
/*    pointer to a structure) is provided, though with DECCHECK	      */
/*    enabled the operator routines are protected against exceptions. */
/*    (Except if the result pointer is NULL, which is unrecoverable.) */
/*								      */
/*    However, the routines will never cause exceptions if they are   */
/*    given well-formed operands, even if the value of the operands   */
/*    is inappropriate for the operation and DECCHECK is not set.     */
/*    (Except for SIGFPE, as and where documented.)		      */
/*								      */
/* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
/* ------------------------------------------------------------------ */
/* Implementation notes for maintenance of this module:		      */
/*								      */
/* 1. Storage leak protection:	Routines which use malloc are not     */
/*    permitted to use return for fastpath or error exits (i.e.,      */
/*    they follow strict structured programming conventions).	      */
/*    Instead they have a do{}while(0); construct surrounding the     */
/*    code which is protected -- break may be used to exit this.      */
/*    Other routines can safely use the return statement inline.      */
/*								      */
/*    Storage leak accounting can be enabled using DECALLOC.	      */
/*								      */
/* 2. All loops use the for(;;) construct.  Any do construct does     */
/*    not loop; it is for allocation protection as just described.    */
/*								      */
/* 3. Setting status in the context must always be the very last      */
/*    action in a routine, as non-0 status may raise a trap and hence */
/*    the call to set status may not return (if the handler uses long */
/*    jump).  Therefore all cleanup must be done first.	 In general,  */
/*    to achieve this status is accumulated and is only applied just  */
/*    before return by calling decContextSetStatus (via decStatus).   */
/*								      */
/*    Routines which allocate storage cannot, in general, use the     */
/*    'top level' routines which could cause a non-returning	      */
/*    transfer of control.  The decXxxxOp routines are safe (do not   */
/*    call decStatus even if traps are set in the context) and should */
/*    be used instead (they are also a little faster).		      */
/*								      */
/* 4. Exponent checking is minimized by allowing the exponent to      */
/*    grow outside its limits during calculations, provided that      */
/*    the decFinalize function is called later.	 Multiplication and   */
/*    division, and intermediate calculations in exponentiation,      */
/*    require more careful checks because of the risk of 31-bit	      */
/*    overflow (the most negative valid exponent is -1999999997, for  */
/*    a 999999999-digit number with adjusted exponent of -999999999). */
/*								      */
/* 5. Rounding is deferred until finalization of results, with any    */
/*    'off to the right' data being represented as a single digit     */
/*    residue (in the range -1 through 9).  This avoids any double-   */
/*    rounding when more than one shortening takes place (for	      */
/*    example, when a result is subnormal).			      */
/*								      */
/* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
/*    during many operations, so whole Units are handled and exact    */
/*    accounting of digits is not needed.  The correct digits value   */
/*    is found by decGetDigits, which accounts for leading zeros.     */
/*    This must be called before any rounding if the number of digits */
/*    is not known exactly.					      */
/*								      */
/* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
/*    numbers up to four digits, using appropriate constants.  This   */
/*    is not useful for longer numbers because overflow of 32 bits    */
/*    would lead to 4 multiplies, which is almost as expensive as     */
/*    a divide (unless a floating-point or 64-bit multiply is	      */
/*    assumed to be available).					      */
/*								      */
/* 8. Unusual abbreviations that may be used in the commentary:	      */
/*	lhs -- left hand side (operand, of an operation)	      */
/*	lsd -- least significant digit (of coefficient)		      */
/*	lsu -- least significant Unit (of coefficient)		      */
/*	msd -- most significant digit (of coefficient)		      */
/*	msi -- most significant item (in an array)		      */
/*	msu -- most significant Unit (of coefficient)		      */
/*	rhs -- right hand side (operand, of an operation)	      */
/*	+ve -- positive						      */
/*	-ve -- negative						      */
/*	**  -- raise to the power				      */
/* ------------------------------------------------------------------ */

#include <stdlib.h>		   /* for malloc, free, etc. */
#include <stdio.h>		   /* for printf [if needed] */
#include <string.h>		   /* for strcpy */
#include <ctype.h>		   /* for lower */
#include "config.h"		   /* for GCC definitions */
#include "decNumber.h"		   /* base number library */
#include "decNumberLocal.h"	   /* decNumber local types, etc. */

/* Constants */
/* Public lookup table used by the D2U macro */
const uByte d2utable[DECMAXD2U+1]=D2UTABLE;

#define DECVERB	    1		   /* set to 1 for verbose DECCHECK */
#define powers	    DECPOWERS	   /* old internal name */

/* Local constants */
#define DIVIDE	    0x80	   /* Divide operators */
#define REMAINDER   0x40	   /* .. */
#define DIVIDEINT   0x20	   /* .. */
#define REMNEAR	    0x10	   /* .. */
#define COMPARE	    0x01	   /* Compare operators */
#define COMPMAX	    0x02	   /* .. */
#define COMPMIN	    0x03	   /* .. */
#define COMPTOTAL   0x04	   /* .. */
#define COMPNAN	    0x05	   /* .. [NaN processing] */
#define COMPSIG	    0x06	   /* .. [signaling COMPARE] */
#define COMPMAXMAG  0x07	   /* .. */
#define COMPMINMAG  0x08	   /* .. */

#define DEC_sNaN     0x40000000	   /* local status: sNaN signal */
#define BADINT	(Int)0x80000000	   /* most-negative Int; error indicator */
/* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
#define BIGEVEN (Int)0x80000002
#define BIGODD	(Int)0x80000003

static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */

/* Granularity-dependent code */
#if DECDPUN<=4
  #define eInt	Int	      /* extended integer */
  #define ueInt uInt	      /* unsigned extended integer */
  /* Constant multipliers for divide-by-power-of five using reciprocal */
  /* multiply, after removing powers of 2 by shifting, and final shift */
  /* of 17 [we only need up to **4] */
  static const uInt multies[]={131073, 26215, 5243, 1049, 210};
  /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
#else
  /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
  #if !DECUSE64
    #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
  #endif
  #define eInt	Long	      /* extended integer */
  #define ueInt uLong	      /* unsigned extended integer */
#endif

/* Local routines */
static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
			      decContext *, uByte, uInt *);
static Flag	   decBiStr(const char *, const char *, const char *);
static uInt	   decCheckMath(const decNumber *, decContext *, uInt *);
static void	   decApplyRound(decNumber *, decContext *, Int, uInt *);
static Int	   decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
static decNumber * decCompareOp(decNumber *, const decNumber *,
			      const decNumber *, decContext *,
			      Flag, uInt *);
static void	   decCopyFit(decNumber *, const decNumber *, decContext *,
			      Int *, uInt *);
static decNumber * decDecap(decNumber *, Int);
static decNumber * decDivideOp(decNumber *, const decNumber *,
			      const decNumber *, decContext *, Flag, uInt *);
static decNumber * decExpOp(decNumber *, const decNumber *,
			      decContext *, uInt *);
static void	   decFinalize(decNumber *, decContext *, Int *, uInt *);
static Int	   decGetDigits(Unit *, Int);
static Int	   decGetInt(const decNumber *);
static decNumber * decLnOp(decNumber *, const decNumber *,
			      decContext *, uInt *);
static decNumber * decMultiplyOp(decNumber *, const decNumber *,
			      const decNumber *, decContext *,
			      uInt *);
static decNumber * decNaNs(decNumber *, const decNumber *,
			      const decNumber *, decContext *, uInt *);
static decNumber * decQuantizeOp(decNumber *, const decNumber *,
			      const decNumber *, decContext *, Flag,
			      uInt *);
static void	   decReverse(Unit *, Unit *);
static void	   decSetCoeff(decNumber *, decContext *, const Unit *,
			      Int, Int *, uInt *);
static void	   decSetMaxValue(decNumber *, decContext *);
static void	   decSetOverflow(decNumber *, decContext *, uInt *);
static void	   decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
static Int	   decShiftToLeast(Unit *, Int, Int);
static Int	   decShiftToMost(Unit *, Int, Int);
static void	   decStatus(decNumber *, uInt, decContext *);
static void	   decToString(const decNumber *, char[], Flag);
static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
static Int	   decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
			      Unit *, Int);
static Int	   decUnitCompare(const Unit *, Int, const Unit *, Int, Int);

#if !DECSUBSET
/* decFinish == decFinalize when no subset arithmetic needed */
#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
#else
static void	   decFinish(decNumber *, decContext *, Int *, uInt *);
static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
#endif

/* Local macros */
/* masked special-values bits */
#define SPECIALARG  (rhs->bits & DECSPECIAL)
#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)

/* Diagnostic macros, etc. */
#if DECALLOC
/* Handle malloc/free accounting.  If enabled, our accountable routines */
/* are used; otherwise the code just goes straight to the system malloc */
/* and free routines. */
#define malloc(a) decMalloc(a)
#define free(a) decFree(a)
#define DECFENCE 0x5a		   /* corruption detector */
/* 'Our' malloc and free: */
static void *decMalloc(size_t);
static void  decFree(void *);
uInt decAllocBytes=0;		   /* count of bytes allocated */
/* Note that DECALLOC code only checks for storage buffer overflow. */
/* To check for memory leaks, the decAllocBytes variable must be */
/* checked to be 0 at appropriate times (e.g., after the test */
/* harness completes a set of tests).  This checking may be unreliable */
/* if the testing is done in a multi-thread environment. */
#endif

#if DECCHECK
/* Optional checking routines.	Enabling these means that decNumber */
/* and decContext operands to operator routines are checked for */
/* correctness.	 This roughly doubles the execution time of the */
/* fastest routines (and adds 600+ bytes), so should not normally be */
/* used in 'production'. */
/* decCheckInexact is used to check that inexact results have a full */
/* complement of digits (where appropriate -- this is not the case */
/* for Quantize, for example) */
#define DECUNRESU ((decNumber *)(void *)0xffffffff)
#define DECUNUSED ((const decNumber *)(void *)0xffffffff)
#define DECUNCONT ((decContext *)(void *)(0xffffffff))
static Flag decCheckOperands(decNumber *, const decNumber *,
			     const decNumber *, decContext *);
static Flag decCheckNumber(const decNumber *);
static void decCheckInexact(const decNumber *, decContext *);
#endif

#if DECTRACE || DECCHECK
/* Optional trace/debugging routines (may or may not be used) */
void decNumberShow(const decNumber *);	/* displays the components of a number */
static void decDumpAr(char, const Unit *, Int);
#endif

/* ================================================================== */
/* Conversions							      */
/* ================================================================== */

/* ------------------------------------------------------------------ */
/* from-int32 -- conversion from Int or uInt			      */
/*								      */
/*  dn is the decNumber to receive the integer			      */
/*  in or uin is the integer to be converted			      */
/*  returns dn							      */
/*								      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
decNumber * decNumberFromInt32(decNumber *dn, Int in) {
  uInt unsig;
  if (in>=0) unsig=in;
   else {				/* negative (possibly BADINT) */
    if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
     else unsig=-in;			/* invert */
    }
  /* in is now positive */
  decNumberFromUInt32(dn, unsig);
  if (in<0) dn->bits=DECNEG;		/* sign needed */
  return dn;
  } /* decNumberFromInt32 */

decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
  Unit *up;				/* work pointer */
  decNumberZero(dn);			/* clean */
  if (uin==0) return dn;		/* [or decGetDigits bad call] */
  for (up=dn->lsu; uin>0; up++) {
    *up=(Unit)(uin%(DECDPUNMAX+1));
    uin=uin/(DECDPUNMAX+1);
    }
  dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
  return dn;
  } /* decNumberFromUInt32 */

/* ------------------------------------------------------------------ */
/* to-int32 -- conversion to Int or uInt			      */
/*								      */
/*  dn is the decNumber to convert				      */
/*  set is the context for reporting errors			      */
/*  returns the converted decNumber, or 0 if Invalid is set	      */
/*								      */
/* Invalid is set if the decNumber does not have exponent==0 or if    */
/* it is a NaN, Infinite, or out-of-range.			      */
/* ------------------------------------------------------------------ */
Int decNumberToInt32(const decNumber *dn, decContext *set) {
  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
  #endif

  /* special or too many digits, or bad exponent */
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
   else { /* is a finite integer with 10 or fewer digits */
    Int d;			   /* work */
    const Unit *up;		   /* .. */
    uInt hi=0, lo;		   /* .. */
    up=dn->lsu;			   /* -> lsu */
    lo=*up;			   /* get 1 to 9 digits */
    #if DECDPUN>1		   /* split to higher */
      hi=lo/10;
      lo=lo%10;
    #endif
    up++;
    /* collect remaining Units, if any, into hi */
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    /* now low has the lsd, hi the remainder */
    if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
      /* most-negative is a reprieve */
      if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
      /* bad -- drop through */
      }
     else { /* in-range always */
      Int i=X10(hi)+lo;
      if (dn->bits&DECNEG) return -i;
      return i;
      }
    } /* integer */
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
  return 0;
  } /* decNumberToInt32 */

uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
  #endif
  /* special or too many digits, or bad exponent, or negative (<0) */
  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
    || (dn->bits&DECNEG && !ISZERO(dn)));		    /* bad */
   else { /* is a finite integer with 10 or fewer digits */
    Int d;			   /* work */
    const Unit *up;		   /* .. */
    uInt hi=0, lo;		   /* .. */
    up=dn->lsu;			   /* -> lsu */
    lo=*up;			   /* get 1 to 9 digits */
    #if DECDPUN>1		   /* split to higher */
      hi=lo/10;
      lo=lo%10;
    #endif
    up++;
    /* collect remaining Units, if any, into hi */
    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];

    /* now low has the lsd, hi the remainder */
    if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
     else return X10(hi)+lo;
    } /* integer */
  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
  return 0;
  } /* decNumberToUInt32 */

/* ------------------------------------------------------------------ */
/* to-scientific-string -- conversion to numeric string		      */
/* to-engineering-string -- conversion to numeric string	      */
/*								      */
/*   decNumberToString(dn, string);				      */
/*   decNumberToEngString(dn, string);				      */
/*								      */
/*  dn is the decNumber to convert				      */
/*  string is the string where the result will be laid out	      */
/*								      */
/*  string must be at least dn->digits+14 characters long	      */
/*								      */
/*  No error is possible, and no status can be set.		      */
/* ------------------------------------------------------------------ */
char * decNumberToString(const decNumber *dn, char *string){
  decToString(dn, string, 0);
  return string;
  } /* DecNumberToString */

char * decNumberToEngString(const decNumber *dn, char *string){
  decToString(dn, string, 1);
  return string;
  } /* DecNumberToEngString */

/* ------------------------------------------------------------------ */
/* to-number -- conversion from numeric string			      */
/*								      */
/* decNumberFromString -- convert string to decNumber		      */
/*   dn	       -- the number structure to fill			      */
/*   chars[]   -- the string to convert ('\0' terminated)	      */
/*   set       -- the context used for processing any error,	      */
/*		  determining the maximum precision available	      */
/*		  (set.digits), determining the maximum and minimum   */
/*		  exponent (set.emax and set.emin), determining if    */
/*		  extended values are allowed, and checking the	      */
/*		  rounding mode if overflow occurs or rounding is     */
/*		  needed.					      */
/*								      */
/* 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.	      */
/*								      */
/* If bad syntax is detected, the result will be a quiet NaN.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberFromString(decNumber *dn, const char chars[],
				decContext *set) {
  Int	exponent=0;		   /* working exponent [assume 0] */
  uByte bits=0;			   /* working flags [assume +ve] */
  Unit	*res;			   /* where result will be built */
  Unit	resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
				   /* [+9 allows for ln() constants] */
  Unit	*allocres=NULL;		   /* -> allocated result, iff allocated */
  Int	d=0;			   /* count of digits found in decimal part */
  const char *dotchar=NULL;	   /* where dot was found */
  const char *cfirst=chars;	   /* -> first character of decimal part */
  const char *last=NULL;	   /* -> last digit of decimal part */
  const char *c;		   /* work */
  Unit	*up;			   /* .. */
  #if DECDPUN>1
  Int	cut, out;		   /* .. */
  #endif
  Int	residue;		   /* rounding residue */
  uInt	status=0;		   /* error code */

  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
    return decNumberZero(dn);
  #endif

  do {				   /* status & malloc protection */
    for (c=chars;; c++) {	   /* -> input character */
      if (*c>='0' && *c<='9') {	   /* test for Arabic digit */
	last=c;
	d++;			   /* count of real digits */
	continue;		   /* still in decimal part */
	}
      if (*c=='.' && dotchar==NULL) { /* first '.' */
	dotchar=c;		   /* record offset into decimal part */
	if (c==cfirst) cfirst++;   /* first digit must follow */
	continue;}
      if (c==chars) {		   /* first in string... */
	if (*c=='-') {		   /* valid - sign */
	  cfirst++;
	  bits=DECNEG;
	  continue;}
	if (*c=='+') {		   /* valid + sign */
	  cfirst++;
	  continue;}
	}
      /* *c is not a digit, or a valid +, -, or '.' */
      break;
      } /* c */

    if (last==NULL) {		   /* no digits yet */
      status=DEC_Conversion_syntax;/* assume the worst */
      if (*c=='\0') break;	   /* and no more to come... */
      #if DECSUBSET
      /* if subset then infinities and NaNs are not allowed */
      if (!set->extended) break;   /* hopeless */
      #endif
      /* Infinities and NaNs are possible, here */
      if (dotchar!=NULL) break;	   /* .. unless had a dot */
      decNumberZero(dn);	   /* be optimistic */
      if (decBiStr(c, "infinity", "INFINITY")
       || decBiStr(c, "inf", "INF")) {
	dn->bits=bits | DECINF;
	status=0;		   /* is OK */
	break; /* all done */
	}
      /* a NaN expected */
      /* 2003.09.10 NaNs are now permitted to have a sign */
      dn->bits=bits | DECNAN;	   /* assume simple NaN */
      if (*c=='s' || *c=='S') {	   /* looks like an sNaN */
	c++;
	dn->bits=bits | DECSNAN;
	}
      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, expected */
      /* -> start of integer and skip leading 0s [including plain 0] */
      for (cfirst=c; *cfirst=='0';) cfirst++;
      if (*cfirst=='\0') {	   /* "NaN" or "sNaN", maybe with all 0s */
	status=0;		   /* it's good */
	break;			   /* .. */
	}
      /* something other than 0s; setup last and d as usual [no dots] */
      for (c=cfirst;; c++, d++) {
	if (*c<'0' || *c>'9') break; /* test for Arabic digit */
	last=c;
	}
      if (*c!='\0') break;	   /* not all digits */
      if (d>set->digits-1) {
	/* [NB: payload in a decNumber can be full length unless */
	/* clamped, in which case can only be digits-1] */
	if (set->clamp) break;
	if (d>set->digits) break;
	} /* too many digits? */
      /* good; drop through to convert the integer to coefficient */
      status=0;			   /* syntax is OK */
      bits=dn->bits;		   /* for copy-back */
      } /* last==NULL */

     else if (*c!='\0') {	   /* more to process... */
      /* had some digits; exponent is only valid sequence now */
      Flag nege;		   /* 1=negative exponent */
      const char *firstexp;	   /* -> first significant exponent digit */
      status=DEC_Conversion_syntax;/* assume the worst */
      if (*c!='e' && *c!='E') break;
      /* Found 'e' or 'E' -- now process explicit exponent */
      /* 1998.07.11: sign no longer required */
      nege=0;
      c++;			   /* to (possible) sign */
      if (*c=='-') {nege=1; c++;}
       else if (*c=='+') c++;
      if (*c=='\0') break;

      for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
      firstexp=c;			     /* save exponent digit place */
      for (; ;c++) {
	if (*c<'0' || *c>'9') break;	     /* not a digit */
	exponent=X10(exponent)+(Int)*c-(Int)'0';
	} /* c */
      /* if not now on a '\0', *c must not be a digit */
      if (*c!='\0') break;

      /* (this next test must be after the syntax checks) */
      /* if it was too long the exponent may have wrapped, so check */
      /* carefully and set it to a certain overflow if wrap possible */
      if (c>=firstexp+9+1) {
	if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
	/* [up to 1999999999 is OK, for example 1E-1000000998] */
	}
      if (nege) exponent=-exponent;	/* was negative */
      status=0;				/* is OK */
      } /* stuff after digits */

    /* Here when whole string has been inspected; syntax is good */
    /* cfirst->first digit (never dot), last->last digit (ditto) */

    /* strip leading zeros/dot [leave final 0 if all 0's] */
    if (*cfirst=='0') {			/* [cfirst has stepped over .] */
      for (c=cfirst; c<last; c++, cfirst++) {
	if (*c=='.') continue;		/* ignore dots */
	if (*c!='0') break;		/* non-zero found */
	d--;				/* 0 stripped */
	} /* c */
      #if DECSUBSET
      /* make a rapid exit for easy zeros if !extended */
      if (*cfirst=='0' && !set->extended) {
	decNumberZero(dn);		/* clean result */
	break;				/* [could be return] */
	}
      #endif
      } /* at least one leading 0 */

    /* Handle decimal point... */
    if (dotchar!=NULL && dotchar<last)	/* non-trailing '.' found? */
      exponent-=(last-dotchar);		/* adjust exponent */
    /* [we can now ignore the .] */

    /* OK, the digits string is good.  Assemble in the decNumber, or in */
    /* a temporary units array if rounding is needed */
    if (d<=set->digits) res=dn->lsu;	/* fits into supplied decNumber */
     else {				/* rounding needed */
      Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
      res=resbuff;			/* assume use local buffer */
      if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
	allocres=(Unit *)malloc(needbytes);
	if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
	res=allocres;
	}
      }
    /* res now -> number lsu, buffer, or allocated storage for Unit array */

    /* Place the coefficient into the selected Unit array */
    /* [this is often 70% of the cost of this function when DECDPUN>1] */
    #if DECDPUN>1
    out=0;			   /* accumulator */
    up=res+D2U(d)-1;		   /* -> msu */
    cut=d-(up-res)*DECDPUN;	   /* digits in top unit */
    for (c=cfirst;; c++) {	   /* along the digits */
      if (*c=='.') continue;	   /* ignore '.' [don't decrement cut] */
      out=X10(out)+(Int)*c-(Int)'0';
      if (c==last) break;	   /* done [never get to trailing '.'] */
      cut--;
      if (cut>0) continue;	   /* more for this unit */
      *up=(Unit)out;		   /* write unit */
      up--;			   /* prepare for unit below.. */
      cut=DECDPUN;		   /* .. */
      out=0;			   /* .. */
      } /* c */
    *up=(Unit)out;		   /* write lsu */

    #else
    /* DECDPUN==1 */
    up=res;			   /* -> lsu */
    for (c=last; c>=cfirst; c--) { /* over each character, from least */
      if (*c=='.') continue;	   /* ignore . [don't step up] */
      *up=(Unit)((Int)*c-(Int)'0');
      up++;
      } /* c */
    #endif

    dn->bits=bits;
    dn->exponent=exponent;
    dn->digits=d;

    /* if not in number (too long) shorten into the number */
    if (d>set->digits) {
      residue=0;
      decSetCoeff(dn, set, res, d, &residue, &status);
      /* always check for overflow or subnormal and round as needed */
      decFinalize(dn, set, &residue, &status);
      }
     else { /* no rounding, but may still have overflow or subnormal */
      /* [these tests are just for performance; finalize repeats them] */
      if ((dn->exponent-1<set->emin-dn->digits)
       || (dn->exponent-1>set->emax-set->digits)) {
	residue=0;
	decFinalize(dn, set, &residue, &status);
	}
      }
    /* decNumberShow(dn); */
    } while(0);				/* [for break] */

  if (allocres!=NULL) free(allocres);	/* drop any storage used */
  if (status!=0) decStatus(dn, status, set);
  return dn;
  } /* decNumberFromString */

/* ================================================================== */
/* Operators							      */
/* ================================================================== */

/* ------------------------------------------------------------------ */
/* decNumberAbs -- absolute value operator			      */
/*								      */
/*   This computes C = abs(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* See also decNumberCopyAbs for a quiet bitwise version of this.     */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* This has the same effect as decNumberPlus unless A is negative,    */
/* in which case it has the same effect as decNumberMinus.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
			 decContext *set) {
  decNumber dzero;			/* for 0 */
  uInt status=0;			/* accumulator */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  decNumberZero(&dzero);		/* set 0 */
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
  decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberAbs */

/* ------------------------------------------------------------------ */
/* decNumberAdd -- add two Numbers				      */
/*								      */
/*   This computes C = A + B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* This just calls the routine shared with Subtract		      */
decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decAddOp(res, lhs, rhs, set, 0, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberAdd */

/* ------------------------------------------------------------------ */
/* decNumberAnd -- AND two Numbers, digitwise			      */
/*								      */
/*   This computes C = A & B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X&X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context (used for result length and error report)     */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Logical function restrictions apply (see above); a NaN is	      */
/* returned with Invalid_operation if a restriction is violated.      */
/* ------------------------------------------------------------------ */
decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  const Unit *ua, *ub;			/* -> operands */
  const Unit *msua, *msub;		/* -> operand msus */
  Unit *uc,  *msuc;			/* -> result and its msu */
  Int	msudigs;			/* digits in res msu */
  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    decStatus(res, DEC_Invalid_operation, set);
    return res;
    }

  /* operands are valid */
  ua=lhs->lsu;				/* bottom-up */
  ub=rhs->lsu;				/* .. */
  uc=res->lsu;				/* .. */
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
    Unit a, b;				/* extract units */
    if (ua>msua) a=0;
     else a=*ua;
    if (ub>msub) b=0;
     else b=*ub;
    *uc=0;				/* can now write back */
    if (a|b) {				/* maybe 1 bits to examine */
      Int i, j;
      *uc=0;				/* can now write back */
      /* This loop could be unrolled and/or use BIN2BCD tables */
      for (i=0; i<DECDPUN; i++) {
	if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
	j=a%10;
	a=a/10;
	j|=b%10;
	b=b/10;
	if (j>1) {
	  decStatus(res, DEC_Invalid_operation, set);
	  return res;
	  }
	if (uc==msuc && i==msudigs-1) break; /* just did final digit */
	} /* each digit */
      } /* both OK */
    } /* each unit */
  /* [here uc-1 is the msu of the result] */
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
  res->exponent=0;			/* integer */
  res->bits=0;				/* sign=0 */
  return res;  /* [no status to set] */
  } /* decNumberAnd */

/* ------------------------------------------------------------------ */
/* decNumberCompare -- compare two Numbers			      */
/*								      */
/*   This computes C = A ? B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for one digit (or NaN).			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
			     const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPARE, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberCompare */

/* ------------------------------------------------------------------ */
/* decNumberCompareSignal -- compare, signalling on all NaNs	      */
/*								      */
/*   This computes C = A ? B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for one digit (or NaN).			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
				   const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberCompareSignal */

/* ------------------------------------------------------------------ */
/* decNumberCompareTotal -- compare two Numbers, using total ordering */
/*								      */
/*   This computes C = A ? B, under total ordering		      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for one digit; the result will always be one of  */
/* -1, 0, or 1.							      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
				  const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberCompareTotal */

/* ------------------------------------------------------------------ */
/* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
/*								      */
/*   This computes C = |A| ? |B|, under total ordering		      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for one digit; the result will always be one of  */
/* -1, 0, or 1.							      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
				     const decNumber *rhs, decContext *set) {
  uInt status=0;		   /* accumulator */
  uInt needbytes;		   /* for space calculations */
  decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber bufb[D2N(DECBUFFER+1)];
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
  decNumber *a, *b;		   /* temporary pointers */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {					/* protect allocated storage */
    /* if either is negative, take a copy and absolute */
    if (decNumberIsNegative(lhs)) {	/* lhs<0 */
      a=bufa;
      needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
      if (needbytes>sizeof(bufa)) {	/* need malloc space */
	allocbufa=(decNumber *)malloc(needbytes);
	if (allocbufa==NULL) {		/* hopeless -- abandon */
	  status|=DEC_Insufficient_storage;
	  break;}
	a=allocbufa;			/* use the allocated space */
	}
      decNumberCopy(a, lhs);		/* copy content */
      a->bits&=~DECNEG;			/* .. and clear the sign */
      lhs=a;				/* use copy from here on */
      }
    if (decNumberIsNegative(rhs)) {	/* rhs<0 */
      b=bufb;
      needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
      if (needbytes>sizeof(bufb)) {	/* need malloc space */
	allocbufb=(decNumber *)malloc(needbytes);
	if (allocbufb==NULL) {		/* hopeless -- abandon */
	  status|=DEC_Insufficient_storage;
	  break;}
	b=allocbufb;			/* use the allocated space */
	}
      decNumberCopy(b, rhs);		/* copy content */
      b->bits&=~DECNEG;			/* .. and clear the sign */
      rhs=b;				/* use copy from here on */
      }
    decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
    } while(0);				/* end protected */

  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
  if (allocbufb!=NULL) free(allocbufb); /* .. */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberCompareTotalMag */

/* ------------------------------------------------------------------ */
/* decNumberDivide -- divide one number by another		      */
/*								      */
/*   This computes C = A / B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
			    const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberDivide */

/* ------------------------------------------------------------------ */
/* decNumberDivideInteger -- divide and return integer quotient	      */
/*								      */
/*   This computes C = A # B, where # is the integer divide operator  */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X#X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
				   const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberDivideInteger */

/* ------------------------------------------------------------------ */
/* decNumberExp -- exponentiation				      */
/*								      */
/*   This computes C = exp(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Mathematical function restrictions apply (see above); a NaN is     */
/* returned with Invalid_operation if a restriction is violated.      */
/*								      */
/* Finite results will always be full precision and Inexact, except   */
/* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
/*								      */
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/* ------------------------------------------------------------------ */
/* This is a wrapper for decExpOp which can handle the slightly wider */
/* (double) range needed by Ln (which has to be able to calculate     */
/* exp(-a) where a can be the tiniest number (Ntiny).		      */
/* ------------------------------------------------------------------ */
decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
			 decContext *set) {
  uInt status=0;			/* accumulator */
  #if DECSUBSET
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
  #endif

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* Check restrictions; these restrictions ensure that if h=8 (see */
  /* decExpOp) then the result will either overflow or underflow to 0. */
  /* Other math functions restrict the input range, too, for inverses. */
  /* If not violated then carry out the operation. */
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operand and set lostDigits status, as needed */
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    decExpOp(res, rhs, set, &status);
    } while(0);				/* end protected */

  #if DECSUBSET
  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
  #endif
  /* apply significant status */
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberExp */

/* ------------------------------------------------------------------ */
/* decNumberFMA -- fused multiply add				      */
/*								      */
/*   This computes D = (A * B) + C with only one rounding	      */
/*								      */
/*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
/*   lhs is A							      */
/*   rhs is B							      */
/*   fhs is C [far hand side]					      */
/*   set is the context						      */
/*								      */
/* Mathematical function restrictions apply (see above); a NaN is     */
/* returned with Invalid_operation if a restriction is violated.      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, const decNumber *fhs,
			 decContext *set) {
  uInt status=0;		   /* accumulator */
  decContext dcmul;		   /* context for the multiplication */
  uInt needbytes;		   /* for space calculations */
  decNumber bufa[D2N(DECBUFFER*2+1)];
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *acc;		   /* accumulator pointer */
  decNumber dzero;		   /* work */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
  #endif

  do {					/* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {		/* [undefined if subset] */
      status|=DEC_Invalid_operation;
      break;}
    #endif
    /* Check math restrictions [these ensure no overflow or underflow] */
    if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
     || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
     || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
    /* set up context for multiply */
    dcmul=*set;
    dcmul.digits=lhs->digits+rhs->digits; /* just enough */
    /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
    dcmul.emax=DEC_MAX_EMAX;		/* effectively unbounded .. */
    dcmul.emin=DEC_MIN_EMIN;		/* [thanks to Math restrictions] */
    /* set up decNumber space to receive the result of the multiply */
    acc=bufa;				/* may fit */
    needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
    if (needbytes>sizeof(bufa)) {	/* need malloc space */
      allocbufa=(decNumber *)malloc(needbytes);
      if (allocbufa==NULL) {		/* hopeless -- abandon */
	status|=DEC_Insufficient_storage;
	break;}
      acc=allocbufa;			/* use the allocated space */
      }
    /* multiply with extended range and necessary precision */
    /*printf("emin=%ld\n", dcmul.emin); */
    decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
    /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
    /* status; if either is seen than ignore fhs (in case it is */
    /* another sNaN) and set acc to NaN unless we had an sNaN */
    /* [decMultiplyOp leaves that to caller] */
    /* Note sNaN has to go through addOp to shorten payload if */
    /* necessary */
    if ((status&DEC_Invalid_operation)!=0) {
      if (!(status&DEC_sNaN)) {		/* but be true invalid */
	decNumberZero(res);		/* acc not yet set */
	res->bits=DECNAN;
	break;
	}
      decNumberZero(&dzero);		/* make 0 (any non-NaN would do) */
      fhs=&dzero;			/* use that */
      }
    #if DECCHECK
     else { /* multiply was OK */
      if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
      }
    #endif
    /* add the third operand and result -> res, and all is done */
    decAddOp(res, acc, fhs, set, 0, &status);
    } while(0);				/* end protected */

  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberFMA */

/* ------------------------------------------------------------------ */
/* decNumberInvert -- invert a Number, digitwise		      */
/*								      */
/*   This computes C = ~A					      */
/*								      */
/*   res is C, the result.  C may be A (e.g., X=~X)		      */
/*   rhs is A							      */
/*   set is the context (used for result length and error report)     */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Logical function restrictions apply (see above); a NaN is	      */
/* returned with Invalid_operation if a restriction is violated.      */
/* ------------------------------------------------------------------ */
decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
			    decContext *set) {
  const Unit *ua, *msua;		/* -> operand and its msu */
  Unit	*uc, *msuc;			/* -> result and its msu */
  Int	msudigs;			/* digits in res msu */
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    decStatus(res, DEC_Invalid_operation, set);
    return res;
    }
  /* operand is valid */
  ua=rhs->lsu;				/* bottom-up */
  uc=res->lsu;				/* .. */
  msua=ua+D2U(rhs->digits)-1;		/* -> msu of rhs */
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
  for (; uc<=msuc; ua++, uc++) {	/* Unit loop */
    Unit a;				/* extract unit */
    Int	 i, j;				/* work */
    if (ua>msua) a=0;
     else a=*ua;
    *uc=0;				/* can now write back */
    /* always need to examine all bits in rhs */
    /* This loop could be unrolled and/or use BIN2BCD tables */
    for (i=0; i<DECDPUN; i++) {
      if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
      j=a%10;
      a=a/10;
      if (j>1) {
	decStatus(res, DEC_Invalid_operation, set);
	return res;
	}
      if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
      } /* each digit */
    } /* each unit */
  /* [here uc-1 is the msu of the result] */
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
  res->exponent=0;			/* integer */
  res->bits=0;				/* sign=0 */
  return res;  /* [no status to set] */
  } /* decNumberInvert */

/* ------------------------------------------------------------------ */
/* decNumberLn -- natural logarithm				      */
/*								      */
/*   This computes C = ln(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Notable cases:						      */
/*   A<0 -> Invalid						      */
/*   A=0 -> -Infinity (Exact)					      */
/*   A=+Infinity -> +Infinity (Exact)				      */
/*   A=1 exactly -> 0 (Exact)					      */
/*								      */
/* Mathematical function restrictions apply (see above); a NaN is     */
/* returned with Invalid_operation if a restriction is violated.      */
/*								      */
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/* ------------------------------------------------------------------ */
/* This is a wrapper for decLnOp which can handle the slightly wider  */
/* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
/* to calculate at p+e+2).					      */
/* ------------------------------------------------------------------ */
decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
			decContext *set) {
  uInt status=0;		   /* accumulator */
  #if DECSUBSET
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
  #endif

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* Check restrictions; this is a math function; if not violated */
  /* then carry out the operation. */
  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operand and set lostDigits status, as needed */
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      /* special check in subset for rhs=0 */
      if (ISZERO(rhs)) {		/* +/- zeros -> error */
	status|=DEC_Invalid_operation;
	break;}
      } /* extended=0 */
    #endif
    decLnOp(res, rhs, set, &status);
    } while(0);				/* end protected */

  #if DECSUBSET
  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
  #endif
  /* apply significant status */
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberLn */

/* ------------------------------------------------------------------ */
/* decNumberLogB - get adjusted exponent, by 754r rules		      */
/*								      */
/*   This computes C = adjustedexponent(A)			      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context, used only for digits and status	      */
/*								      */
/* C must have space for 10 digits (A might have 10**9 digits and     */
/* an exponent of +999999999, or one digit and an exponent of	      */
/* -1999999999).						      */
/*								      */
/* This returns the adjusted exponent of A after (in theory) padding  */
/* with zeros on the right to set->digits digits while keeping the    */
/* same value.	The exponent is not limited by emin/emax.	      */
/*								      */
/* Notable cases:						      */
/*   A<0 -> Use |A|						      */
/*   A=0 -> -Infinity (Division by zero)			      */
/*   A=Infinite -> +Infinity (Exact)				      */
/*   A=1 exactly -> 0 (Exact)					      */
/*   NaNs are propagated as usual				      */
/* ------------------------------------------------------------------ */
decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
			  decContext *set) {
  uInt status=0;		   /* accumulator */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* NaNs as usual; Infinities return +Infinity; 0->oops */
  if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
   else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
   else if (decNumberIsZero(rhs)) {
    decNumberZero(res);			/* prepare for Infinity */
    res->bits=DECNEG|DECINF;		/* -Infinity */
    status|=DEC_Division_by_zero;	/* as per 754r */
    }
   else { /* finite non-zero */
    Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
    decNumberFromInt32(res, ae);	/* lay it out */
    }

  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberLogB */

/* ------------------------------------------------------------------ */
/* decNumberLog10 -- logarithm in base 10			      */
/*								      */
/*   This computes C = log10(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Notable cases:						      */
/*   A<0 -> Invalid						      */
/*   A=0 -> -Infinity (Exact)					      */
/*   A=+Infinity -> +Infinity (Exact)				      */
/*   A=10**n (if n is an integer) -> n (Exact)			      */
/*								      */
/* Mathematical function restrictions apply (see above); a NaN is     */
/* returned with Invalid_operation if a restriction is violated.      */
/*								      */
/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/* ------------------------------------------------------------------ */
/* This calculates ln(A)/ln(10) using appropriate precision.  For     */
/* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
/* requested digits and t is the number of digits in the exponent     */
/* (maximum 6).	 For ln(10) it is p + 3; this is often handled by the */
/* fastpath in decLnOp.	 The final division is done to the requested  */
/* precision.							      */
/* ------------------------------------------------------------------ */
decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
			  decContext *set) {
  uInt status=0, ignore=0;	   /* status accumulators */
  uInt needbytes;		   /* for space calculations */
  Int p;			   /* working precision */
  Int t;			   /* digits in exponent of A */

  /* buffers for a and b working decimals */
  /* (adjustment calculator, same size) */
  decNumber bufa[D2N(DECBUFFER+2)];
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *a=bufa;		   /* temporary a */
  decNumber bufb[D2N(DECBUFFER+2)];
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
  decNumber *b=bufb;		   /* temporary b */
  decNumber bufw[D2N(10)];	   /* working 2-10 digit number */
  decNumber *w=bufw;		   /* .. */
  #if DECSUBSET
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
  #endif

  decContext aset;		   /* working context */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* Check restrictions; this is a math function; if not violated */
  /* then carry out the operation. */
  if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operand and set lostDigits status, as needed */
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      /* special check in subset for rhs=0 */
      if (ISZERO(rhs)) {		/* +/- zeros -> error */
	status|=DEC_Invalid_operation;
	break;}
      } /* extended=0 */
    #endif

    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */

    /* handle exact powers of 10; only check if +ve finite */
    if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
      Int residue=0;		   /* (no residue) */
      uInt copystat=0;		   /* clean status */

      /* round to a single digit... */
      aset.digits=1;
      decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
      /* if exact and the digit is 1, rhs is a power of 10 */
      if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
	/* the exponent, conveniently, is the power of 10; making */
	/* this the result needs a little care as it might not fit, */
	/* so first convert it into the working number, and then move */
	/* to res */
	decNumberFromInt32(w, w->exponent);
	residue=0;
	decCopyFit(res, w, set, &residue, &status); /* copy & round */
	decFinish(res, set, &residue, &status);	    /* cleanup/set flags */
	break;
	} /* not a power of 10 */
      } /* not a candidate for exact */

    /* simplify the information-content calculation to use 'total */
    /* number of digits in a, including exponent' as compared to the */
    /* requested digits, as increasing this will only rarely cost an */
    /* iteration in ln(a) anyway */
    t=6;				/* it can never be >6 */

    /* allocate space when needed... */
    p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
    if (needbytes>sizeof(bufa)) {	/* need malloc space */
      allocbufa=(decNumber *)malloc(needbytes);
      if (allocbufa==NULL) {		/* hopeless -- abandon */
	status|=DEC_Insufficient_storage;
	break;}
      a=allocbufa;			/* use the allocated space */
      }
    aset.digits=p;			/* as calculated */
    aset.emax=DEC_MAX_MATH;		/* usual bounds */
    aset.emin=-DEC_MAX_MATH;		/* .. */
    aset.clamp=0;			/* and no concrete format */
    decLnOp(a, rhs, &aset, &status);	/* a=ln(rhs) */

    /* skip the division if the result so far is infinite, NaN, or */
    /* zero, or there was an error; note NaN from sNaN needs copy */
    if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
    if (a->bits&DECSPECIAL || ISZERO(a)) {
      decNumberCopy(res, a);		/* [will fit] */
      break;}

    /* for ln(10) an extra 3 digits of precision are needed */
    p=set->digits+3;
    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
    if (needbytes>sizeof(bufb)) {	/* need malloc space */
      allocbufb=(decNumber *)malloc(needbytes);
      if (allocbufb==NULL) {		/* hopeless -- abandon */
	status|=DEC_Insufficient_storage;
	break;}
      b=allocbufb;			/* use the allocated space */
      }
    decNumberZero(w);			/* set up 10... */
    #if DECDPUN==1
    w->lsu[1]=1; w->lsu[0]=0;		/* .. */
    #else
    w->lsu[0]=10;			/* .. */
    #endif
    w->digits=2;			/* .. */

    aset.digits=p;
    decLnOp(b, w, &aset, &ignore);	/* b=ln(10) */

    aset.digits=set->digits;		/* for final divide */
    decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
    } while(0);				/* [for break] */

  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
  if (allocbufb!=NULL) free(allocbufb); /* .. */
  #if DECSUBSET
  if (allocrhs !=NULL) free(allocrhs);	/* .. */
  #endif
  /* apply significant status */
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberLog10 */

/* ------------------------------------------------------------------ */
/* decNumberMax -- compare two Numbers and return the maximum	      */
/*								      */
/*   This computes C = A ? B, returning the maximum by 754R rules     */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMax */

/* ------------------------------------------------------------------ */
/* decNumberMaxMag -- compare and return the maximum by magnitude     */
/*								      */
/*   This computes C = A ? B, returning the maximum by 754R rules     */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMaxMag */

/* ------------------------------------------------------------------ */
/* decNumberMin -- compare two Numbers and return the minimum	      */
/*								      */
/*   This computes C = A ? B, returning the minimum by 754R rules     */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMin */

/* ------------------------------------------------------------------ */
/* decNumberMinMag -- compare and return the minimum by magnitude     */
/*								      */
/*   This computes C = A ? B, returning the minimum by 754R rules     */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMinMag */

/* ------------------------------------------------------------------ */
/* decNumberMinus -- prefix minus operator			      */
/*								      */
/*   This computes C = 0 - A					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* See also decNumberCopyNegate for a quiet bitwise version of this.  */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* Simply use AddOp for the subtract, which will do the necessary.    */
/* ------------------------------------------------------------------ */
decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
			   decContext *set) {
  decNumber dzero;
  uInt status=0;			/* accumulator */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  decNumberZero(&dzero);		/* make 0 */
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
  decAddOp(res, &dzero, rhs, set, DECNEG, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMinus */

/* ------------------------------------------------------------------ */
/* decNumberNextMinus -- next towards -Infinity			      */
/*								      */
/*   This computes C = A - infinitesimal, rounded towards -Infinity   */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* This is a generalization of 754r NextDown.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
			       decContext *set) {
  decNumber dtiny;			     /* constant */
  decContext workset=*set;		     /* work */
  uInt status=0;			     /* accumulator */
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* +Infinity is the special case */
  if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
    decSetMaxValue(res, set);		     /* is +ve */
    /* there is no status to set */
    return res;
    }
  decNumberZero(&dtiny);		     /* start with 0 */
  dtiny.lsu[0]=1;			     /* make number that is .. */
  dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
  workset.round=DEC_ROUND_FLOOR;
  decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberNextMinus */

/* ------------------------------------------------------------------ */
/* decNumberNextPlus -- next towards +Infinity			      */
/*								      */
/*   This computes C = A + infinitesimal, rounded towards +Infinity   */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* This is a generalization of 754r NextUp.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
			      decContext *set) {
  decNumber dtiny;			     /* constant */
  decContext workset=*set;		     /* work */
  uInt status=0;			     /* accumulator */
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* -Infinity is the special case */
  if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
    decSetMaxValue(res, set);
    res->bits=DECNEG;			     /* negative */
    /* there is no status to set */
    return res;
    }
  decNumberZero(&dtiny);		     /* start with 0 */
  dtiny.lsu[0]=1;			     /* make number that is .. */
  dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
  workset.round=DEC_ROUND_CEILING;
  decAddOp(res, rhs, &dtiny, &workset, 0, &status);
  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberNextPlus */

/* ------------------------------------------------------------------ */
/* decNumberNextToward -- next towards rhs			      */
/*								      */
/*   This computes C = A +/- infinitesimal, rounded towards	      */
/*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
/*								      */
/*   res is C, the result.  C may be A or B.			      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* This is a generalization of 754r NextAfter.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
				const decNumber *rhs, decContext *set) {
  decNumber dtiny;			     /* constant */
  decContext workset=*set;		     /* work */
  Int result;				     /* .. */
  uInt status=0;			     /* accumulator */
  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
    decNaNs(res, lhs, rhs, set, &status);
    }
   else { /* Is numeric, so no chance of sNaN Invalid, etc. */
    result=decCompare(lhs, rhs, 0);	/* sign matters */
    if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
     else { /* valid compare */
      if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
       else { /* differ: need NextPlus or NextMinus */
	uByte sub;			/* add or subtract */
	if (result<0) {			/* lhs<rhs, do nextplus */
	  /* -Infinity is the special case */
	  if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
	    decSetMaxValue(res, set);
	    res->bits=DECNEG;		/* negative */
	    return res;			/* there is no status to set */
	    }
	  workset.round=DEC_ROUND_CEILING;
	  sub=0;			/* add, please */
	  } /* plus */
	 else {				/* lhs>rhs, do nextminus */
	  /* +Infinity is the special case */
	  if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
	    decSetMaxValue(res, set);
	    return res;			/* there is no status to set */
	    }
	  workset.round=DEC_ROUND_FLOOR;
	  sub=DECNEG;			/* subtract, please */
	  } /* minus */
	decNumberZero(&dtiny);		/* start with 0 */
	dtiny.lsu[0]=1;			/* make number that is .. */
	dtiny.exponent=DEC_MIN_EMIN-1;	/* .. smaller than tiniest */
	decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
	/* turn off exceptions if the result is a normal number */
	/* (including Nmin), otherwise let all status through */
	if (decNumberIsNormal(res, set)) status=0;
	} /* unequal */
      } /* compare OK */
    } /* numeric */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberNextToward */

/* ------------------------------------------------------------------ */
/* decNumberOr -- OR two Numbers, digitwise			      */
/*								      */
/*   This computes C = A | B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X|X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context (used for result length and error report)     */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Logical function restrictions apply (see above); a NaN is	      */
/* returned with Invalid_operation if a restriction is violated.      */
/* ------------------------------------------------------------------ */
decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
			const decNumber *rhs, decContext *set) {
  const Unit *ua, *ub;			/* -> operands */
  const Unit *msua, *msub;		/* -> operand msus */
  Unit	*uc, *msuc;			/* -> result and its msu */
  Int	msudigs;			/* digits in res msu */
  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    decStatus(res, DEC_Invalid_operation, set);
    return res;
    }
  /* operands are valid */
  ua=lhs->lsu;				/* bottom-up */
  ub=rhs->lsu;				/* .. */
  uc=res->lsu;				/* .. */
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
    Unit a, b;				/* extract units */
    if (ua>msua) a=0;
     else a=*ua;
    if (ub>msub) b=0;
     else b=*ub;
    *uc=0;				/* can now write back */
    if (a|b) {				/* maybe 1 bits to examine */
      Int i, j;
      /* This loop could be unrolled and/or use BIN2BCD tables */
      for (i=0; i<DECDPUN; i++) {
	if ((a|b)&1) *uc=*uc+(Unit)powers[i];	  /* effect OR */
	j=a%10;
	a=a/10;
	j|=b%10;
	b=b/10;
	if (j>1) {
	  decStatus(res, DEC_Invalid_operation, set);
	  return res;
	  }
	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
	} /* each digit */
      } /* non-zero */
    } /* each unit */
  /* [here uc-1 is the msu of the result] */
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
  res->exponent=0;			/* integer */
  res->bits=0;				/* sign=0 */
  return res;  /* [no status to set] */
  } /* decNumberOr */

/* ------------------------------------------------------------------ */
/* decNumberPlus -- prefix plus operator			      */
/*								      */
/*   This computes C = 0 + A					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* See also decNumberCopy for a quiet bitwise version of this.	      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* This simply uses AddOp; Add will take fast path after preparing A. */
/* Performance is a concern here, as this routine is often used to    */
/* check operands and apply rounding and overflow/underflow testing.  */
/* ------------------------------------------------------------------ */
decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
			  decContext *set) {
  decNumber dzero;
  uInt status=0;			/* accumulator */
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  decNumberZero(&dzero);		/* make 0 */
  dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
  decAddOp(res, &dzero, rhs, set, 0, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberPlus */

/* ------------------------------------------------------------------ */
/* decNumberMultiply -- multiply two Numbers			      */
/*								      */
/*   This computes C = A x B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
			      const decNumber *rhs, decContext *set) {
  uInt status=0;		   /* accumulator */
  decMultiplyOp(res, lhs, rhs, set, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberMultiply */

/* ------------------------------------------------------------------ */
/* decNumberPower -- raise a number to a power			      */
/*								      */
/*   This computes C = A ** B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X**X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Mathematical function restrictions apply (see above); a NaN is     */
/* returned with Invalid_operation if a restriction is violated.      */
/*								      */
/* However, if 1999999997<=B<=999999999 and B is an integer then the  */
/* restrictions on A and the context are relaxed to the usual bounds, */
/* for compatibility with the earlier (integer power only) version    */
/* of this function.						      */
/*								      */
/* When B is an integer, the result may be exact, even if rounded.    */
/*								      */
/* The final result is rounded according to the context; it will      */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/* ------------------------------------------------------------------ */
decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
			   const decNumber *rhs, decContext *set) {
  #if DECSUBSET
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
  decNumber *allocrhs=NULL;	   /* .., rhs */
  #endif
  decNumber *allocdac=NULL;	   /* -> allocated acc buffer, iff used */
  decNumber *allocinv=NULL;	   /* -> allocated 1/x buffer, iff used */
  Int	reqdigits=set->digits;	   /* requested DIGITS */
  Int	n;			   /* rhs in binary */
  Flag	rhsint=0;		   /* 1 if rhs is an integer */
  Flag	useint=0;		   /* 1 if can use integer calculation */
  Flag	isoddint=0;		   /* 1 if rhs is an integer and odd */
  Int	i;			   /* work */
  #if DECSUBSET
  Int	dropped;		   /* .. */
  #endif
  uInt	needbytes;		   /* buffer size needed */
  Flag	seenbit;		   /* seen a bit while powering */
  Int	residue=0;		   /* rounding residue */
  uInt	status=0;		   /* accumulators */
  uByte bits=0;			   /* result sign if errors */
  decContext aset;		   /* working context */
  decNumber dnOne;		   /* work value 1... */
  /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
  decNumber dacbuff[D2N(DECBUFFER+9)];
  decNumber *dac=dacbuff;	   /* -> result accumulator */
  /* same again for possible 1/lhs calculation */
  decNumber invbuff[D2N(DECBUFFER+9)];

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) { /* reduce operands and set status, as needed */
      if (lhs->digits>reqdigits) {
	alloclhs=decRoundOperand(lhs, set, &status);
	if (alloclhs==NULL) break;
	lhs=alloclhs;
	}
      if (rhs->digits>reqdigits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* handle NaNs and rhs Infinity (lhs infinity is harder) */
    if (SPECIALARGS) {
      if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
	decNaNs(res, lhs, rhs, set, &status);
	break;}
      if (decNumberIsInfinite(rhs)) {	/* rhs Infinity */
	Flag rhsneg=rhs->bits&DECNEG;	/* save rhs sign */
	if (decNumberIsNegative(lhs)	/* lhs<0 */
	 && !decNumberIsZero(lhs))	/* .. */
	  status|=DEC_Invalid_operation;
	 else {				/* lhs >=0 */
	  decNumberZero(&dnOne);	/* set up 1 */
	  dnOne.lsu[0]=1;
	  decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
	  decNumberZero(res);		/* prepare for 0/1/Infinity */
	  if (decNumberIsNegative(dac)) {    /* lhs<1 */
	    if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
	    }
	   else if (dac->lsu[0]==0) {	     /* lhs=1 */
	    /* 1**Infinity is inexact, so return fully-padded 1.0000 */
	    Int shift=set->digits-1;
	    *res->lsu=1;		     /* was 0, make int 1 */
	    res->digits=decShiftToMost(res->lsu, 1, shift);
	    res->exponent=-shift;	     /* make 1.0000... */
	    status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
	    }
	   else {			     /* lhs>1 */
	    if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
	    }
	  } /* lhs>=0 */
	break;}
      /* [lhs infinity drops through] */
      } /* specials */

    /* Original rhs may be an integer that fits and is in range */
    n=decGetInt(rhs);
    if (n!=BADINT) {			/* it is an integer */
      rhsint=1;				/* record the fact for 1**n */
      isoddint=(Flag)n&1;		/* [works even if big] */
      if (n!=BIGEVEN && n!=BIGODD)	/* can use integer path? */
	useint=1;			/* looks good */
      }

    if (decNumberIsNegative(lhs)	/* -x .. */
      && isoddint) bits=DECNEG;		/* .. to an odd power */

    /* handle LHS infinity */
    if (decNumberIsInfinite(lhs)) {	/* [NaNs already handled] */
      uByte rbits=rhs->bits;		/* save */
      decNumberZero(res);		/* prepare */
      if (n==0) *res->lsu=1;		/* [-]Inf**0 => 1 */
       else {
	/* -Inf**nonint -> error */
	if (!rhsint && decNumberIsNegative(lhs)) {
	  status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
	  break;}
	if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
	/* [otherwise will be 0 or -0] */
	res->bits=bits;
	}
      break;}

    /* similarly handle LHS zero */
    if (decNumberIsZero(lhs)) {
      if (n==0) {			     /* 0**0 => Error */
	#if DECSUBSET
	if (!set->extended) {		     /* [unless subset] */
	  decNumberZero(res);
	  *res->lsu=1;			     /* return 1 */
	  break;}
	#endif
	status|=DEC_Invalid_operation;
	}
       else {				     /* 0**x */
	uByte rbits=rhs->bits;		     /* save */
	if (rbits & DECNEG) {		     /* was a 0**(-n) */
	  #if DECSUBSET
	  if (!set->extended) {		     /* [bad if subset] */
	    status|=DEC_Invalid_operation;
	    break;}
	  #endif
	  bits|=DECINF;
	  }
	decNumberZero(res);		     /* prepare */
	/* [otherwise will be 0 or -0] */
	res->bits=bits;
	}
      break;}

    /* here both lhs and rhs are finite; rhs==0 is handled in the */
    /* integer path.  Next handle the non-integer cases */
    if (!useint) {			/* non-integral rhs */
      /* any -ve lhs is bad, as is either operand or context out of */
      /* bounds */
      if (decNumberIsNegative(lhs)) {
	status|=DEC_Invalid_operation;
	break;}
      if (decCheckMath(lhs, set, &status)
       || decCheckMath(rhs, set, &status)) break; /* variable status */

      decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
      aset.emax=DEC_MAX_MATH;		/* usual bounds */
      aset.emin=-DEC_MAX_MATH;		/* .. */
      aset.clamp=0;			/* and no concrete format */

      /* calculate the result using exp(ln(lhs)*rhs), which can */
      /* all be done into the accumulator, dac.	 The precision needed */
      /* is enough to contain the full information in the lhs (which */
      /* is the total digits, including exponent), or the requested */
      /* precision, if larger, + 4; 6 is used for the exponent */
      /* maximum length, and this is also used when it is shorter */
      /* than the requested digits as it greatly reduces the >0.5 ulp */
      /* cases at little cost (because Ln doubles digits each */
      /* iteration so a few extra digits rarely causes an extra */
      /* iteration) */
      aset.digits=MAXI(lhs->digits, set->digits)+6+4;
      } /* non-integer rhs */

     else { /* rhs is in-range integer */
      if (n==0) {			/* x**0 = 1 */
	/* (0**0 was handled above) */
	decNumberZero(res);		/* result=1 */
	*res->lsu=1;			/* .. */
	break;}
      /* rhs is a non-zero integer */
      if (n<0) n=-n;			/* use abs(n) */

      aset=*set;			/* clone the context */
      aset.round=DEC_ROUND_HALF_EVEN;	/* internally use balanced */
      /* calculate the working DIGITS */
      aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
      #if DECSUBSET
      if (!set->extended) aset.digits--;     /* use classic precision */
      #endif
      /* it's an error if this is more than can be handled */
      if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
      } /* integer path */

    /* aset.digits is the count of digits for the accumulator needed */
    /* if accumulator is too long for local storage, then allocate */
    needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
    /* [needbytes also used below if 1/lhs needed] */
    if (needbytes>sizeof(dacbuff)) {
      allocdac=(decNumber *)malloc(needbytes);
      if (allocdac==NULL) {   /* hopeless -- abandon */
	status|=DEC_Insufficient_storage;
	break;}
      dac=allocdac;	      /* use the allocated space */
      }
    /* here, aset is set up and accumulator is ready for use */

    if (!useint) {			     /* non-integral rhs */
      /* x ** y; special-case x=1 here as it will otherwise always */
      /* reduce to integer 1; decLnOp has a fastpath which detects */
      /* the case of x=1 */
      decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
      /* [no error possible, as lhs 0 already handled] */
      if (ISZERO(dac)) {		     /* x==1, 1.0, etc. */
	/* need to return fully-padded 1.0000 etc., but rhsint->1 */
	*dac->lsu=1;			     /* was 0, make int 1 */
	if (!rhsint) {			     /* add padding */
	  Int shift=set->digits-1;
	  dac->digits=decShiftToMost(dac->lsu, 1, shift);
	  dac->exponent=-shift;		     /* make 1.0000... */
	  status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
	  }
	}
       else {
	decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
	decExpOp(dac, dac, &aset, &status);	       /* dac=exp(dac) */
	}
      /* and drop through for final rounding */
      } /* non-integer rhs */

     else {				/* carry on with integer */
      decNumberZero(dac);		/* acc=1 */
      *dac->lsu=1;			/* .. */

      /* if a negative power the constant 1 is needed, and if not subset */
      /* invert the lhs now rather than inverting the result later */
      if (decNumberIsNegative(rhs)) {	/* was a **-n [hence digits>0] */
	decNumber *inv=invbuff;		/* asssume use fixed buffer */
	decNumberCopy(&dnOne, dac);	/* dnOne=1;  [needed now or later] */
	#if DECSUBSET
	if (set->extended) {		/* need to calculate 1/lhs */
	#endif
	  /* divide lhs into 1, putting result in dac [dac=1/dac] */
	  decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
	  /* now locate or allocate space for the inverted lhs */
	  if (needbytes>sizeof(invbuff)) {
	    allocinv=(decNumber *)malloc(needbytes);
	    if (allocinv==NULL) {	/* hopeless -- abandon */
	      status|=DEC_Insufficient_storage;
	      break;}
	    inv=allocinv;		/* use the allocated space */
	    }
	  /* [inv now points to big-enough buffer or allocated storage] */
	  decNumberCopy(inv, dac);	/* copy the 1/lhs */
	  decNumberCopy(dac, &dnOne);	/* restore acc=1 */
	  lhs=inv;			/* .. and go forward with new lhs */
	#if DECSUBSET
	  }
	#endif
	}

      /* Raise-to-the-power loop... */
      seenbit=0;		   /* set once a 1-bit is encountered */
      for (i=1;;i++){		   /* for each bit [top bit ignored] */
	/* abandon if had overflow or terminal underflow */
	if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
	  if (status&DEC_Overflow || ISZERO(dac)) break;
	  }
	/* [the following two lines revealed an optimizer bug in a C++ */
	/* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
	n=n<<1;			   /* move next bit to testable position */
	if (n<0) {		   /* top bit is set */
	  seenbit=1;		   /* OK, significant bit seen */
	  decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
	  }
	if (i==31) break;	   /* that was the last bit */
	if (!seenbit) continue;	   /* no need to square 1 */
	decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
	} /*i*/ /* 32 bits */

      /* complete internal overflow or underflow processing */
      if (status & (DEC_Overflow|DEC_Underflow)) {
	#if DECSUBSET
	/* If subset, and power was negative, reverse the kind of -erflow */
	/* [1/x not yet done] */
	if (!set->extended && decNumberIsNegative(rhs)) {
	  if (status & DEC_Overflow)
	    status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
	   else { /* trickier -- Underflow may or may not be set */
	    status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
	    status|=DEC_Overflow;
	    }
	  }
	#endif
	dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
	/* round subnormals [to set.digits rather than aset.digits] */
	/* or set overflow result similarly as required */
	decFinalize(dac, set, &residue, &status);
	decNumberCopy(res, dac);   /* copy to result (is now OK length) */
	break;
	}

      #if DECSUBSET
      if (!set->extended &&		     /* subset math */
	  decNumberIsNegative(rhs)) {	     /* was a **-n [hence digits>0] */
	/* so divide result into 1 [dac=1/dac] */
	decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
	}
      #endif
      } /* rhs integer path */

    /* reduce result to the requested length and copy to result */
    decCopyFit(res, dac, set, &residue, &status);
    decFinish(res, set, &residue, &status);  /* final cleanup */
    #if DECSUBSET
    if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
    #endif
    } while(0);				/* end protected */

  if (allocdac!=NULL) free(allocdac);	/* drop any storage used */
  if (allocinv!=NULL) free(allocinv);	/* .. */
  #if DECSUBSET
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
  #endif
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberPower */

/* ------------------------------------------------------------------ */
/* decNumberQuantize -- force exponent to requested value	      */
/*								      */
/*   This computes C = op(A, B), where op adjusts the coefficient     */
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
/*   of C has exponent of B.  The numerical value of C will equal A,  */
/*   except for the effects of any rounding that occurred.	      */
/*								      */
/*   res is C, the result.  C may be A or B			      */
/*   lhs is A, the number to adjust				      */
/*   rhs is B, the number with exponent to match		      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Unless there is an error or the result is infinite, the exponent   */
/* after the operation is guaranteed to be equal to that of B.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
			      const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decQuantizeOp(res, lhs, rhs, set, 1, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberQuantize */

/* ------------------------------------------------------------------ */
/* decNumberReduce -- remove trailing zeros			      */
/*								      */
/*   This computes C = 0 + A, and normalizes the result		      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* Previously known as Normalize */
decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
			       decContext *set) {
  return decNumberReduce(res, rhs, set);
  } /* decNumberNormalize */

decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
			    decContext *set) {
  #if DECSUBSET
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
  #endif
  uInt status=0;		   /* as usual */
  Int  residue=0;		   /* as usual */
  Int  dropped;			   /* work */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operand and set lostDigits status, as needed */
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* Infinities copy through; NaNs need usual treatment */
    if (decNumberIsNaN(rhs)) {
      decNaNs(res, rhs, NULL, set, &status);
      break;
      }

    /* reduce result to the requested length and copy to result */
    decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
    decFinish(res, set, &residue, &status);	  /* cleanup/set flags */
    decTrim(res, set, 1, &dropped);		  /* normalize in place */
    } while(0);				     /* end protected */

  #if DECSUBSET
  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
  #endif
  if (status!=0) decStatus(res, status, set);/* then report status */
  return res;
  } /* decNumberReduce */

/* ------------------------------------------------------------------ */
/* decNumberRescale -- force exponent to requested value	      */
/*								      */
/*   This computes C = op(A, B), where op adjusts the coefficient     */
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
/*   of C has the value B.  The numerical value of C will equal A,    */
/*   except for the effects of any rounding that occurred.	      */
/*								      */
/*   res is C, the result.  C may be A or B			      */
/*   lhs is A, the number to adjust				      */
/*   rhs is B, the requested exponent				      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Unless there is an error or the result is infinite, the exponent   */
/* after the operation is guaranteed to be equal to B.		      */
/* ------------------------------------------------------------------ */
decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
			     const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decQuantizeOp(res, lhs, rhs, set, 0, &status);
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberRescale */

/* ------------------------------------------------------------------ */
/* decNumberRemainder -- divide and return remainder		      */
/*								      */
/*   This computes C = A % B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
			       const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberRemainder */

/* ------------------------------------------------------------------ */
/* decNumberRemainderNear -- divide and return remainder from nearest */
/*								      */
/*   This computes C = A % B, where % is the IEEE remainder operator  */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
				   const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */
  decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberRemainderNear */

/* ------------------------------------------------------------------ */
/* decNumberRotate -- rotate the coefficient of a Number left/right   */
/*								      */
/*   This computes C = A rot B	(in base ten and rotating set->digits */
/*   digits).							      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)	      */
/*   lhs is A							      */
/*   rhs is B, the number of digits to rotate (-ve to right)	      */
/*   set is the context						      */
/*								      */
/* The digits of the coefficient of A are rotated to the left (if B   */
/* is positive) or to the right (if B is negative) without adjusting  */
/* the exponent or the sign of A.  If lhs->digits is less than	      */
/* set->digits the coefficient is padded with zeros on the left	      */
/* before the rotate.  Any leading zeros in the result are removed    */
/* as usual.							      */
/*								      */
/* B must be an integer (q=0) and in the range -set->digits through   */
/* +set->digits.						      */
/* C must have space for set->digits digits.			      */
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
/* B must be valid).  No status is set unless B is invalid or an      */
/* operand is an sNaN.						      */
/* ------------------------------------------------------------------ */
decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
			   const decNumber *rhs, decContext *set) {
  uInt status=0;	      /* accumulator */
  Int  rotate;		      /* rhs as an Int */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  /* NaNs propagate as normal */
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
    decNaNs(res, lhs, rhs, set, &status);
   /* rhs must be an integer */
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
    status=DEC_Invalid_operation;
   else { /* both numeric, rhs is an integer */
    rotate=decGetInt(rhs);		     /* [cannot fail] */
    if (rotate==BADINT			     /* something bad .. */
     || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
     || abs(rotate)>set->digits)	     /* .. or out of range */
      status=DEC_Invalid_operation;
     else {				     /* rhs is OK */
      decNumberCopy(res, lhs);
      /* convert -ve rotate to equivalent positive rotation */
      if (rotate<0) rotate=set->digits+rotate;
      if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
       && !decNumberIsInfinite(res)) {	     /* lhs was infinite */
	/* left-rotate to do; 0 < rotate < set->digits */
	uInt units, shift;		     /* work */
	uInt msudigits;			     /* digits in result msu */
	Unit *msu=res->lsu+D2U(res->digits)-1;	  /* current msu */
	Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
	for (msu++; msu<=msumax; msu++) *msu=0;	  /* ensure high units=0 */
	res->digits=set->digits;		  /* now full-length */
	msudigits=MSUDIGITS(res->digits);	  /* actual digits in msu */

	/* rotation here is done in-place, in three steps */
	/* 1. shift all to least up to one unit to unit-align final */
	/*    lsd [any digits shifted out are rotated to the left, */
	/*    abutted to the original msd (which may require split)] */
	/* */
	/*    [if there are no whole units left to rotate, the */
	/*    rotation is now complete] */
	/* */
	/* 2. shift to least, from below the split point only, so that */
	/*    the final msd is in the right place in its Unit [any */
	/*    digits shifted out will fit exactly in the current msu, */
	/*    left aligned, no split required] */
	/* */
	/* 3. rotate all the units by reversing left part, right */
	/*    part, and then whole */
	/* */
	/* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
	/* */
	/*   start: 00a bcd efg hij klm npq */
	/* */
	/*	1a  000 0ab cde fgh|ijk lmn [pq saved] */
	/*	1b  00p qab cde fgh|ijk lmn */
	/* */
	/*	2a  00p qab cde fgh|00i jkl [mn saved] */
	/*	2b  mnp qab cde fgh|00i jkl */
	/* */
	/*	3a  fgh cde qab mnp|00i jkl */
	/*	3b  fgh cde qab mnp|jkl 00i */
	/*	3c  00i jkl mnp qab cde fgh */

	/* Step 1: amount to shift is the partial right-rotate count */
	rotate=set->digits-rotate;	/* make it right-rotate */
	units=rotate/DECDPUN;		/* whole units to rotate */
	shift=rotate%DECDPUN;		/* left-over digits count */
	if (shift>0) {			/* not an exact number of units */
	  uInt save=res->lsu[0]%powers[shift];	  /* save low digit(s) */
	  decShiftToLeast(res->lsu, D2U(res->digits), shift);
	  if (shift>msudigits) {	/* msumax-1 needs >0 digits */
	    uInt rem=save%powers[shift-msudigits];/* split save */
	    *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
	    *(msumax-1)=*(msumax-1)
		       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
	    }
	   else { /* all fits in msumax */
	    *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
	    }
	  } /* digits shift needed */

	/* If whole units to rotate... */
	if (units>0) {			/* some to do */
	  /* Step 2: the units to touch are the whole ones in rotate, */
	  /*   if any, and the shift is DECDPUN-msudigits (which may be */
	  /*   0, again) */
	  shift=DECDPUN-msudigits;
	  if (shift>0) {		/* not an exact number of units */
	    uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
	    decShiftToLeast(res->lsu, units, shift);
	    *msumax=*msumax+(Unit)(save*powers[msudigits]);
	    } /* partial shift needed */

	  /* Step 3: rotate the units array using triple reverse */
	  /* (reversing is easy and fast) */
	  decReverse(res->lsu+units, msumax);	  /* left part */
	  decReverse(res->lsu, res->lsu+units-1); /* right part */
	  decReverse(res->lsu, msumax);		  /* whole */
	  } /* whole units to rotate */
	/* the rotation may have left an undetermined number of zeros */
	/* on the left, so true length needs to be calculated */
	res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
	} /* rotate needed */
      } /* rhs OK */
    } /* numerics */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberRotate */

/* ------------------------------------------------------------------ */
/* decNumberSameQuantum -- test for equal exponents		      */
/*								      */
/*   res is the result number, which will contain either 0 or 1	      */
/*   lhs is a number to test					      */
/*   rhs is the second (usually a pattern)			      */
/*								      */
/* No errors are possible and no context is needed.		      */
/* ------------------------------------------------------------------ */
decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
				 const decNumber *rhs) {
  Unit ret=0;			   /* return value */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
  #endif

  if (SPECIALARGS) {
    if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
     else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
     /* [anything else with a special gives 0] */
    }
   else if (lhs->exponent==rhs->exponent) ret=1;

  decNumberZero(res);		   /* OK to overwrite an operand now */
  *res->lsu=ret;
  return res;
  } /* decNumberSameQuantum */

/* ------------------------------------------------------------------ */
/* decNumberScaleB -- multiply by a power of 10			      */
/*								      */
/* This computes C = A x 10**B where B is an integer (q=0) with	      */
/* maximum magnitude 2*(emax+digits)				      */
/*								      */
/*   res is C, the result.  C may be A or B			      */
/*   lhs is A, the number to adjust				      */
/*   rhs is B, the requested power of ten to use		      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* The result may underflow or overflow.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
			    const decNumber *rhs, decContext *set) {
  Int  reqexp;		      /* requested exponent change [B] */
  uInt status=0;	      /* accumulator */
  Int  residue;		      /* work */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  /* Handle special values except lhs infinite */
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
    decNaNs(res, lhs, rhs, set, &status);
    /* rhs must be an integer */
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
    status=DEC_Invalid_operation;
   else {
    /* lhs is a number; rhs is a finite with q==0 */
    reqexp=decGetInt(rhs);		     /* [cannot fail] */
    if (reqexp==BADINT			     /* something bad .. */
     || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
     || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
      status=DEC_Invalid_operation;
     else {				     /* rhs is OK */
      decNumberCopy(res, lhs);		     /* all done if infinite lhs */
      if (!decNumberIsInfinite(res)) {	     /* prepare to scale */
	res->exponent+=reqexp;		     /* adjust the exponent */
	residue=0;
	decFinalize(res, set, &residue, &status); /* .. and check */
	} /* finite LHS */
      } /* rhs OK */
    } /* rhs finite */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberScaleB */

/* ------------------------------------------------------------------ */
/* decNumberShift -- shift the coefficient of a Number left or right  */
/*								      */
/*   This computes C = A << B or C = A >> -B  (in base ten).	      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)	      */
/*   lhs is A							      */
/*   rhs is B, the number of digits to shift (-ve to right)	      */
/*   set is the context						      */
/*								      */
/* The digits of the coefficient of A are shifted to the left (if B   */
/* is positive) or to the right (if B is negative) without adjusting  */
/* the exponent or the sign of A.				      */
/*								      */
/* B must be an integer (q=0) and in the range -set->digits through   */
/* +set->digits.						      */
/* C must have space for set->digits digits.			      */
/* NaNs are propagated as usual.  Infinities are unaffected (but      */
/* B must be valid).  No status is set unless B is invalid or an      */
/* operand is an sNaN.						      */
/* ------------------------------------------------------------------ */
decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
			   const decNumber *rhs, decContext *set) {
  uInt status=0;	      /* accumulator */
  Int  shift;		      /* rhs as an Int */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  /* NaNs propagate as normal */
  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
    decNaNs(res, lhs, rhs, set, &status);
   /* rhs must be an integer */
   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
    status=DEC_Invalid_operation;
   else { /* both numeric, rhs is an integer */
    shift=decGetInt(rhs);		     /* [cannot fail] */
    if (shift==BADINT			     /* something bad .. */
     || shift==BIGODD || shift==BIGEVEN	     /* .. very big .. */
     || abs(shift)>set->digits)		     /* .. or out of range */
      status=DEC_Invalid_operation;
     else {				     /* rhs is OK */
      decNumberCopy(res, lhs);
      if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
	if (shift>0) {			     /* to left */
	  if (shift==set->digits) {	     /* removing all */
	    *res->lsu=0;		     /* so place 0 */
	    res->digits=1;		     /* .. */
	    }
	   else {			     /* */
	    /* first remove leading digits if necessary */
	    if (res->digits+shift>set->digits) {
	      decDecap(res, res->digits+shift-set->digits);
	      /* that updated res->digits; may have gone to 1 (for a */
	      /* single digit or for zero */
	      }
	    if (res->digits>1 || *res->lsu)  /* if non-zero.. */
	      res->digits=decShiftToMost(res->lsu, res->digits, shift);
	    } /* partial left */
	  } /* left */
	 else { /* to right */
	  if (-shift>=res->digits) {	     /* discarding all */
	    *res->lsu=0;		     /* so place 0 */
	    res->digits=1;		     /* .. */
	    }
	   else {
	    decShiftToLeast(res->lsu, D2U(res->digits), -shift);
	    res->digits-=(-shift);
	    }
	  } /* to right */
	} /* non-0 non-Inf shift */
      } /* rhs OK */
    } /* numerics */
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberShift */

/* ------------------------------------------------------------------ */
/* decNumberSquareRoot -- square root operator			      */
/*								      */
/*   This computes C = squareroot(A)				      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
/* This uses the following varying-precision algorithm in:	      */
/*								      */
/*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
/*   pp229-237, ACM, September 1985.				      */
/*								      */
/* The square-root is calculated using Newton's method, after which   */
/* a check is made to ensure the result is correctly rounded.	      */
/*								      */
/* % [Reformatted original Numerical Turing source code follows.]     */
/* function sqrt(x : real) : real				      */
/* % sqrt(x) returns the properly rounded approximation to the square */
/* % root of x, in the precision of the calling environment, or it    */
/* % fails if x < 0.						      */
/* % t e hull and a abrham, august, 1984			      */
/* if x <= 0 then						      */
/*   if x < 0 then						      */
/*     assert false						      */
/*   else							      */
/*     result 0							      */
/*   end if							      */
/* end if							      */
/* var f := setexp(x, 0)  % fraction part of x	 [0.1 <= x < 1]	      */
/* var e := getexp(x)	  % exponent part of x			      */
/* var approx : real						      */
/* if e mod 2 = 0  then						      */
/*   approx := .259 + .819 * f	 % approx to root of f		      */
/* else								      */
/*   f := f/l0			 % adjustments			      */
/*   e := e + 1			 %   for odd			      */
/*   approx := .0819 + 2.59 * f	 %   exponent			      */
/* end if							      */
/*								      */
/* var p:= 3							      */
/* const maxp := currentprecision + 2				      */
/* loop								      */
/*   p := min(2*p - 2, maxp)	 % p = 4,6,10, . . . , maxp	      */
/*   precision p						      */
/*   approx := .5 * (approx + f/approx)				      */
/*   exit when p = maxp						      */
/* end loop							      */
/*								      */
/* % approx is now within 1 ulp of the properly rounded square root   */
/* % of f; to ensure proper rounding, compare squares of (approx -    */
/* % l/2 ulp) and (approx + l/2 ulp) with f.			      */
/* p := currentprecision					      */
/* begin							      */
/*   precision p + 2						      */
/*   const approxsubhalf := approx - setexp(.5, -p)		      */
/*   if mulru(approxsubhalf, approxsubhalf) > f then		      */
/*     approx := approx - setexp(.l, -p + 1)			      */
/*   else							      */
/*     const approxaddhalf := approx + setexp(.5, -p)		      */
/*     if mulrd(approxaddhalf, approxaddhalf) < f then		      */
/*	 approx := approx + setexp(.l, -p + 1)			      */
/*     end if							      */
/*   end if							      */
/* end								      */
/* result setexp(approx, e div 2)  % fix exponent		      */
/* end sqrt							      */
/* ------------------------------------------------------------------ */
decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
				decContext *set) {
  decContext workset, approxset;   /* work contexts */
  decNumber dzero;		   /* used for constant zero */
  Int  maxp;			   /* largest working precision */
  Int  workp;			   /* working precision */
  Int  residue=0;		   /* rounding residue */
  uInt status=0, ignore=0;	   /* status accumulators */
  uInt rstatus;			   /* .. */
  Int  exp;			   /* working exponent */
  Int  ideal;			   /* ideal (preferred) exponent */
  Int  needbytes;		   /* work */
  Int  dropped;			   /* .. */

  #if DECSUBSET
  decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
  #endif
  /* buffer for f [needs +1 in case DECBUFFER 0] */
  decNumber buff[D2N(DECBUFFER+1)];
  /* buffer for a [needs +2 to match likely maxp] */
  decNumber bufa[D2N(DECBUFFER+2)];
  /* buffer for temporary, b [must be same size as a] */
  decNumber bufb[D2N(DECBUFFER+2)];
  decNumber *allocbuff=NULL;	   /* -> allocated buff, iff allocated */
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
  decNumber *f=buff;		   /* reduced fraction */
  decNumber *a=bufa;		   /* approximation to result */
  decNumber *b=bufb;		   /* intermediate result */
  /* buffer for temporary variable, up to 3 digits */
  decNumber buft[D2N(3)];
  decNumber *t=buft;		   /* up-to-3-digit constant or work */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operand and set lostDigits status, as needed */
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, &status);
	if (allocrhs==NULL) break;
	/* [Note: 'f' allocation below could reuse this buffer if */
	/* used, but as this is rare they are kept separate for clarity.] */
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* handle infinities and NaNs */
    if (SPECIALARG) {
      if (decNumberIsInfinite(rhs)) {	      /* an infinity */
	if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
	 else decNumberCopy(res, rhs);	      /* +Infinity */
	}
       else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
      break;
      }

    /* calculate the ideal (preferred) exponent [floor(exp/2)] */
    /* [We would like to write: ideal=rhs->exponent>>1, but this */
    /* generates a compiler warning.  Generated code is the same.] */
    ideal=(rhs->exponent&~1)/2;		/* target */

    /* handle zeros */
    if (ISZERO(rhs)) {
      decNumberCopy(res, rhs);		/* could be 0 or -0 */
      res->exponent=ideal;		/* use the ideal [safe] */
      /* use decFinish to clamp any out-of-range exponent, etc. */
      decFinish(res, set, &residue, &status);
      break;
      }

    /* any other -x is an oops */
    if (decNumberIsNegative(rhs)) {
      status|=DEC_Invalid_operation;
      break;
      }

    /* space is needed for three working variables */
    /*	 f -- the same precision as the RHS, reduced to 0.01->0.99... */
    /*	 a -- Hull's approximation -- precision, when assigned, is */
    /*	      currentprecision+1 or the input argument precision, */
    /*	      whichever is larger (+2 for use as temporary) */
    /*	 b -- intermediate temporary result (same size as a) */
    /* if any is too long for local storage, then allocate */
    workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
    maxp=workp+2;			     /* largest working precision */

    needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
    if (needbytes>(Int)sizeof(buff)) {
      allocbuff=(decNumber *)malloc(needbytes);
      if (allocbuff==NULL) {  /* hopeless -- abandon */
	status|=DEC_Insufficient_storage;
	break;}
      f=allocbuff;	      /* use the allocated space */
      }
    /* a and b both need to be able to hold a maxp-length number */
    needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
    if (needbytes>(Int)sizeof(bufa)) {		  /* [same applies to b] */
      allocbufa=(decNumber *)malloc(needbytes);
      allocbufb=(decNumber *)malloc(needbytes);
      if (allocbufa==NULL || allocbufb==NULL) {	  /* hopeless */
	status|=DEC_Insufficient_storage;
	break;}
      a=allocbufa;	      /* use the allocated spaces */
      b=allocbufb;	      /* .. */
      }

    /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
    decNumberCopy(f, rhs);
    exp=f->exponent+f->digits;		     /* adjusted to Hull rules */
    f->exponent=-(f->digits);		     /* to range */

    /* set up working context */
    decContextDefault(&workset, DEC_INIT_DECIMAL64);

    /* [Until further notice, no error is possible and status bits */
    /* (Rounded, etc.) should be ignored, not accumulated.] */

    /* Calculate initial approximation, and allow for odd exponent */
    workset.digits=workp;		     /* p for initial calculation */
    t->bits=0; t->digits=3;
    a->bits=0; a->digits=3;
    if ((exp & 1)==0) {			     /* even exponent */
      /* Set t=0.259, a=0.819 */
      t->exponent=-3;
      a->exponent=-3;
      #if DECDPUN>=3
	t->lsu[0]=259;
	a->lsu[0]=819;
      #elif DECDPUN==2
	t->lsu[0]=59; t->lsu[1]=2;
	a->lsu[0]=19; a->lsu[1]=8;
      #else
	t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
	a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
      #endif
      }
     else {				     /* odd exponent */
      /* Set t=0.0819, a=2.59 */
      f->exponent--;			     /* f=f/10 */
      exp++;				     /* e=e+1 */
      t->exponent=-4;
      a->exponent=-2;
      #if DECDPUN>=3
	t->lsu[0]=819;
	a->lsu[0]=259;
      #elif DECDPUN==2
	t->lsu[0]=19; t->lsu[1]=8;
	a->lsu[0]=59; a->lsu[1]=2;
      #else
	t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
	a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
      #endif
      }
    decMultiplyOp(a, a, f, &workset, &ignore);	  /* a=a*f */
    decAddOp(a, a, t, &workset, 0, &ignore);	  /* ..+t */
    /* [a is now the initial approximation for sqrt(f), calculated with */
    /* currentprecision, which is also a's precision.] */

    /* the main calculation loop */
    decNumberZero(&dzero);		     /* make 0 */
    decNumberZero(t);			     /* set t = 0.5 */
    t->lsu[0]=5;			     /* .. */
    t->exponent=-1;			     /* .. */
    workset.digits=3;			     /* initial p */
    for (;;) {
      /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
      workset.digits=workset.digits*2-2;
      if (workset.digits>maxp) workset.digits=maxp;
      /* a = 0.5 * (a + f/a) */
      /* [calculated at p then rounded to currentprecision] */
      decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
      decAddOp(b, b, a, &workset, 0, &ignore);	  /* b=b+a */
      decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
      if (a->digits==maxp) break;	     /* have required digits */
      } /* loop */

    /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
    /* now reduce to length, etc.; this needs to be done with a */
    /* having the correct exponent so as to handle subnormals */
    /* correctly */
    approxset=*set;			     /* get emin, emax, etc. */
    approxset.round=DEC_ROUND_HALF_EVEN;
    a->exponent+=exp/2;			     /* set correct exponent */

    rstatus=0;				     /* clear status */
    residue=0;				     /* .. and accumulator */
    decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
    decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */

    /* Overflow was possible if the input exponent was out-of-range, */
    /* in which case quit */
    if (rstatus&DEC_Overflow) {
      status=rstatus;			     /* use the status as-is */
      decNumberCopy(res, a);		     /* copy to result */
      break;
      }

    /* Preserve status except Inexact/Rounded */
    status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));

    /* Carry out the Hull correction */
    a->exponent-=exp/2;			     /* back to 0.1->1 */

    /* a is now at final precision and within 1 ulp of the properly */
    /* rounded square root of f; to ensure proper rounding, compare */
    /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
    /* Here workset.digits=maxp and t=0.5, and a->digits determines */
    /* the ulp */
    workset.digits--;				  /* maxp-1 is OK now */
    t->exponent=-a->digits-1;			  /* make 0.5 ulp */
    decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
    workset.round=DEC_ROUND_UP;
    decMultiplyOp(b, b, b, &workset, &ignore);	  /* b = mulru(b, b) */
    decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
    if (decNumberIsNegative(b)) {		  /* f < b [i.e., b > f] */
      /* this is the more common adjustment, though both are rare */
      t->exponent++;				  /* make 1.0 ulp */
      t->lsu[0]=1;				  /* .. */
      decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
      /* assign to approx [round to length] */
      approxset.emin-=exp/2;			  /* adjust to match a */
      approxset.emax-=exp/2;
      decAddOp(a, &dzero, a, &approxset, 0, &ignore);
      }
     else {
      decAddOp(b, a, t, &workset, 0, &ignore);	  /* b = a + 0.5 ulp */
      workset.round=DEC_ROUND_DOWN;
      decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
      decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
      if (decNumberIsNegative(b)) {		  /* b < f */
	t->exponent++;				  /* make 1.0 ulp */
	t->lsu[0]=1;				  /* .. */
	decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
	/* assign to approx [round to length] */
	approxset.emin-=exp/2;			  /* adjust to match a */
	approxset.emax-=exp/2;
	decAddOp(a, &dzero, a, &approxset, 0, &ignore);
	}
      }
    /* [no errors are possible in the above, and rounding/inexact during */
    /* estimation are irrelevant, so status was not accumulated] */

    /* Here, 0.1 <= a < 1  (still), so adjust back */
    a->exponent+=exp/2;			     /* set correct exponent */

    /* count droppable zeros [after any subnormal rounding] by */
    /* trimming a copy */
    decNumberCopy(b, a);
    decTrim(b, set, 1, &dropped);	     /* [drops trailing zeros] */

    /* Set Inexact and Rounded.	 The answer can only be exact if */
    /* it is short enough so that squaring it could fit in workp digits, */
    /* and it cannot have trailing zeros due to clamping, so these are */
    /* the only (relatively rare) conditions a careful check is needed */
    if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
      status|=DEC_Inexact|DEC_Rounded;
      }
     else {				     /* could be exact/unrounded */
      uInt mstatus=0;			     /* local status */
      decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
      if (mstatus&DEC_Overflow) {	     /* result just won't fit */
	status|=DEC_Inexact|DEC_Rounded;
	}
       else {				     /* plausible */
	decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
	if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
	 else {				     /* is Exact */
	  /* here, dropped is the count of trailing zeros in 'a' */
	  /* use closest exponent to ideal... */
	  Int todrop=ideal-a->exponent;	     /* most that can be dropped */
	  if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
	   else {			     /* unrounded */
	    if (dropped<todrop) {	     /* clamp to those available */
	      todrop=dropped;
	      status|=DEC_Clamped;
	      }
	    if (todrop>0) {		     /* have some to drop */
	      decShiftToLeast(a->lsu, D2U(a->digits), todrop);
	      a->exponent+=todrop;	     /* maintain numerical value */
	      a->digits-=todrop;	     /* new length */
	      }
	    }
	  }
	}
      }

    /* double-check Underflow, as perhaps the result could not have */
    /* been subnormal (initial argument too big), or it is now Exact */
    if (status&DEC_Underflow) {
      Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
      /* check if truly subnormal */
      #if DECEXTFLAG			     /* DEC_Subnormal too */
	if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
      #else
	if (ae>=set->emin*2) status&=~DEC_Underflow;
      #endif
      /* check if truly inexact */
      if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
      }

    decNumberCopy(res, a);		     /* a is now the result */
    } while(0);				     /* end protected */

  if (allocbuff!=NULL) free(allocbuff);	     /* drop any storage used */
  if (allocbufa!=NULL) free(allocbufa);	     /* .. */
  if (allocbufb!=NULL) free(allocbufb);	     /* .. */
  #if DECSUBSET
  if (allocrhs !=NULL) free(allocrhs);	     /* .. */
  #endif
  if (status!=0) decStatus(res, status, set);/* then report status */
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberSquareRoot */

/* ------------------------------------------------------------------ */
/* decNumberSubtract -- subtract two Numbers			      */
/*								      */
/*   This computes C = A - B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X-X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*								      */
/* C must have space for set->digits digits.			      */
/* ------------------------------------------------------------------ */
decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
			      const decNumber *rhs, decContext *set) {
  uInt status=0;			/* accumulator */

  decAddOp(res, lhs, rhs, set, DECNEG, &status);
  if (status!=0) decStatus(res, status, set);
  #if DECCHECK
  decCheckInexact(res, set);
  #endif
  return res;
  } /* decNumberSubtract */

/* ------------------------------------------------------------------ */
/* decNumberToIntegralExact -- round-to-integral-value with InExact   */
/* decNumberToIntegralValue -- round-to-integral-value		      */
/*								      */
/*   res is the result						      */
/*   rhs is input number					      */
/*   set is the context						      */
/*								      */
/* res must have space for any value of rhs.			      */
/*								      */
/* This implements the IEEE special operators and therefore treats    */
/* special values as valid.  For finite numbers it returns	      */
/* rescale(rhs, 0) if rhs->exponent is <0.			      */
/* Otherwise the result is rhs (so no error is possible, except for   */
/* sNaN).							      */
/*								      */
/* The context is used for rounding mode and status after sNaN, but   */
/* the digits setting is ignored.  The Exact version will signal      */
/* Inexact if the result differs numerically from rhs; the other      */
/* never signals Inexact.					      */
/* ------------------------------------------------------------------ */
decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
				     decContext *set) {
  decNumber dn;
  decContext workset;		   /* working context */
  uInt status=0;		   /* accumulator */

  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  /* handle infinities and NaNs */
  if (SPECIALARG) {
    if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
     else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
    }
   else { /* finite */
    /* have a finite number; no error possible (res must be big enough) */
    if (rhs->exponent>=0) return decNumberCopy(res, rhs);
    /* that was easy, but if negative exponent there is work to do... */
    workset=*set;		   /* clone rounding, etc. */
    workset.digits=rhs->digits;	   /* no length rounding */
    workset.traps=0;		   /* no traps */
    decNumberZero(&dn);		   /* make a number with exponent 0 */
    decNumberQuantize(res, rhs, &dn, &workset);
    status|=workset.status;
    }
  if (status!=0) decStatus(res, status, set);
  return res;
  } /* decNumberToIntegralExact */

decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
				     decContext *set) {
  decContext workset=*set;	   /* working context */
  workset.traps=0;		   /* no traps */
  decNumberToIntegralExact(res, rhs, &workset);
  /* this never affects set, except for sNaNs; NaN will have been set */
  /* or propagated already, so no need to call decStatus */
  set->status|=workset.status&DEC_Invalid_operation;
  return res;
  } /* decNumberToIntegralValue */

/* ------------------------------------------------------------------ */
/* decNumberXor -- XOR two Numbers, digitwise			      */
/*								      */
/*   This computes C = A ^ B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X^X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context (used for result length and error report)     */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Logical function restrictions apply (see above); a NaN is	      */
/* returned with Invalid_operation if a restriction is violated.      */
/* ------------------------------------------------------------------ */
decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set) {
  const Unit *ua, *ub;			/* -> operands */
  const Unit *msua, *msub;		/* -> operand msus */
  Unit	*uc, *msuc;			/* -> result and its msu */
  Int	msudigs;			/* digits in res msu */
  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    decStatus(res, DEC_Invalid_operation, set);
    return res;
    }
  /* operands are valid */
  ua=lhs->lsu;				/* bottom-up */
  ub=rhs->lsu;				/* .. */
  uc=res->lsu;				/* .. */
  msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
  msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
  msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
  msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
  for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
    Unit a, b;				/* extract units */
    if (ua>msua) a=0;
     else a=*ua;
    if (ub>msub) b=0;
     else b=*ub;
    *uc=0;				/* can now write back */
    if (a|b) {				/* maybe 1 bits to examine */
      Int i, j;
      /* This loop could be unrolled and/or use BIN2BCD tables */
      for (i=0; i<DECDPUN; i++) {
	if ((a^b)&1) *uc=*uc+(Unit)powers[i];	  /* effect XOR */
	j=a%10;
	a=a/10;
	j|=b%10;
	b=b/10;
	if (j>1) {
	  decStatus(res, DEC_Invalid_operation, set);
	  return res;
	  }
	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
	} /* each digit */
      } /* non-zero */
    } /* each unit */
  /* [here uc-1 is the msu of the result] */
  res->digits=decGetDigits(res->lsu, uc-res->lsu);
  res->exponent=0;			/* integer */
  res->bits=0;				/* sign=0 */
  return res;  /* [no status to set] */
  } /* decNumberXor */


/* ================================================================== */
/* Utility routines						      */
/* ================================================================== */

/* ------------------------------------------------------------------ */
/* decNumberClass -- return the decClass of a decNumber		      */
/*   dn -- the decNumber to test				      */
/*   set -- the context to use for Emin				      */
/*   returns the decClass enum					      */
/* ------------------------------------------------------------------ */
enum decClass decNumberClass(const decNumber *dn, decContext *set) {
  if (decNumberIsSpecial(dn)) {
    if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
    if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
    /* must be an infinity */
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
    return DEC_CLASS_POS_INF;
    }
  /* is finite */
  if (decNumberIsNormal(dn, set)) { /* most common */
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
    return DEC_CLASS_POS_NORMAL;
    }
  /* is subnormal or zero */
  if (decNumberIsZero(dn)) {	/* most common */
    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
    return DEC_CLASS_POS_ZERO;
    }
  if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
  return DEC_CLASS_POS_SUBNORMAL;
  } /* decNumberClass */

/* ------------------------------------------------------------------ */
/* decNumberClassToString -- convert decClass to a string	      */
/*								      */
/*  eclass is a valid decClass					      */
/*  returns a constant string describing the class (max 13+1 chars)   */
/* ------------------------------------------------------------------ */
const char *decNumberClassToString(enum decClass eclass) {
  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
  if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
  if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
  return DEC_ClassString_UN;	       /* Unknown */
  } /* decNumberClassToString */

/* ------------------------------------------------------------------ */
/* decNumberCopy -- copy a number				      */
/*								      */
/*   dest is the target decNumber				      */
/*   src  is the source decNumber				      */
/*   returns dest						      */
/*								      */
/* (dest==src is allowed and is a no-op)			      */
/* All fields are updated as required.	This is a utility operation,  */
/* so special values are unchanged and no error is possible.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {

  #if DECCHECK
  if (src==NULL) return decNumberZero(dest);
  #endif

  if (dest==src) return dest;		     /* no copy required */

  /* Use explicit assignments here as structure assignment could copy */
  /* more than just the lsu (for small DECDPUN).  This would not affect */
  /* the value of the results, but could disturb test harness spill */
  /* checking. */
  dest->bits=src->bits;
  dest->exponent=src->exponent;
  dest->digits=src->digits;
  dest->lsu[0]=src->lsu[0];
  if (src->digits>DECDPUN) {		     /* more Units to come */
    const Unit *smsup, *s;		     /* work */
    Unit  *d;				     /* .. */
    /* memcpy for the remaining Units would be safe as they cannot */
    /* overlap.	 However, this explicit loop is faster in short cases. */
    d=dest->lsu+1;			     /* -> first destination */
    smsup=src->lsu+D2U(src->digits);	     /* -> source msu+1 */
    for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
    }
  return dest;
  } /* decNumberCopy */

/* ------------------------------------------------------------------ */
/* decNumberCopyAbs -- quiet absolute value operator		      */
/*								      */
/*   This sets C = abs(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*								      */
/* C must have space for set->digits digits.			      */
/* No exception or error can occur; this is a quiet bitwise operation.*/
/* See also decNumberAbs for a checking version of this.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
  #endif
  decNumberCopy(res, rhs);
  res->bits&=~DECNEG;			/* turn off sign */
  return res;
  } /* decNumberCopyAbs */

/* ------------------------------------------------------------------ */
/* decNumberCopyNegate -- quiet negate value operator		      */
/*								      */
/*   This sets C = negate(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*								      */
/* C must have space for set->digits digits.			      */
/* No exception or error can occur; this is a quiet bitwise operation.*/
/* See also decNumberMinus for a checking version of this.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
  #endif
  decNumberCopy(res, rhs);
  res->bits^=DECNEG;			/* invert the sign */
  return res;
  } /* decNumberCopyNegate */

/* ------------------------------------------------------------------ */
/* decNumberCopySign -- quiet copy and set sign operator	      */
/*								      */
/*   This sets C = A with the sign of B				      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   lhs is A							      */
/*   rhs is B							      */
/*								      */
/* C must have space for set->digits digits.			      */
/* No exception or error can occur; this is a quiet bitwise operation.*/
/* ------------------------------------------------------------------ */
decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
			      const decNumber *rhs) {
  uByte sign;				/* rhs sign */
  #if DECCHECK
  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
  #endif
  sign=rhs->bits & DECNEG;		/* save sign bit */
  decNumberCopy(res, lhs);
  res->bits&=~DECNEG;			/* clear the sign */
  res->bits|=sign;			/* set from rhs */
  return res;
  } /* decNumberCopySign */

/* ------------------------------------------------------------------ */
/* decNumberGetBCD -- get the coefficient in BCD8		      */
/*   dn is the source decNumber					      */
/*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
/*     most-significant at offset 0				      */
/*   returns bcd						      */
/*								      */
/* bcd must have at least dn->digits bytes.  No error is possible; if */
/* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
/* ------------------------------------------------------------------ */
uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
  uByte *ub=bcd+dn->digits-1;	   /* -> lsd */
  const Unit *up=dn->lsu;	   /* Unit pointer, -> lsu */

  #if DECDPUN==1		   /* trivial simple copy */
    for (; ub>=bcd; ub--, up++) *ub=*up;
  #else				   /* chopping needed */
    uInt u=*up;			   /* work */
    uInt cut=DECDPUN;		   /* downcounter through unit */
    for (; ub>=bcd; ub--) {
      *ub=(uByte)(u%10);	   /* [*6554 trick inhibits, here] */
      u=u/10;
      cut--;
      if (cut>0) continue;	   /* more in this unit */
      up++;
      u=*up;
      cut=DECDPUN;
      }
  #endif
  return bcd;
  } /* decNumberGetBCD */

/* ------------------------------------------------------------------ */
/* decNumberSetBCD -- set (replace) the coefficient from BCD8	      */
/*   dn is the target decNumber					      */
/*   bcd is the uInt array that will source n BCD bytes, most-	      */
/*     significant at offset 0					      */
/*   n is the number of digits in the source BCD array (bcd)	      */
/*   returns dn							      */
/*								      */
/* dn must have space for at least n digits.  No error is possible;   */
/* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
/* and bcd[0] zero.						      */
/* ------------------------------------------------------------------ */
decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
  Unit *up=dn->lsu+D2U(dn->digits)-1;	/* -> msu [target pointer] */
  const uByte *ub=bcd;			/* -> source msd */

  #if DECDPUN==1			/* trivial simple copy */
    for (; ub<bcd+n; ub++, up--) *up=*ub;
  #else					/* some assembly needed */
    /* calculate how many digits in msu, and hence first cut */
    Int cut=MSUDIGITS(n);		/* [faster than remainder] */
    for (;up>=dn->lsu; up--) {		/* each Unit from msu */
      *up=0;				/* will take <=DECDPUN digits */
      for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
      cut=DECDPUN;			/* next Unit has all digits */
      }
  #endif
  dn->digits=n;				/* set digit count */
  return dn;
  } /* decNumberSetBCD */

/* ------------------------------------------------------------------ */
/* decNumberIsNormal -- test normality of a decNumber		      */
/*   dn is the decNumber to test				      */
/*   set is the context to use for Emin				      */
/*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise	      */
/* ------------------------------------------------------------------ */
Int decNumberIsNormal(const decNumber *dn, decContext *set) {
  Int ae;				/* adjusted exponent */
  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
  #endif

  if (decNumberIsSpecial(dn)) return 0; /* not finite */
  if (decNumberIsZero(dn)) return 0;	/* not non-zero */

  ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
  if (ae<set->emin) return 0;		/* is subnormal */
  return 1;
  } /* decNumberIsNormal */

/* ------------------------------------------------------------------ */
/* decNumberIsSubnormal -- test subnormality of a decNumber	      */
/*   dn is the decNumber to test				      */
/*   set is the context to use for Emin				      */
/*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
/* ------------------------------------------------------------------ */
Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
  Int ae;				/* adjusted exponent */
  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
  #endif

  if (decNumberIsSpecial(dn)) return 0; /* not finite */
  if (decNumberIsZero(dn)) return 0;	/* not non-zero */

  ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
  if (ae<set->emin) return 1;		/* is subnormal */
  return 0;
  } /* decNumberIsSubnormal */

/* ------------------------------------------------------------------ */
/* decNumberTrim -- remove insignificant zeros			      */
/*								      */
/*   dn is the number to trim					      */
/*   returns dn							      */
/*								      */
/* All fields are updated as required.	This is a utility operation,  */
/* so special values are unchanged and no error is possible.	      */
/* ------------------------------------------------------------------ */
decNumber * decNumberTrim(decNumber *dn) {
  Int  dropped;			   /* work */
  decContext set;		   /* .. */
  #if DECCHECK
  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
  #endif
  decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
  return decTrim(dn, &set, 0, &dropped);
  } /* decNumberTrim */

/* ------------------------------------------------------------------ */
/* decNumberVersion -- return the name and version of this module     */
/*								      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
const char * decNumberVersion(void) {
  return DECVERSION;
  } /* decNumberVersion */

/* ------------------------------------------------------------------ */
/* decNumberZero -- set a number to 0				      */
/*								      */
/*   dn is the number to set, with space for one digit		      */
/*   returns dn							      */
/*								      */
/* No error is possible.					      */
/* ------------------------------------------------------------------ */
/* Memset is not used as it is much slower in some environments. */
decNumber * decNumberZero(decNumber *dn) {

  #if DECCHECK
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
  #endif

  dn->bits=0;
  dn->exponent=0;
  dn->digits=1;
  dn->lsu[0]=0;
  return dn;
  } /* decNumberZero */

/* ================================================================== */
/* Local routines						      */
/* ================================================================== */

/* ------------------------------------------------------------------ */
/* decToString -- lay out a number into a string		      */
/*								      */
/*   dn	    is the number to lay out				      */
/*   string is where to lay out the number			      */
/*   eng    is 1 if Engineering, 0 if Scientific		      */
/*								      */
/* string must be at least dn->digits+14 characters long	      */
/* No error is possible.					      */
/*								      */
/* Note that this routine can generate a -0 or 0.000.  These are      */
/* never generated in subset to-number or arithmetic, but can occur   */
/* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).	      */
/* ------------------------------------------------------------------ */
/* If DECCHECK is enabled the string "?" is returned if a number is */
/* invalid. */
static void decToString(const decNumber *dn, char *string, Flag eng) {
  Int exp=dn->exponent;	      /* local copy */
  Int e;		      /* E-part value */
  Int pre;		      /* digits before the '.' */
  Int cut;		      /* for counting digits in a Unit */
  char *c=string;	      /* work [output pointer] */
  const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
  uInt u, pow;		      /* work */

  #if DECCHECK
  if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
    strcpy(string, "?");
    return;}
  #endif

  if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
    *c='-';
    c++;
    }
  if (dn->bits&DECSPECIAL) {	   /* Is a special value */
    if (decNumberIsInfinite(dn)) {
      strcpy(c,	  "Inf");
      strcpy(c+3, "inity");
      return;}
    /* a NaN */
    if (dn->bits&DECSNAN) {	   /* signalling NaN */
      *c='s';
      c++;
      }
    strcpy(c, "NaN");
    c+=3;			   /* step past */
    /* if not a clean non-zero coefficient, that's all there is in a */
    /* NaN string */
    if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
    /* [drop through to add integer] */
    }

  /* calculate how many digits in msu, and hence first cut */
  cut=MSUDIGITS(dn->digits);	   /* [faster than remainder] */
  cut--;			   /* power of ten for digit */

  if (exp==0) {			   /* simple integer [common fastpath] */
    for (;up>=dn->lsu; up--) {	   /* each Unit from msu */
      u=*up;			   /* contains DECDPUN digits to lay out */
      for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
      cut=DECDPUN-1;		   /* next Unit has all digits */
      }
    *c='\0';			   /* terminate the string */
    return;}

  /* non-0 exponent -- assume plain form */
  pre=dn->digits+exp;		   /* digits before '.' */
  e=0;				   /* no E */
  if ((exp>0) || (pre<-5)) {	   /* need exponential form */
    e=exp+dn->digits-1;		   /* calculate E value */
    pre=1;			   /* assume one digit before '.' */
    if (eng && (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 (!ISZERO(dn)) pre+=adj;
       else {  /* is zero */
	if (adj!=0) {		   /* 0.00Esnn needed */
	  e=e+3;
	  pre=-(2-adj);
	  }
	} /* zero */
      } /* eng */
    } /* need exponent */

  /* lay out the digits of the coefficient, adding 0s and . as needed */
  u=*up;
  if (pre>0) {			   /* xxx.xxx or xx00 (engineering) form */
    Int n=pre;
    for (; pre>0; pre--, c++, cut--) {
      if (cut<0) {		   /* need new Unit */
	if (up==dn->lsu) break;	   /* out of input digits (pre>digits) */
	up--;
	cut=DECDPUN-1;
	u=*up;
	}
      TODIGIT(u, cut, c, pow);
      }
    if (n<dn->digits) {		   /* more to come, after '.' */
      *c='.'; c++;
      for (;; c++, cut--) {
	if (cut<0) {		   /* need new Unit */
	  if (up==dn->lsu) break;  /* out of input digits */
	  up--;
	  cut=DECDPUN-1;
	  u=*up;
	  }
	TODIGIT(u, cut, c, pow);
	}
      }
     else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
    }
   else {			   /* 0.xxx or 0.000xxx form */
    *c='0'; c++;
    *c='.'; c++;
    for (; pre<0; pre++, c++) *c='0';	/* add any 0's after '.' */
    for (; ; c++, cut--) {
      if (cut<0) {		   /* need new Unit */
	if (up==dn->lsu) break;	   /* out of input digits */
	up--;
	cut=DECDPUN-1;
	u=*up;
	}
      TODIGIT(u, cut, c, pow);
      }
    }

  /* Finally add the E-part, if needed.	 It will never be 0, has a
     base maximum and minimum of +999999999 through -999999999, but
     could range down to -1999999998 for anormal numbers */
  if (e!=0) {
    Flag had=0;		      /* 1=had non-zero */
    *c='E'; c++;
    *c='+'; c++;	      /* assume positive */
    u=e;		      /* .. */
    if (e<0) {
      *(c-1)='-';	      /* oops, need - */
      u=-e;		      /* uInt, please */
      }
    /* lay out the exponent [_itoa or equivalent is not ANSI C] */
    for (cut=9; cut>=0; cut--) {
      TODIGIT(u, cut, c, pow);
      if (*c=='0' && !had) continue;	/* skip leading zeros */
      had=1;				/* had non-0 */
      c++;				/* step for next */
      } /* cut */
    }
  *c='\0';	    /* terminate the string (all paths) */
  return;
  } /* decToString */

/* ------------------------------------------------------------------ */
/* decAddOp -- add/subtract operation				      */
/*								      */
/*   This computes C = A + B					      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*   negate is DECNEG if rhs should be negated, or 0 otherwise	      */
/*   status accumulates status for the caller			      */
/*								      */
/* C must have space for set->digits digits.			      */
/* Inexact in status must be 0 for correct Exact zero sign in result  */
/* ------------------------------------------------------------------ */
/* If possible, the coefficient is calculated directly into C.	      */
/* However, if:							      */
/*   -- a digits+1 calculation is needed because the numbers are      */
/*	unaligned and span more than set->digits digits		      */
/*   -- a carry to digits+1 digits looks possible		      */
/*   -- C is the same as A or B, and the result would destructively   */
/*	overlap the A or B coefficient				      */
/* then the result must be calculated into a temporary buffer.	In    */
/* this case a local (stack) buffer is used if possible, and only if  */
/* too long for that does malloc become the final resort.	      */
/*								      */
/* Misalignment is handled as follows:				      */
/*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
/*   BPad: Apply the padding by a combination of shifting (whole      */
/*	   units) and multiplication (part units).		      */
/*								      */
/* Addition, especially x=x+1, is speed-critical.		      */
/* The static buffer is larger than might be expected to allow for    */
/* calls from higher-level funtions (notable exp).		      */
/* ------------------------------------------------------------------ */
static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
			    const decNumber *rhs, decContext *set,
			    uByte negate, uInt *status) {
  #if DECSUBSET
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
  decNumber *allocrhs=NULL;	   /* .., rhs */
  #endif
  Int	rhsshift;		   /* working shift (in Units) */
  Int	maxdigits;		   /* longest logical length */
  Int	mult;			   /* multiplier */
  Int	residue;		   /* rounding accumulator */
  uByte bits;			   /* result bits */
  Flag	diffsign;		   /* non-0 if arguments have different sign */
  Unit	*acc;			   /* accumulator for result */
  Unit	accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
				   /* allocations when called from */
				   /* other operations, notable exp] */
  Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
  Int	reqdigits=set->digits;	   /* local copy; requested DIGITS */
  Int	padding;		   /* work */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operands and set lostDigits status, as needed */
      if (lhs->digits>reqdigits) {
	alloclhs=decRoundOperand(lhs, set, status);
	if (alloclhs==NULL) break;
	lhs=alloclhs;
	}
      if (rhs->digits>reqdigits) {
	allocrhs=decRoundOperand(rhs, set, status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* note whether signs differ [used all paths] */
    diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);

    /* handle infinities and NaNs */
    if (SPECIALARGS) {			/* a special bit set */
      if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
	decNaNs(res, lhs, rhs, set, status);
       else { /* one or two infinities */
	if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
	  /* two infinities with different signs is invalid */
	  if (decNumberIsInfinite(rhs) && diffsign) {
	    *status|=DEC_Invalid_operation;
	    break;
	    }
	  bits=lhs->bits & DECNEG;	/* get sign from LHS */
	  }
	 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
	bits|=DECINF;
	decNumberZero(res);
	res->bits=bits;			/* set +/- infinity */
	} /* an infinity */
      break;
      }

    /* Quick exit for add 0s; return the non-0, modified as need be */
    if (ISZERO(lhs)) {
      Int adjust;			/* work */
      Int lexp=lhs->exponent;		/* save in case LHS==RES */
      bits=lhs->bits;			/* .. */
      residue=0;			/* clear accumulator */
      decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
      res->bits^=negate;		/* flip if rhs was negated */
      #if DECSUBSET
      if (set->extended) {		/* exponents on zeros count */
      #endif
	/* exponent will be the lower of the two */
	adjust=lexp-res->exponent;	/* adjustment needed [if -ve] */
	if (ISZERO(res)) {		/* both 0: special IEEE 854 rules */
	  if (adjust<0) res->exponent=lexp;  /* set exponent */
	  /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
	  if (diffsign) {
	    if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
	     else res->bits=DECNEG;	/* preserve 0 sign */
	    }
	  }
	 else { /* non-0 res */
	  if (adjust<0) {     /* 0-padding needed */
	    if ((res->digits-adjust)>set->digits) {
	      adjust=res->digits-set->digits;	  /* to fit exactly */
	      *status|=DEC_Rounded;		  /* [but exact] */
	      }
	    res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
	    res->exponent+=adjust;		  /* set the exponent. */
	    }
	  } /* non-0 res */
      #if DECSUBSET
	} /* extended */
      #endif
      decFinish(res, set, &residue, status);	  /* clean and finalize */
      break;}

    if (ISZERO(rhs)) {			/* [lhs is non-zero] */
      Int adjust;			/* work */
      Int rexp=rhs->exponent;		/* save in case RHS==RES */
      bits=rhs->bits;			/* be clean */
      residue=0;			/* clear accumulator */
      decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
      #if DECSUBSET
      if (set->extended) {		/* exponents on zeros count */
      #endif
	/* exponent will be the lower of the two */
	/* [0-0 case handled above] */
	adjust=rexp-res->exponent;	/* adjustment needed [if -ve] */
	if (adjust<0) {	    /* 0-padding needed */
	  if ((res->digits-adjust)>set->digits) {
	    adjust=res->digits-set->digits;	/* to fit exactly */
	    *status|=DEC_Rounded;		/* [but exact] */
	    }
	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
	  res->exponent+=adjust;		/* set the exponent. */
	  }
      #if DECSUBSET
	} /* extended */
      #endif
      decFinish(res, set, &residue, status);	  /* clean and finalize */
      break;}

    /* [NB: both fastpath and mainpath code below assume these cases */
    /* (notably 0-0) have already been handled] */

    /* calculate the padding needed to align the operands */
    padding=rhs->exponent-lhs->exponent;

    /* Fastpath cases where the numbers are aligned and normal, the RHS */
    /* is all in one unit, no operand rounding is needed, and no carry, */
    /* lengthening, or borrow is needed */
    if (padding==0
	&& rhs->digits<=DECDPUN
	&& rhs->exponent>=set->emin	/* [some normals drop through] */
	&& rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
	&& rhs->digits<=reqdigits
	&& lhs->digits<=reqdigits) {
      Int partial=*lhs->lsu;
      if (!diffsign) {			/* adding */
	partial+=*rhs->lsu;
	if ((partial<=DECDPUNMAX)	/* result fits in unit */
	 && (lhs->digits>=DECDPUN ||	/* .. and no digits-count change */
	     partial<(Int)powers[lhs->digits])) { /* .. */
	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
	  *res->lsu=(Unit)partial;	/* [copy could have overwritten RHS] */
	  break;
	  }
	/* else drop out for careful add */
	}
       else {				/* signs differ */
	partial-=*rhs->lsu;
	if (partial>0) { /* no borrow needed, and non-0 result */
	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
	  *res->lsu=(Unit)partial;
	  /* this could have reduced digits [but result>0] */
	  res->digits=decGetDigits(res->lsu, D2U(res->digits));
	  break;
	  }
	/* else drop out for careful subtract */
	}
      }

    /* Now align (pad) the lhs or rhs so they can be added or */
    /* subtracted, as necessary.  If one number is much larger than */
    /* the other (that is, if in plain form there is a least one */
    /* digit between the lowest digit of one and the highest of the */
    /* other) padding with up to DIGITS-1 trailing zeros may be */
    /* needed; then apply rounding (as exotic rounding modes may be */
    /* affected by the residue). */
    rhsshift=0;		      /* rhs shift to left (padding) in Units */
    bits=lhs->bits;	      /* assume sign is that of LHS */
    mult=1;		      /* likely multiplier */

    /* [if padding==0 the operands are aligned; no padding is needed] */
    if (padding!=0) {
      /* some padding needed; always pad the RHS, as any required */
      /* padding can then be effected by a simple combination of */
      /* shifts and a multiply */
      Flag swapped=0;
      if (padding<0) {			/* LHS needs the padding */
	const decNumber *t;
	padding=-padding;		/* will be +ve */
	bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
	t=lhs; lhs=rhs; rhs=t;
	swapped=1;
	}

      /* If, after pad, rhs would be longer than lhs by digits+1 or */
      /* more then lhs cannot affect the answer, except as a residue, */
      /* so only need to pad up to a length of DIGITS+1. */
      if (rhs->digits+padding > lhs->digits+reqdigits+1) {
	/* The RHS is sufficient */
	/* for residue use the relative sign indication... */
	Int shift=reqdigits-rhs->digits;     /* left shift needed */
	residue=1;			     /* residue for rounding */
	if (diffsign) residue=-residue;	     /* signs differ */
	/* copy, shortening if necessary */
	decCopyFit(res, rhs, set, &residue, status);
	/* if it was already shorter, then need to pad with zeros */
	if (shift>0) {
	  res->digits=decShiftToMost(res->lsu, res->digits, shift);
	  res->exponent-=shift;		     /* adjust the exponent. */
	  }
	/* flip the result sign if unswapped and rhs was negated */
	if (!swapped) res->bits^=negate;
	decFinish(res, set, &residue, status);	  /* done */
	break;}

      /* LHS digits may affect result */
      rhsshift=D2U(padding+1)-1;	/* this much by Unit shift .. */
      mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
      } /* padding needed */

    if (diffsign) mult=-mult;		/* signs differ */

    /* determine the longer operand */
    maxdigits=rhs->digits+padding;	/* virtual length of RHS */
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;

    /* Decide on the result buffer to use; if possible place directly */
    /* into result. */
    acc=res->lsu;			/* assume add direct to result */
    /* If destructive overlap, or the number is too long, or a carry or */
    /* borrow to DIGITS+1 might be possible, a buffer must be used. */
    /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
    if ((maxdigits>=reqdigits)		/* is, or could be, too large */
     || (res==rhs && rhsshift>0)) {	/* destructive overlap */
      /* buffer needed, choose it; units for maxdigits digits will be */
      /* needed, +1 Unit for carry or borrow */
      Int need=D2U(maxdigits)+1;
      acc=accbuff;			/* assume use local buffer */
      if (need*sizeof(Unit)>sizeof(accbuff)) {
	/* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
	allocacc=(Unit *)malloc(need*sizeof(Unit));
	if (allocacc==NULL) {		/* hopeless -- abandon */
	  *status|=DEC_Insufficient_storage;
	  break;}
	acc=allocacc;
	}
      }

    res->bits=(uByte)(bits&DECNEG);	/* it's now safe to overwrite.. */
    res->exponent=lhs->exponent;	/* .. operands (even if aliased) */

    #if DECTRACE
      decDumpAr('A', lhs->lsu, D2U(lhs->digits));
      decDumpAr('B', rhs->lsu, D2U(rhs->digits));
      printf("	:h: %ld %ld\n", rhsshift, mult);
    #endif

    /* add [A+B*m] or subtract [A+B*(-m)] */
    res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
			      rhs->lsu, D2U(rhs->digits),
			      rhsshift, acc, mult)
	       *DECDPUN;	   /* [units -> digits] */
    if (res->digits<0) {	   /* borrowed... */
      res->digits=-res->digits;
      res->bits^=DECNEG;	   /* flip the sign */
      }
    #if DECTRACE
      decDumpAr('+', acc, D2U(res->digits));
    #endif

    /* If a buffer was used the result must be copied back, possibly */
    /* shortening.  (If no buffer was used then the result must have */
    /* fit, so can't need rounding and residue must be 0.) */
    residue=0;			   /* clear accumulator */
    if (acc!=res->lsu) {
      #if DECSUBSET
      if (set->extended) {	   /* round from first significant digit */
      #endif
	/* remove leading zeros that were added due to rounding up to */
	/* integral Units -- before the test for rounding. */
	if (res->digits>reqdigits)
	  res->digits=decGetDigits(acc, D2U(res->digits));
	decSetCoeff(res, set, acc, res->digits, &residue, status);
      #if DECSUBSET
	}
       else { /* subset arithmetic rounds from original significant digit */
	/* May have an underestimate.  This only occurs when both */
	/* numbers fit in DECDPUN digits and are padding with a */
	/* negative multiple (-10, -100...) and the top digit(s) become */
	/* 0.  (This only matters when using X3.274 rules where the */
	/* leading zero could be included in the rounding.) */
	if (res->digits<maxdigits) {
	  *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
	  res->digits=maxdigits;
	  }
	 else {
	  /* remove leading zeros that added due to rounding up to */
	  /* integral Units (but only those in excess of the original */
	  /* maxdigits length, unless extended) before test for rounding. */
	  if (res->digits>reqdigits) {
	    res->digits=decGetDigits(acc, D2U(res->digits));
	    if (res->digits<maxdigits) res->digits=maxdigits;
	    }
	  }
	decSetCoeff(res, set, acc, res->digits, &residue, status);
	/* Now apply rounding if needed before removing leading zeros. */
	/* This is safe because subnormals are not a possibility */
	if (residue!=0) {
	  decApplyRound(res, set, residue, status);
	  residue=0;		     /* did what needed to be done */
	  }
	} /* subset */
      #endif
      } /* used buffer */

    /* strip leading zeros [these were left on in case of subset subtract] */
    res->digits=decGetDigits(res->lsu, D2U(res->digits));

    /* apply checks and rounding */
    decFinish(res, set, &residue, status);

    /* "When the sum of two operands with opposite signs is exactly */
    /* zero, the sign of that sum shall be '+' in all rounding modes */
    /* except round toward -Infinity, in which mode that sign shall be */
    /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
    if (ISZERO(res) && diffsign
     #if DECSUBSET
     && set->extended
     #endif
     && (*status&DEC_Inexact)==0) {
      if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
				  else res->bits&=~DECNEG;  /* sign + */
      }
    } while(0);				     /* end protected */

  if (allocacc!=NULL) free(allocacc);	     /* drop any storage used */
  #if DECSUBSET
  if (allocrhs!=NULL) free(allocrhs);	     /* .. */
  if (alloclhs!=NULL) free(alloclhs);	     /* .. */
  #endif
  return res;
  } /* decAddOp */

/* ------------------------------------------------------------------ */
/* decDivideOp -- division operation				      */
/*								      */
/*  This routine performs the calculations for all four division      */
/*  operators (divide, divideInteger, remainder, remainderNear).      */
/*								      */
/*  C=A op B							      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*   op	 is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
/*   status is the usual accumulator				      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* ------------------------------------------------------------------ */
/*   The underlying algorithm of this routine is the same as in the   */
/*   1981 S/370 implementation, that is, non-restoring long division  */
/*   with bi-unit (rather than bi-digit) estimation for each unit     */
/*   multiplier.  In this pseudocode overview, complications for the  */
/*   Remainder operators and division residues for exact rounding are */
/*   omitted for clarity.					      */
/*								      */
/*     Prepare operands and handle special values		      */
/*     Test for x/0 and then 0/x				      */
/*     Exp =Exp1 - Exp2						      */
/*     Exp =Exp +len(var1) -len(var2)				      */
/*     Sign=Sign1 * Sign2					      */
/*     Pad accumulator (Var1) to double-length with 0's (pad1)	      */
/*     Pad Var2 to same length as Var1				      */
/*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
/*     have=0							      */
/*     Do until (have=digits+1 OR residue=0)			      */
/*	 if exp<0 then if integer divide/residue then leave	      */
/*	 this_unit=0						      */
/*	 Do forever						      */
/*	    compare numbers					      */
/*	    if <0 then leave inner_loop				      */
/*	    if =0 then (* quick exit without subtract *) do	      */
/*	       this_unit=this_unit+1; output this_unit		      */
/*	       leave outer_loop; end				      */
/*	    Compare lengths of numbers (mantissae):		      */
/*	    If same then tops2=msu2pair -- {units 1&2 of var2}	      */
/*		    else tops2=msu2plus -- {0, unit 1 of var2}	      */
/*	    tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
/*	    mult=tops1/tops2  -- Good and safe guess at divisor	      */
/*	    if mult=0 then mult=1				      */
/*	    this_unit=this_unit+mult				      */
/*	    subtract						      */
/*	    end inner_loop					      */
/*	  if have\=0 | this_unit\=0 then do			      */
/*	    output this_unit					      */
/*	    have=have+1; end					      */
/*	  var2=var2/10						      */
/*	  exp=exp-1						      */
/*	  end outer_loop					      */
/*     exp=exp+1   -- set the proper exponent			      */
/*     if have=0 then generate answer=0				      */
/*     Return (Result is defined by Var1)			      */
/*								      */
/* ------------------------------------------------------------------ */
/* Two working buffers are needed during the division; one (digits+   */
/* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
/* long subtractions.  These are acc and var1 respectively.	      */
/* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
/* The static buffers may be larger than might be expected to allow   */
/* for calls from higher-level funtions (notable exp).		      */
/* ------------------------------------------------------------------ */
static decNumber * decDivideOp(decNumber *res,
			       const decNumber *lhs, const decNumber *rhs,
			       decContext *set, Flag op, uInt *status) {
  #if DECSUBSET
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
  decNumber *allocrhs=NULL;	   /* .., rhs */
  #endif
  Unit	accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
  Unit	*acc=accbuff;		   /* -> accumulator array for result */
  Unit	*allocacc=NULL;		   /* -> allocated buffer, iff allocated */
  Unit	*accnext;		   /* -> where next digit will go */
  Int	acclength;		   /* length of acc needed [Units] */
  Int	accunits;		   /* count of units accumulated */
  Int	accdigits;		   /* count of digits accumulated */

  Unit	varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
  Unit	*var1=varbuff;		   /* -> var1 array for long subtraction */
  Unit	*varalloc=NULL;		   /* -> allocated buffer, iff used */
  Unit	*msu1;			   /* -> msu of var1 */

  const Unit *var2;		   /* -> var2 array */
  const Unit *msu2;		   /* -> msu of var2 */
  Int	msu2plus;		   /* msu2 plus one [does not vary] */
  eInt	msu2pair;		   /* msu2 pair plus one [does not vary] */

  Int	var1units, var2units;	   /* actual lengths */
  Int	var2ulen;		   /* logical length (units) */
  Int	var1initpad=0;		   /* var1 initial padding (digits) */
  Int	maxdigits;		   /* longest LHS or required acc length */
  Int	mult;			   /* multiplier for subtraction */
  Unit	thisunit;		   /* current unit being accumulated */
  Int	residue;		   /* for rounding */
  Int	reqdigits=set->digits;	   /* requested DIGITS */
  Int	exponent;		   /* working exponent */
  Int	maxexponent=0;		   /* DIVIDE maximum exponent if unrounded */
  uByte bits;			   /* working sign */
  Unit	*target;		   /* work */
  const Unit *source;		   /* .. */
  uInt	const *pow;		   /* .. */
  Int	shift, cut;		   /* .. */
  #if DECSUBSET
  Int	dropped;		   /* work */
  #endif

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operands and set lostDigits status, as needed */
      if (lhs->digits>reqdigits) {
	alloclhs=decRoundOperand(lhs, set, status);
	if (alloclhs==NULL) break;
	lhs=alloclhs;
	}
      if (rhs->digits>reqdigits) {
	allocrhs=decRoundOperand(rhs, set, status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    bits=(lhs->bits^rhs->bits)&DECNEG;	/* assumed sign for divisions */

    /* handle infinities and NaNs */
    if (SPECIALARGS) {			/* a special bit set */
      if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
	decNaNs(res, lhs, rhs, set, status);
	break;
	}
      /* one or two infinities */
      if (decNumberIsInfinite(lhs)) {	/* LHS (dividend) is infinite */
	if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
	    op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
	  *status|=DEC_Invalid_operation;
	  break;
	  }
	/* [Note that infinity/0 raises no exceptions] */
	decNumberZero(res);
	res->bits=bits|DECINF;		/* set +/- infinity */
	break;
	}
       else {				/* RHS (divisor) is infinite */
	residue=0;
	if (op&(REMAINDER|REMNEAR)) {
	  /* result is [finished clone of] lhs */
	  decCopyFit(res, lhs, set, &residue, status);
	  }
	 else {	 /* a division */
	  decNumberZero(res);
	  res->bits=bits;		/* set +/- zero */
	  /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
	  /* is a 0 with infinitely negative exponent, clamped to minimum */
	  if (op&DIVIDE) {
	    res->exponent=set->emin-set->digits+1;
	    *status|=DEC_Clamped;
	    }
	  }
	decFinish(res, set, &residue, status);
	break;
	}
      }

    /* handle 0 rhs (x/0) */
    if (ISZERO(rhs)) {			/* x/0 is always exceptional */
      if (ISZERO(lhs)) {
	decNumberZero(res);		/* [after lhs test] */
	*status|=DEC_Division_undefined;/* 0/0 will become NaN */
	}
       else {
	decNumberZero(res);
	if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
	 else {
	  *status|=DEC_Division_by_zero; /* x/0 */
	  res->bits=bits|DECINF;	 /* .. is +/- Infinity */
	  }
	}
      break;}

    /* handle 0 lhs (0/x) */
    if (ISZERO(lhs)) {			/* 0/x [x!=0] */
      #if DECSUBSET
      if (!set->extended) decNumberZero(res);
       else {
      #endif
	if (op&DIVIDE) {
	  residue=0;
	  exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
	  decNumberCopy(res, lhs);	/* [zeros always fit] */
	  res->bits=bits;		/* sign as computed */
	  res->exponent=exponent;	/* exponent, too */
	  decFinalize(res, set, &residue, status);   /* check exponent */
	  }
	 else if (op&DIVIDEINT) {
	  decNumberZero(res);		/* integer 0 */
	  res->bits=bits;		/* sign as computed */
	  }
	 else {				/* a remainder */
	  exponent=rhs->exponent;	/* [save in case overwrite] */
	  decNumberCopy(res, lhs);	/* [zeros always fit] */
	  if (exponent<res->exponent) res->exponent=exponent; /* use lower */
	  }
      #if DECSUBSET
	}
      #endif
      break;}

    /* Precalculate exponent.  This starts off adjusted (and hence fits */
    /* in 31 bits) and becomes the usual unadjusted exponent as the */
    /* division proceeds.  The order of evaluation is important, here, */
    /* to avoid wrap. */
    exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);

    /* If the working exponent is -ve, then some quick exits are */
    /* possible because the quotient is known to be <1 */
    /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
    if (exponent<0 && !(op==DIVIDE)) {
      if (op&DIVIDEINT) {
	decNumberZero(res);		     /* integer part is 0 */
	#if DECSUBSET
	if (set->extended)
	#endif
	  res->bits=bits;		     /* set +/- zero */
	break;}
      /* fastpath remainders so long as the lhs has the smaller */
      /* (or equal) exponent */
      if (lhs->exponent<=rhs->exponent) {
	if (op&REMAINDER || exponent<-1) {
	  /* It is REMAINDER or safe REMNEAR; result is [finished */
	  /* clone of] lhs  (r = x - 0*y) */
	  residue=0;
	  decCopyFit(res, lhs, set, &residue, status);
	  decFinish(res, set, &residue, status);
	  break;
	  }
	/* [unsafe REMNEAR drops through] */
	}
      } /* fastpaths */

    /* Long (slow) division is needed; roll up the sleeves... */

    /* The accumulator will hold the quotient of the division. */
    /* If it needs to be too long for stack storage, then allocate. */
    acclength=D2U(reqdigits+DECDPUN);	/* in Units */
    if (acclength*sizeof(Unit)>sizeof(accbuff)) {
      /* printf("malloc dvacc %ld units\n", acclength); */
      allocacc=(Unit *)malloc(acclength*sizeof(Unit));
      if (allocacc==NULL) {		/* hopeless -- abandon */
	*status|=DEC_Insufficient_storage;
	break;}
      acc=allocacc;			/* use the allocated space */
      }

    /* var1 is the padded LHS ready for subtractions. */
    /* If it needs to be too long for stack storage, then allocate. */
    /* The maximum units needed for var1 (long subtraction) is: */
    /* Enough for */
    /*	   (rhs->digits+reqdigits-1) -- to allow full slide to right */
    /* or  (lhs->digits)	     -- to allow for long lhs */
    /* whichever is larger */
    /*	 +1		   -- for rounding of slide to right */
    /*	 +1		   -- for leading 0s */
    /*	 +1		   -- for pre-adjust if a remainder or DIVIDEINT */
    /* [Note: unused units do not participate in decUnitAddSub data] */
    maxdigits=rhs->digits+reqdigits-1;
    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
    var1units=D2U(maxdigits)+2;
    /* allocate a guard unit above msu1 for REMAINDERNEAR */
    if (!(op&DIVIDE)) var1units++;
    if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
      /* printf("malloc dvvar %ld units\n", var1units+1); */
      varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
      if (varalloc==NULL) {		/* hopeless -- abandon */
	*status|=DEC_Insufficient_storage;
	break;}
      var1=varalloc;			/* use the allocated space */
      }

    /* Extend the lhs and rhs to full long subtraction length.	The lhs */
    /* is truly extended into the var1 buffer, with 0 padding, so a */
    /* subtract in place is always possible.  The rhs (var2) has */
    /* virtual padding (implemented by decUnitAddSub). */
    /* One guard unit was allocated above msu1 for rem=rem+rem in */
    /* REMAINDERNEAR. */
    msu1=var1+var1units-1;		/* msu of var1 */
    source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
    for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
    for (; target>=var1; target--) *target=0;

    /* rhs (var2) is left-aligned with var1 at the start */
    var2ulen=var1units;			/* rhs logical length (units) */
    var2units=D2U(rhs->digits);		/* rhs actual length (units) */
    var2=rhs->lsu;			/* -> rhs array */
    msu2=var2+var2units-1;		/* -> msu of var2 [never changes] */
    /* now set up the variables which will be used for estimating the */
    /* multiplication factor.  If these variables are not exact, add */
    /* 1 to make sure that the multiplier is never overestimated. */
    msu2plus=*msu2;			/* it's value .. */
    if (var2units>1) msu2plus++;	/* .. +1 if any more */
    msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
    if (var2units>1) {			/* .. [else treat 2nd as 0] */
      msu2pair+=*(msu2-1);		/* .. */
      if (var2units>2) msu2pair++;	/* .. +1 if any more */
      }

    /* The calculation is working in units, which may have leading zeros, */
    /* but the exponent was calculated on the assumption that they are */
    /* both left-aligned.  Adjust the exponent to compensate: add the */
    /* number of leading zeros in var1 msu and subtract those in var2 msu. */
    /* [This is actually done by counting the digits and negating, as */
    /* lead1=DECDPUN-digits1, and similarly for lead2.] */
    for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
    for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;

    /* Now, if doing an integer divide or remainder, ensure that */
    /* the result will be Unit-aligned.	 To do this, shift the var1 */
    /* accumulator towards least if need be.  (It's much easier to */
    /* do this now than to reassemble the residue afterwards, if */
    /* doing a remainder.)  Also ensure the exponent is not negative. */
    if (!(op&DIVIDE)) {
      Unit *u;				/* work */
      /* save the initial 'false' padding of var1, in digits */
      var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
      /* Determine the shift to do. */
      if (exponent<0) cut=-exponent;
       else cut=DECDPUN-exponent%DECDPUN;
      decShiftToLeast(var1, var1units, cut);
      exponent+=cut;			/* maintain numerical value */
      var1initpad-=cut;			/* .. and reduce padding */
      /* clean any most-significant units which were just emptied */
      for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
      } /* align */
     else { /* is DIVIDE */
      maxexponent=lhs->exponent-rhs->exponent;	  /* save */
      /* optimization: if the first iteration will just produce 0, */
      /* preadjust to skip it [valid for DIVIDE only] */
      if (*msu1<*msu2) {
	var2ulen--;			/* shift down */
	exponent-=DECDPUN;		/* update the exponent */
	}
      }

    /* ---- start the long-division loops ------------------------------ */
    accunits=0;				/* no units accumulated yet */
    accdigits=0;			/* .. or digits */
    accnext=acc+acclength-1;		/* -> msu of acc [NB: allows digits+1] */
    for (;;) {				/* outer forever loop */
      thisunit=0;			/* current unit assumed 0 */
      /* find the next unit */
      for (;;) {			/* inner forever loop */
	/* strip leading zero units [from either pre-adjust or from */
	/* subtract last time around].	Leave at least one unit. */
	for (; *msu1==0 && msu1>var1; msu1--) var1units--;

	if (var1units<var2ulen) break;	     /* var1 too low for subtract */
	if (var1units==var2ulen) {	     /* unit-by-unit compare needed */
	  /* compare the two numbers, from msu */
	  const Unit *pv1, *pv2;
	  Unit v2;			     /* units to compare */
	  pv2=msu2;			     /* -> msu */
	  for (pv1=msu1; ; pv1--, pv2--) {
	    /* v1=*pv1 -- always OK */
	    v2=0;			     /* assume in padding */
	    if (pv2>=var2) v2=*pv2;	     /* in range */
	    if (*pv1!=v2) break;	     /* no longer the same */
	    if (pv1==var1) break;	     /* done; leave pv1 as is */
	    }
	  /* here when all inspected or a difference seen */
	  if (*pv1<v2) break;		     /* var1 too low to subtract */
	  if (*pv1==v2) {		     /* var1 == var2 */
	    /* reach here if var1 and var2 are identical; subtraction */
	    /* would increase digit by one, and the residue will be 0 so */
	    /* the calculation is done; leave the loop with residue=0. */
	    thisunit++;			     /* as though subtracted */
	    *var1=0;			     /* set var1 to 0 */
	    var1units=1;		     /* .. */
	    break;  /* from inner */
	    } /* var1 == var2 */
	  /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
	  /* Estimate the multiplier (there's always a msu1-1)... */
	  /* Bring in two units of var2 to provide a good estimate. */
	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
	  } /* lengths the same */
	 else { /* var1units > var2ulen, so subtraction is safe */
	  /* The var2 msu is one unit towards the lsu of the var1 msu, */
	  /* so only one unit for var2 can be used. */
	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
	  }
	if (mult==0) mult=1;		     /* must always be at least 1 */
	/* subtraction needed; var1 is > var2 */
	thisunit=(Unit)(thisunit+mult);	     /* accumulate */
	/* subtract var1-var2, into var1; only the overlap needs */
	/* processing, as this is an in-place calculation */
	shift=var2ulen-var2units;
	#if DECTRACE
	  decDumpAr('1', &var1[shift], var1units-shift);
	  decDumpAr('2', var2, var2units);
	  printf("m=%ld\n", -mult);
	#endif
	decUnitAddSub(&var1[shift], var1units-shift,
		      var2, var2units, 0,
		      &var1[shift], -mult);
	#if DECTRACE
	  decDumpAr('#', &var1[shift], var1units-shift);
	#endif
	/* var1 now probably has leading zeros; these are removed at the */
	/* top of the inner loop. */
	} /* inner loop */

      /* The next unit has been calculated in full; unless it's a */
      /* leading zero, add to acc */
      if (accunits!=0 || thisunit!=0) {	     /* is first or non-zero */
	*accnext=thisunit;		     /* store in accumulator */
	/* account exactly for the new digits */
	if (accunits==0) {
	  accdigits++;			     /* at least one */
	  for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
	  }
	 else accdigits+=DECDPUN;
	accunits++;			     /* update count */
	accnext--;			     /* ready for next */
	if (accdigits>reqdigits) break;	     /* have enough digits */
	}

      /* if the residue is zero, the operation is done (unless divide */
      /* or divideInteger and still not enough digits yet) */
      if (*var1==0 && var1units==1) {	     /* residue is 0 */
	if (op&(REMAINDER|REMNEAR)) break;
	if ((op&DIVIDE) && (exponent<=maxexponent)) break;
	/* [drop through if divideInteger] */
	}
      /* also done enough if calculating remainder or integer */
      /* divide and just did the last ('units') unit */
      if (exponent==0 && !(op&DIVIDE)) break;

      /* to get here, var1 is less than var2, so divide var2 by the per- */
      /* Unit power of ten and go for the next digit */
      var2ulen--;			     /* shift down */
      exponent-=DECDPUN;		     /* update the exponent */
      } /* outer loop */

    /* ---- division is complete --------------------------------------- */
    /* here: acc      has at least reqdigits+1 of good results (or fewer */
    /*		      if early stop), starting at accnext+1 (its lsu) */
    /*	     var1     has any residue at the stopping point */
    /*	     accunits is the number of digits collected in acc */
    if (accunits==0) {		   /* acc is 0 */
      accunits=1;		   /* show have a unit .. */
      accdigits=1;		   /* .. */
      *accnext=0;		   /* .. whose value is 0 */
      }
     else accnext++;		   /* back to last placed */
    /* accnext now -> lowest unit of result */

    residue=0;			   /* assume no residue */
    if (op&DIVIDE) {
      /* record the presence of any residue, for rounding */
      if (*var1!=0 || var1units>1) residue=1;
       else { /* no residue */
	/* Had an exact division; clean up spurious trailing 0s. */
	/* There will be at most DECDPUN-1, from the final multiply, */
	/* and then only if the result is non-0 (and even) and the */
	/* exponent is 'loose'. */
	#if DECDPUN>1
	Unit lsu=*accnext;
	if (!(lsu&0x01) && (lsu!=0)) {
	  /* count the trailing zeros */
	  Int drop=0;
	  for (;; drop++) {    /* [will terminate because lsu!=0] */
	    if (exponent>=maxexponent) break;	  /* don't chop real 0s */
	    #if DECDPUN<=4
	      if ((lsu-QUOT10(lsu, drop+1)
		  *powers[drop+1])!=0) break;	  /* found non-0 digit */
	    #else
	      if (lsu%powers[drop+1]!=0) break;	  /* found non-0 digit */
	    #endif
	    exponent++;
	    }
	  if (drop>0) {
	    accunits=decShiftToLeast(accnext, accunits, drop);
	    accdigits=decGetDigits(accnext, accunits);
	    accunits=D2U(accdigits);
	    /* [exponent was adjusted in the loop] */
	    }
	  } /* neither odd nor 0 */
	#endif
	} /* exact divide */
      } /* divide */
     else /* op!=DIVIDE */ {
      /* check for coefficient overflow */
      if (accdigits+exponent>reqdigits) {
	*status|=DEC_Division_impossible;
	break;
	}
      if (op & (REMAINDER|REMNEAR)) {
	/* [Here, the exponent will be 0, because var1 was adjusted */
	/* appropriately.] */
	Int postshift;			     /* work */
	Flag wasodd=0;			     /* integer was odd */
	Unit *quotlsu;			     /* for save */
	Int  quotdigits;		     /* .. */

	bits=lhs->bits;			     /* remainder sign is always as lhs */

	/* Fastpath when residue is truly 0 is worthwhile [and */
	/* simplifies the code below] */
	if (*var1==0 && var1units==1) {	     /* residue is 0 */
	  Int exp=lhs->exponent;	     /* save min(exponents) */
	  if (rhs->exponent<exp) exp=rhs->exponent;
	  decNumberZero(res);		     /* 0 coefficient */
	  #if DECSUBSET
	  if (set->extended)
	  #endif
	  res->exponent=exp;		     /* .. with proper exponent */
	  res->bits=(uByte)(bits&DECNEG);	   /* [cleaned] */
	  decFinish(res, set, &residue, status);   /* might clamp */
	  break;
	  }
	/* note if the quotient was odd */
	if (*accnext & 0x01) wasodd=1;	     /* acc is odd */
	quotlsu=accnext;		     /* save in case need to reinspect */
	quotdigits=accdigits;		     /* .. */

	/* treat the residue, in var1, as the value to return, via acc */
	/* calculate the unused zero digits.  This is the smaller of: */
	/*   var1 initial padding (saved above) */
	/*   var2 residual padding, which happens to be given by: */
	postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
	/* [the 'exponent' term accounts for the shifts during divide] */
	if (var1initpad<postshift) postshift=var1initpad;

	/* shift var1 the requested amount, and adjust its digits */
	var1units=decShiftToLeast(var1, var1units, postshift);
	accnext=var1;
	accdigits=decGetDigits(var1, var1units);
	accunits=D2U(accdigits);

	exponent=lhs->exponent;		/* exponent is smaller of lhs & rhs */
	if (rhs->exponent<exponent) exponent=rhs->exponent;

	/* Now correct the result if doing remainderNear; if it */
	/* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
	/* the integer was odd then the result should be rem-rhs. */
	if (op&REMNEAR) {
	  Int compare, tarunits;	/* work */
	  Unit *up;			/* .. */
	  /* calculate remainder*2 into the var1 buffer (which has */
	  /* 'headroom' of an extra unit and hence enough space) */
	  /* [a dedicated 'double' loop would be faster, here] */
	  tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
				 0, accnext, 1);
	  /* decDumpAr('r', accnext, tarunits); */

	  /* Here, accnext (var1) holds tarunits Units with twice the */
	  /* remainder's coefficient, which must now be compared to the */
	  /* RHS.  The remainder's exponent may be smaller than the RHS's. */
	  compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
				 rhs->exponent-exponent);
	  if (compare==BADINT) {	     /* deep trouble */
	    *status|=DEC_Insufficient_storage;
	    break;}

	  /* now restore the remainder by dividing by two; the lsu */
	  /* is known to be even. */
	  for (up=accnext; up<accnext+tarunits; up++) {
	    Int half;		   /* half to add to lower unit */
	    half=*up & 0x01;
	    *up/=2;		   /* [shift] */
	    if (!half) continue;
	    *(up-1)+=(DECDPUNMAX+1)/2;
	    }
	  /* [accunits still describes the original remainder length] */

	  if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
	    Int exp, expunits, exprem;	     /* work */
	    /* This is effectively causing round-up of the quotient, */
	    /* so if it was the rare case where it was full and all */
	    /* nines, it would overflow and hence division-impossible */
	    /* should be raised */
	    Flag allnines=0;		     /* 1 if quotient all nines */
	    if (quotdigits==reqdigits) {     /* could be borderline */
	      for (up=quotlsu; ; up++) {
		if (quotdigits>DECDPUN) {
		  if (*up!=DECDPUNMAX) break;/* non-nines */
		  }
		 else {			     /* this is the last Unit */
		  if (*up==powers[quotdigits]-1) allnines=1;
		  break;
		  }
		quotdigits-=DECDPUN;	     /* checked those digits */
		} /* up */
	      } /* borderline check */
	    if (allnines) {
	      *status|=DEC_Division_impossible;
	      break;}

	    /* rem-rhs is needed; the sign will invert.	 Again, var1 */
	    /* can safely be used for the working Units array. */
	    exp=rhs->exponent-exponent;	     /* RHS padding needed */
	    /* Calculate units and remainder from exponent. */
	    expunits=exp/DECDPUN;
	    exprem=exp%DECDPUN;
	    /* subtract [A+B*(-m)]; the result will always be negative */
	    accunits=-decUnitAddSub(accnext, accunits,
				    rhs->lsu, D2U(rhs->digits),
				    expunits, accnext, -(Int)powers[exprem]);
	    accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
	    accunits=D2U(accdigits);	/* and recalculate the units for copy */
	    /* [exponent is as for original remainder] */
	    bits^=DECNEG;		/* flip the sign */
	    }
	  } /* REMNEAR */
	} /* REMAINDER or REMNEAR */
      } /* not DIVIDE */

    /* Set exponent and bits */
    res->exponent=exponent;
    res->bits=(uByte)(bits&DECNEG);	     /* [cleaned] */

    /* Now the coefficient. */
    decSetCoeff(res, set, accnext, accdigits, &residue, status);

    decFinish(res, set, &residue, status);   /* final cleanup */

    #if DECSUBSET
    /* If a divide then strip trailing zeros if subset [after round] */
    if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
    #endif
    } while(0);				     /* end protected */

  if (varalloc!=NULL) free(varalloc);	/* drop any storage used */
  if (allocacc!=NULL) free(allocacc);	/* .. */
  #if DECSUBSET
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
  #endif
  return res;
  } /* decDivideOp */

/* ------------------------------------------------------------------ */
/* decMultiplyOp -- multiplication operation			      */
/*								      */
/*  This routine performs the multiplication C=A x B.		      */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X*X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*   status is the usual accumulator				      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* ------------------------------------------------------------------ */
/* 'Classic' multiplication is used rather than Karatsuba, as the     */
/* latter would give only a minor improvement for the short numbers   */
/* expected to be handled most (and uses much more memory).	      */
/*								      */
/* There are two major paths here: the general-purpose ('old code')   */
/* path which handles all DECDPUN values, and a fastpath version      */
/* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
/* than two calls to decUnitAddSub would be made.		      */
/*								      */
/* The fastpath version lumps units together into 8-digit or 9-digit  */
/* chunks, and also uses a lazy carry strategy to minimise expensive  */
/* 64-bit divisions.  The chunks are then broken apart again into     */
/* units for continuing processing.  Despite this overhead, the	      */
/* fastpath can speed up some 16-digit operations by 10x (and much    */
/* more for higher-precision calculations).			      */
/*								      */
/* A buffer always has to be used for the accumulator; in the	      */
/* fastpath, buffers are also always needed for the chunked copies of */
/* of the operand coefficients.					      */
/* Static buffers are larger than needed just for multiply, to allow  */
/* for calls from other operations (notably exp).		      */
/* ------------------------------------------------------------------ */
#define FASTMUL (DECUSE64 && DECDPUN<5)
static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
				 const decNumber *rhs, decContext *set,
				 uInt *status) {
  Int	 accunits;		   /* Units of accumulator in use */
  Int	 exponent;		   /* work */
  Int	 residue=0;		   /* rounding residue */
  uByte	 bits;			   /* result sign */
  Unit	*acc;			   /* -> accumulator Unit array */
  Int	 needbytes;		   /* size calculator */
  void	*allocacc=NULL;		   /* -> allocated accumulator, iff allocated */
  Unit	accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
				   /* *4 for calls from other operations) */
  const Unit *mer, *mermsup;	   /* work */
  Int	madlength;		   /* Units in multiplicand */
  Int	shift;			   /* Units to shift multiplicand by */

  #if FASTMUL
    /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
    /* (DECDPUN is 2 or 4) then work in base 10**8 */
    #if DECDPUN & 1		   /* odd */
      #define FASTBASE 1000000000  /* base */
      #define FASTDIGS		9  /* digits in base */
      #define FASTLAZY	       18  /* carry resolution point [1->18] */
    #else
      #define FASTBASE	100000000
      #define FASTDIGS		8
      #define FASTLAZY	     1844  /* carry resolution point [1->1844] */
    #endif
    /* three buffers are used, two for chunked copies of the operands */
    /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
    /* lazy carry evaluation */
    uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
    uInt  *zlhi=zlhibuff;		  /* -> lhs array */
    uInt  *alloclhi=NULL;		  /* -> allocated buffer, iff allocated */
    uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
    uInt  *zrhi=zrhibuff;		  /* -> rhs array */
    uInt  *allocrhi=NULL;		  /* -> allocated buffer, iff allocated */
    uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
    /* [allocacc is shared for both paths, as only one will run] */
    uLong *zacc=zaccbuff;	   /* -> accumulator array for exact result */
    #if DECDPUN==1
    Int	   zoff;		   /* accumulator offset */
    #endif
    uInt  *lip, *rip;		   /* item pointers */
    uInt  *lmsi, *rmsi;		   /* most significant items */
    Int	   ilhs, irhs, iacc;	   /* item counts in the arrays */
    Int	   lazy;		   /* lazy carry counter */
    uLong  lcarry;		   /* uLong carry */
    uInt   carry;		   /* carry (NB not uLong) */
    Int	   count;		   /* work */
    const  Unit *cup;		   /* .. */
    Unit  *up;			   /* .. */
    uLong *lp;			   /* .. */
    Int	   p;			   /* .. */
  #endif

  #if DECSUBSET
    decNumber *alloclhs=NULL;	   /* -> allocated buffer, iff allocated */
    decNumber *allocrhs=NULL;	   /* -> allocated buffer, iff allocated */
  #endif

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  /* precalculate result sign */
  bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);

  /* handle infinities and NaNs */
  if (SPECIALARGS) {		   /* a special bit set */
    if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
      decNaNs(res, lhs, rhs, set, status);
      return res;}
    /* one or two infinities; Infinity * 0 is invalid */
    if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
      ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
      *status|=DEC_Invalid_operation;
      return res;}
    decNumberZero(res);
    res->bits=bits|DECINF;	   /* infinity */
    return res;}

  /* For best speed, as in DMSRCN [the original Rexx numerics */
  /* module], use the shorter number as the multiplier (rhs) and */
  /* the longer as the multiplicand (lhs) to minimise the number of */
  /* adds (partial products) */
  if (lhs->digits<rhs->digits) {   /* swap... */
    const decNumber *hold=lhs;
    lhs=rhs;
    rhs=hold;
    }

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operands and set lostDigits status, as needed */
      if (lhs->digits>set->digits) {
	alloclhs=decRoundOperand(lhs, set, status);
	if (alloclhs==NULL) break;
	lhs=alloclhs;
	}
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    #if FASTMUL			   /* fastpath can be used */
    /* use the fast path if there are enough digits in the shorter */
    /* operand to make the setup and takedown worthwhile */
    #define NEEDTWO (DECDPUN*2)	   /* within two decUnitAddSub calls */
    if (rhs->digits>NEEDTWO) {	   /* use fastpath... */
      /* calculate the number of elements in each array */
      ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
      irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
      iacc=ilhs+irhs;

      /* allocate buffers if required, as usual */
      needbytes=ilhs*sizeof(uInt);
      if (needbytes>(Int)sizeof(zlhibuff)) {
	alloclhi=(uInt *)malloc(needbytes);
	zlhi=alloclhi;}
      needbytes=irhs*sizeof(uInt);
      if (needbytes>(Int)sizeof(zrhibuff)) {
	allocrhi=(uInt *)malloc(needbytes);
	zrhi=allocrhi;}

      /* Allocating the accumulator space needs a special case when */
      /* DECDPUN=1 because when converting the accumulator to Units */
      /* after the multiplication each 8-byte item becomes 9 1-byte */
      /* units.	 Therefore iacc extra bytes are needed at the front */
      /* (rounded up to a multiple of 8 bytes), and the uLong */
      /* accumulator starts offset the appropriate number of units */
      /* to the right to avoid overwrite during the unchunking. */
      needbytes=iacc*sizeof(uLong);
      #if DECDPUN==1
      zoff=(iacc+7)/8;	      /* items to offset by */
      needbytes+=zoff*8;
      #endif
      if (needbytes>(Int)sizeof(zaccbuff)) {
	allocacc=(uLong *)malloc(needbytes);
	zacc=(uLong *)allocacc;}
      if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
	*status|=DEC_Insufficient_storage;
	break;}

      acc=(Unit *)zacc;	      /* -> target Unit array */
      #if DECDPUN==1
      zacc+=zoff;	      /* start uLong accumulator to right */
      #endif

      /* assemble the chunked copies of the left and right sides */
      for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
	for (p=0, *lip=0; p<FASTDIGS && count>0;
	     p+=DECDPUN, cup++, count-=DECDPUN)
	  *lip+=*cup*powers[p];
      lmsi=lip-1;     /* save -> msi */
      for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
	for (p=0, *rip=0; p<FASTDIGS && count>0;
	     p+=DECDPUN, cup++, count-=DECDPUN)
	  *rip+=*cup*powers[p];
      rmsi=rip-1;     /* save -> msi */

      /* zero the accumulator */
      for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;

      /* Start the multiplication */
      /* Resolving carries can dominate the cost of accumulating the */
      /* partial products, so this is only done when necessary. */
      /* Each uLong item in the accumulator can hold values up to */
      /* 2**64-1, and each partial product can be as large as */
      /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
      /* itself 18.4 times in a uLong without overflowing, so during */
      /* the main calculation resolution is carried out every 18th */
      /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
      /* partial products can be added to themselves 1844.6 times in */
      /* a uLong without overflowing, so intermediate carry */
      /* resolution occurs only every 14752 digits.  Hence for common */
      /* short numbers usually only the one final carry resolution */
      /* occurs. */
      /* (The count is set via FASTLAZY to simplify experiments to */
      /* measure the value of this approach: a 35% improvement on a */
      /* [34x34] multiply.) */
      lazy=FASTLAZY;			     /* carry delay count */
      for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
	lp=zacc+(rip-zrhi);		     /* where to add the lhs */
	for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
	  *lp+=(uLong)(*lip)*(*rip);	     /* [this should in-line] */
	  } /* lip loop */
	lazy--;
	if (lazy>0 && rip!=rmsi) continue;
	lazy=FASTLAZY;			     /* reset delay count */
	/* spin up the accumulator resolving overflows */
	for (lp=zacc; lp<zacc+iacc; lp++) {
	  if (*lp<FASTBASE) continue;	     /* it fits */
	  lcarry=*lp/FASTBASE;		     /* top part [slow divide] */
	  /* lcarry can exceed 2**32-1, so check again; this check */
	  /* and occasional extra divide (slow) is well worth it, as */
	  /* it allows FASTLAZY to be increased to 18 rather than 4 */
	  /* in the FASTDIGS=9 case */
	  if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
	   else { /* two-place carry [fairly rare] */
	    uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
	    *(lp+2)+=carry2;			    /* add to item+2 */
	    *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
	    carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
	    }
	  *(lp+1)+=carry;		     /* add to item above [inline] */
	  *lp-=((uLong)FASTBASE*carry);	     /* [inline] */
	  } /* carry resolution */
	} /* rip loop */

      /* The multiplication is complete; time to convert back into */
      /* units.	 This can be done in-place in the accumulator and in */
      /* 32-bit operations, because carries were resolved after the */
      /* final add.  This needs N-1 divides and multiplies for */
      /* each item in the accumulator (which will become up to N */
      /* units, where 2<=N<=9). */
      for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
	uInt item=(uInt)*lp;		     /* decapitate to uInt */
	for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
	  uInt part=item/(DECDPUNMAX+1);
	  *up=(Unit)(item-(part*(DECDPUNMAX+1)));
	  item=part;
	  } /* p */
	*up=(Unit)item; up++;		     /* [final needs no division] */
	} /* lp */
      accunits=up-acc;			     /* count of units */
      }
     else { /* here to use units directly, without chunking ['old code'] */
    #endif

      /* if accumulator will be too long for local storage, then allocate */
      acc=accbuff;		   /* -> assume buffer for accumulator */
      needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
      if (needbytes>(Int)sizeof(accbuff)) {
	allocacc=(Unit *)malloc(needbytes);
	if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
	acc=(Unit *)allocacc;		     /* use the allocated space */
	}

      /* Now the main long multiplication loop */
      /* Unlike the equivalent in the IBM Java implementation, there */
      /* is no advantage in calculating from msu to lsu.  So, do it */
      /* by the book, as it were. */
      /* Each iteration calculates ACC=ACC+MULTAND*MULT */
      accunits=1;		   /* accumulator starts at '0' */
      *acc=0;			   /* .. (lsu=0) */
      shift=0;			   /* no multiplicand shift at first */
      madlength=D2U(lhs->digits);  /* this won't change */
      mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */

      for (mer=rhs->lsu; mer<mermsup; mer++) {
	/* Here, *mer is the next Unit in the multiplier to use */
	/* If non-zero [optimization] add it... */
	if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
					    lhs->lsu, madlength, 0,
					    &acc[shift], *mer)
					    + shift;
	 else { /* extend acc with a 0; it will be used shortly */
	  *(acc+accunits)=0;	   /* [this avoids length of <=0 later] */
	  accunits++;
	  }
	/* multiply multiplicand by 10**DECDPUN for next Unit to left */
	shift++;		   /* add this for 'logical length' */
	} /* n */
    #if FASTMUL
      } /* unchunked units */
    #endif
    /* common end-path */
    #if DECTRACE
      decDumpAr('*', acc, accunits);	     /* Show exact result */
    #endif

    /* acc now contains the exact result of the multiplication, */
    /* possibly with a leading zero unit; build the decNumber from */
    /* it, noting if any residue */
    res->bits=bits;			     /* set sign */
    res->digits=decGetDigits(acc, accunits); /* count digits exactly */

    /* There can be a 31-bit wrap in calculating the exponent. */
    /* This can only happen if both input exponents are negative and */
    /* both their magnitudes are large.	 If there was a wrap, set a */
    /* safe very negative exponent, from which decFinalize() will */
    /* raise a hard underflow shortly. */
    exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
    if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
      exponent=-2*DECNUMMAXE;		     /* force underflow */
    res->exponent=exponent;		     /* OK to overwrite now */


    /* Set the coefficient.  If any rounding, residue records */
    decSetCoeff(res, set, acc, res->digits, &residue, status);
    decFinish(res, set, &residue, status);   /* final cleanup */
    } while(0);				/* end protected */

  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
  #if DECSUBSET
  if (allocrhs!=NULL) free(allocrhs);	/* .. */
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
  #endif
  #if FASTMUL
  if (allocrhi!=NULL) free(allocrhi);	/* .. */
  if (alloclhi!=NULL) free(alloclhi);	/* .. */
  #endif
  return res;
  } /* decMultiplyOp */

/* ------------------------------------------------------------------ */
/* decExpOp -- effect exponentiation				      */
/*								      */
/*   This computes C = exp(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits. status is updated but    */
/* not set.							      */
/*								      */
/* Restrictions:						      */
/*								      */
/*   digits, emax, and -emin in the context must be less than	      */
/*   2*DEC_MAX_MATH (1999998), and the rhs must be within these	      */
/*   bounds or a zero.	This is an internal routine, so these	      */
/*   restrictions are contractual and not enforced.		      */
/*								      */
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/*								      */
/* Finite results will always be full precision and Inexact, except   */
/* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
/* ------------------------------------------------------------------ */
/* This approach used here is similar to the algorithm described in   */
/*								      */
/*   Variable Precision Exponential Function, T. E. Hull and	      */
/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
/*   pp79-91, ACM, June 1986.					      */
/*								      */
/* with the main difference being that the iterations in the series   */
/* evaluation are terminated dynamically (which does not require the  */
/* extra variable-precision variables which are expensive in this     */
/* context).							      */
/*								      */
/* The error analysis in Hull & Abrham's paper applies except for the */
/* round-off error accumulation during the series evaluation.  This   */
/* code does not precalculate the number of iterations and so cannot  */
/* use Horner's scheme.	 Instead, the accumulation is done at double- */
/* precision, which ensures that the additions of the terms are exact */
/* and do not accumulate round-off (and any round-off errors in the   */
/* terms themselves move 'to the right' faster than they can	      */
/* accumulate).	 This code also extends the calculation by allowing,  */
/* in the spirit of other decNumber operators, the input to be more   */
/* precise than the result (the precision used is based on the more   */
/* precise of the input or requested result).			      */
/*								      */
/* Implementation notes:					      */
/*								      */
/* 1. This is separated out as decExpOp so it can be called from      */
/*    other Mathematical functions (notably Ln) with a wider range    */
/*    than normal.  In particular, it can handle the slightly wider   */
/*    (double) range needed by Ln (which has to be able to calculate  */
/*    exp(-x) where x can be the tiniest number (Ntiny).	      */
/*								      */
/* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop	      */
/*    iterations by appoximately a third with additional (although    */
/*    diminishing) returns as the range is reduced to even smaller    */
/*    fractions.  However, h (the power of 10 used to correct the     */
/*    result at the end, see below) must be kept <=8 as otherwise     */
/*    the final result cannot be computed.  Hence the leverage is a   */
/*    sliding value (8-h), where potentially the range is reduced     */
/*    more for smaller values.					      */
/*								      */
/*    The leverage that can be applied in this way is severely	      */
/*    limited by the cost of the raise-to-the power at the end,	      */
/*    which dominates when the number of iterations is small (less    */
/*    than ten) or when rhs is short.  As an example, the adjustment  */
/*    x**10,000,000 needs 31 multiplications, all but one full-width. */
/*								      */
/* 3. The restrictions (especially precision) could be raised with    */
/*    care, but the full decNumber range seems very hard within the   */
/*    32-bit limits.						      */
/*								      */
/* 4. The working precisions for the static buffers are twice the     */
/*    obvious size to allow for calls from decNumberPower.	      */
/* ------------------------------------------------------------------ */
decNumber * decExpOp(decNumber *res, const decNumber *rhs,
			 decContext *set, uInt *status) {
  uInt ignore=0;		   /* working status */
  Int h;			   /* adjusted exponent for 0.xxxx */
  Int p;			   /* working precision */
  Int residue;			   /* rounding residue */
  uInt needbytes;		   /* for space calculations */
  const decNumber *x=rhs;	   /* (may point to safe copy later) */
  decContext aset, tset, dset;	   /* working contexts */
  Int comp;			   /* work */

  /* the argument is often copied to normalize it, so (unusually) it */
  /* is treated like other buffers, using DECBUFFER, +1 in case */
  /* DECBUFFER is 0 */
  decNumber bufr[D2N(DECBUFFER*2+1)];
  decNumber *allocrhs=NULL;	   /* non-NULL if rhs buffer allocated */

  /* the working precision will be no more than set->digits+8+1 */
  /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
  /* is 0 (and twice that for the accumulator) */

  /* buffer for t, term (working precision plus) */
  decNumber buft[D2N(DECBUFFER*2+9+1)];
  decNumber *allocbuft=NULL;	   /* -> allocated buft, iff allocated */
  decNumber *t=buft;		   /* term */
  /* buffer for a, accumulator (working precision * 2), at least 9 */
  decNumber bufa[D2N(DECBUFFER*4+18+1)];
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *a=bufa;		   /* accumulator */
  /* decNumber for the divisor term; this needs at most 9 digits */
  /* and so can be fixed size [16 so can use standard context] */
  decNumber bufd[D2N(16)];
  decNumber *d=bufd;		   /* divisor */
  decNumber numone;		   /* constant 1 */

  #if DECCHECK
  Int iterations=0;		   /* for later sanity check */
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  do {					/* protect allocated storage */
    if (SPECIALARG) {			/* handle infinities and NaNs */
      if (decNumberIsInfinite(rhs)) {	/* an infinity */
	if (decNumberIsNegative(rhs))	/* -Infinity -> +0 */
	  decNumberZero(res);
	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
	}
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
      break;}

    if (ISZERO(rhs)) {			/* zeros -> exact 1 */
      decNumberZero(res);		/* make clean 1 */
      *res->lsu=1;			/* .. */
      break;}				/* [no status to set] */

    /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
    /* positive and negative tiny cases which will result in inexact */
    /* 1.  This also allows the later add-accumulate to always be */
    /* exact (because its length will never be more than twice the */
    /* working precision). */
    /* The comparator (tiny) needs just one digit, so use the */
    /* decNumber d for it (reused as the divisor, etc., below); its */
    /* exponent is such that if x is positive it will have */
    /* set->digits-1 zeros between the decimal point and the digit, */
    /* which is 4, and if x is negative one more zero there as the */
    /* more precise result will be of the form 0.9999999 rather than */
    /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
    /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
    /* this then the result will be 1.000000 */
    decNumberZero(d);			/* clean */
    *d->lsu=4;				/* set 4 .. */
    d->exponent=-set->digits;		/* * 10**(-d) */
    if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
    comp=decCompare(d, rhs, 1);		/* signless compare */
    if (comp==BADINT) {
      *status|=DEC_Insufficient_storage;
      break;}
    if (comp>=0) {			/* rhs < d */
      Int shift=set->digits-1;
      decNumberZero(res);		/* set 1 */
      *res->lsu=1;			/* .. */
      res->digits=decShiftToMost(res->lsu, 1, shift);
      res->exponent=-shift;		     /* make 1.0000... */
      *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
      break;} /* tiny */

    /* set up the context to be used for calculating a, as this is */
    /* used on both paths below */
    decContextDefault(&aset, DEC_INIT_DECIMAL64);
    /* accumulator bounds are as requested (could underflow) */
    aset.emax=set->emax;		/* usual bounds */
    aset.emin=set->emin;		/* .. */
    aset.clamp=0;			/* and no concrete format */

    /* calculate the adjusted (Hull & Abrham) exponent (where the */
    /* decimal point is just to the left of the coefficient msd) */
    h=rhs->exponent+rhs->digits;
    /* if h>8 then 10**h cannot be calculated safely; however, when */
    /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
    /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
    /* overflow (or underflow to 0) is guaranteed -- so this case can */
    /* be handled by simply forcing the appropriate excess */
    if (h>8) {				/* overflow/underflow */
      /* set up here so Power call below will over or underflow to */
      /* zero; set accumulator to either 2 or 0.02 */
      /* [stack buffer for a is always big enough for this] */
      decNumberZero(a);
      *a->lsu=2;			/* not 1 but < exp(1) */
      if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
      h=8;				/* clamp so 10**h computable */
      p=9;				/* set a working precision */
      }
     else {				/* h<=8 */
      Int maxlever=(rhs->digits>8?1:0);
      /* [could/should increase this for precisions >40 or so, too] */

      /* if h is 8, cannot normalize to a lower upper limit because */
      /* the final result will not be computable (see notes above), */
      /* but leverage can be applied whenever h is less than 8. */
      /* Apply as much as possible, up to a MAXLEVER digits, which */
      /* sets the tradeoff against the cost of the later a**(10**h). */
      /* As h is increased, the working precision below also */
      /* increases to compensate for the "constant digits at the */
      /* front" effect. */
      Int lever=MINI(8-h, maxlever);	/* leverage attainable */
      Int use=-rhs->digits-lever;	/* exponent to use for RHS */
      h+=lever;				/* apply leverage selected */
      if (h<0) {			/* clamp */
	use+=h;				/* [may end up subnormal] */
	h=0;
	}
      /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
      if (rhs->exponent!=use) {
	decNumber *newrhs=bufr;		/* assume will fit on stack */
	needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
	if (needbytes>sizeof(bufr)) {	/* need malloc space */
	  allocrhs=(decNumber *)malloc(needbytes);
	  if (allocrhs==NULL) {		/* hopeless -- abandon */
	    *status|=DEC_Insufficient_storage;
	    break;}
	  newrhs=allocrhs;		/* use the allocated space */
	  }
	decNumberCopy(newrhs, rhs);	/* copy to safe space */
	newrhs->exponent=use;		/* normalize; now <1 */
	x=newrhs;			/* ready for use */
	/* decNumberShow(x); */
	}

      /* Now use the usual power series to evaluate exp(x).  The */
      /* series starts as 1 + x + x^2/2 ... so prime ready for the */
      /* third term by setting the term variable t=x, the accumulator */
      /* a=1, and the divisor d=2. */

      /* First determine the working precision.	 From Hull & Abrham */
      /* this is set->digits+h+2.  However, if x is 'over-precise' we */
      /* need to allow for all its digits to potentially participate */
      /* (consider an x where all the excess digits are 9s) so in */
      /* this case use x->digits+h+2 */
      p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */

      /* a and t are variable precision, and depend on p, so space */
      /* must be allocated for them if necessary */

      /* the accumulator needs to be able to hold 2p digits so that */
      /* the additions on the second and subsequent iterations are */
      /* sufficiently exact. */
      needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
      if (needbytes>sizeof(bufa)) {	/* need malloc space */
	allocbufa=(decNumber *)malloc(needbytes);
	if (allocbufa==NULL) {		/* hopeless -- abandon */
	  *status|=DEC_Insufficient_storage;
	  break;}
	a=allocbufa;			/* use the allocated space */
	}
      /* the term needs to be able to hold p digits (which is */
      /* guaranteed to be larger than x->digits, so the initial copy */
      /* is safe); it may also be used for the raise-to-power */
      /* calculation below, which needs an extra two digits */
      needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
      if (needbytes>sizeof(buft)) {	/* need malloc space */
	allocbuft=(decNumber *)malloc(needbytes);
	if (allocbuft==NULL) {		/* hopeless -- abandon */
	  *status|=DEC_Insufficient_storage;
	  break;}
	t=allocbuft;			/* use the allocated space */
	}

      decNumberCopy(t, x);		/* term=x */
      decNumberZero(a); *a->lsu=1;	/* accumulator=1 */
      decNumberZero(d); *d->lsu=2;	/* divisor=2 */
      decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */

      /* set up the contexts for calculating a, t, and d */
      decContextDefault(&tset, DEC_INIT_DECIMAL64);
      dset=tset;
      /* accumulator bounds are set above, set precision now */
      aset.digits=p*2;			/* double */
      /* term bounds avoid any underflow or overflow */
      tset.digits=p;
      tset.emin=DEC_MIN_EMIN;		/* [emax is plenty] */
      /* [dset.digits=16, etc., are sufficient] */

      /* finally ready to roll */
      for (;;) {
	#if DECCHECK
	iterations++;
	#endif
	/* only the status from the accumulation is interesting */
	/* [but it should remain unchanged after first add] */
	decAddOp(a, a, t, &aset, 0, status);	       /* a=a+t */
	decMultiplyOp(t, t, x, &tset, &ignore);	       /* t=t*x */
	decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
	/* the iteration ends when the term cannot affect the result, */
	/* if rounded to p digits, which is when its value is smaller */
	/* than the accumulator by p+1 digits.	There must also be */
	/* full precision in a. */
	if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
	    && (a->digits>=p)) break;
	decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
	} /* iterate */

      #if DECCHECK
      /* just a sanity check; comment out test to show always */
      if (iterations>p+3)
	printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
	       iterations, *status, p, x->digits);
      #endif
      } /* h<=8 */

    /* apply postconditioning: a=a**(10**h) -- this is calculated */
    /* at a slightly higher precision than Hull & Abrham suggest */
    if (h>0) {
      Int seenbit=0;		   /* set once a 1-bit is seen */
      Int i;			   /* counter */
      Int n=powers[h];		   /* always positive */
      aset.digits=p+2;		   /* sufficient precision */
      /* avoid the overhead and many extra digits of decNumberPower */
      /* as all that is needed is the short 'multipliers' loop; here */
      /* accumulate the answer into t */
      decNumberZero(t); *t->lsu=1; /* acc=1 */
      for (i=1;;i++){		   /* for each bit [top bit ignored] */
	/* abandon if have had overflow or terminal underflow */
	if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
	  if (*status&DEC_Overflow || ISZERO(t)) break;}
	n=n<<1;			   /* move next bit to testable position */
	if (n<0) {		   /* top bit is set */
	  seenbit=1;		   /* OK, have a significant bit */
	  decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
	  }
	if (i==31) break;	   /* that was the last bit */
	if (!seenbit) continue;	   /* no need to square 1 */
	decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
	} /*i*/ /* 32 bits */
      /* decNumberShow(t); */
      a=t;			   /* and carry on using t instead of a */
      }

    /* Copy and round the result to res */
    residue=1;				/* indicate dirt to right .. */
    if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
    aset.digits=set->digits;		/* [use default rounding] */
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
    decFinish(res, set, &residue, status);	 /* cleanup/set flags */
    } while(0);				/* end protected */

  if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
  if (allocbufa!=NULL) free(allocbufa); /* .. */
  if (allocbuft!=NULL) free(allocbuft); /* .. */
  /* [status is handled by caller] */
  return res;
  } /* decExpOp */

/* ------------------------------------------------------------------ */
/* Initial-estimate natural logarithm table			      */
/*								      */
/*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
/*	     The result is a 4-digit encode of the coefficient (c=the */
/*	     top 14 bits encoding 0-9999) and a 2-digit encode of the */
/*	     exponent (e=the bottom 2 bits encoding 0-3)	      */
/*								      */
/*	     The resulting value is given by:			      */
/*								      */
/*	       v = -c * 10**(-e-3)				      */
/*								      */
/*	     where e and c are extracted from entry k = LNnn[x-10]    */
/*	     where x is truncated (NB) into the range 10 through 99,  */
/*	     and then c = k>>2 and e = k&3.			      */
/* ------------------------------------------------------------------ */
const uShort LNnn[90]={9016,  8652,  8316,  8008,  7724,  7456,	 7208,
  6972,	 6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,	 5312,
  5164,	 5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,	 4032,
 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
 10197,	 9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,	 5801,
  5341,	 4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
 10130,	 6046, 20055};

/* ------------------------------------------------------------------ */
/* decLnOp -- effect natural logarithm				      */
/*								      */
/*   This computes C = ln(A)					      */
/*								      */
/*   res is C, the result.  C may be A				      */
/*   rhs is A							      */
/*   set is the context; note that rounding mode has no effect	      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Notable cases:						      */
/*   A<0 -> Invalid						      */
/*   A=0 -> -Infinity (Exact)					      */
/*   A=+Infinity -> +Infinity (Exact)				      */
/*   A=1 exactly -> 0 (Exact)					      */
/*								      */
/* Restrictions (as for Exp):					      */
/*								      */
/*   digits, emax, and -emin in the context must be less than	      */
/*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
/*   bounds or a zero.	This is an internal routine, so these	      */
/*   restrictions are contractual and not enforced.		      */
/*								      */
/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
/* almost always be correctly rounded, but may be up to 1 ulp in      */
/* error in rare cases.						      */
/* ------------------------------------------------------------------ */
/* The result is calculated using Newton's method, with each	      */
/* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
/* Epperson 1989.						      */
/*								      */
/* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
/* This has to be calculated at the sum of the precision of x and the */
/* working precision.						      */
/*								      */
/* Implementation notes:					      */
/*								      */
/* 1. This is separated out as decLnOp so it can be called from	      */
/*    other Mathematical functions (e.g., Log 10) with a wider range  */
/*    than normal.  In particular, it can handle the slightly wider   */
/*    (+9+2) range needed by a power function.			      */
/*								      */
/* 2. The speed of this function is about 10x slower than exp, as     */
/*    it typically needs 4-6 iterations for short numbers, and the    */
/*    extra precision needed adds a squaring effect, twice.	      */
/*								      */
/* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
/*    as these are common requests.  ln(10) is used by log10(x).      */
/*								      */
/* 4. An iteration might be saved by widening the LNnn table, and     */
/*    would certainly save at least one if it were made ten times     */
/*    bigger, too (for truncated fractions 0.100 through 0.999).      */
/*    However, for most practical evaluations, at least four or five  */
/*    iterations will be neede -- so this would only speed up by      */
/*    20-25% and that probably does not justify increasing the table  */
/*    size.							      */
/*								      */
/* 5. The static buffers are larger than might be expected to allow   */
/*    for calls from decNumberPower.				      */
/* ------------------------------------------------------------------ */
decNumber * decLnOp(decNumber *res, const decNumber *rhs,
		    decContext *set, uInt *status) {
  uInt ignore=0;		   /* working status accumulator */
  uInt needbytes;		   /* for space calculations */
  Int residue;			   /* rounding residue */
  Int r;			   /* rhs=f*10**r [see below] */
  Int p;			   /* working precision */
  Int pp;			   /* precision for iteration */
  Int t;			   /* work */

  /* buffers for a (accumulator, typically precision+2) and b */
  /* (adjustment calculator, same size) */
  decNumber bufa[D2N(DECBUFFER+12)];
  decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *a=bufa;		   /* accumulator/work */
  decNumber bufb[D2N(DECBUFFER*2+2)];
  decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
  decNumber *b=bufb;		   /* adjustment/work */

  decNumber  numone;		   /* constant 1 */
  decNumber  cmp;		   /* work */
  decContext aset, bset;	   /* working contexts */

  #if DECCHECK
  Int iterations=0;		   /* for later sanity check */
  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
  #endif

  do {					/* protect allocated storage */
    if (SPECIALARG) {			/* handle infinities and NaNs */
      if (decNumberIsInfinite(rhs)) {	/* an infinity */
	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
	  *status|=DEC_Invalid_operation;
	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
	}
       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
      break;}

    if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
      decNumberZero(res);		/* make clean */
      res->bits=DECINF|DECNEG;		/* set - infinity */
      break;}				/* [no status to set] */

    /* Non-zero negatives are bad... */
    if (decNumberIsNegative(rhs)) {	/* -x -> error */
      *status|=DEC_Invalid_operation;
      break;}

    /* Here, rhs is positive, finite, and in range */

    /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
    if (rhs->exponent==0 && set->digits<=40) {
      #if DECDPUN==1
      if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
      #else
      if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
      #endif
	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
	#define LN10 "2.302585092994045684017991454684364207601"
	decNumberFromString(res, LN10, &aset);
	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
	break;}
      if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
	#define LN2 "0.6931471805599453094172321214581765680755"
	decNumberFromString(res, LN2, &aset);
	*status|=(DEC_Inexact | DEC_Rounded);
	break;}
      } /* integer and short */

    /* Determine the working precision.	 This is normally the */
    /* requested precision + 2, with a minimum of 9.  However, if */
    /* the rhs is 'over-precise' then allow for all its digits to */
    /* potentially participate (consider an rhs where all the excess */
    /* digits are 9s) so in this case use rhs->digits+2. */
    p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;

    /* Allocate space for the accumulator and the high-precision */
    /* adjustment calculator, if necessary.  The accumulator must */
    /* be able to hold p digits, and the adjustment up to */
    /* rhs->digits+p digits.  They are also made big enough for 16 */
    /* digits so that they can be used for calculating the initial */
    /* estimate. */
    needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
    if (needbytes>sizeof(bufa)) {     /* need malloc space */
      allocbufa=(decNumber *)malloc(needbytes);
      if (allocbufa==NULL) {	      /* hopeless -- abandon */
	*status|=DEC_Insufficient_storage;
	break;}
      a=allocbufa;		      /* use the allocated space */
      }
    pp=p+rhs->digits;
    needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
    if (needbytes>sizeof(bufb)) {     /* need malloc space */
      allocbufb=(decNumber *)malloc(needbytes);
      if (allocbufb==NULL) {	      /* hopeless -- abandon */
	*status|=DEC_Insufficient_storage;
	break;}
      b=allocbufb;		      /* use the allocated space */
      }

    /* Prepare an initial estimate in acc. Calculate this by */
    /* considering the coefficient of x to be a normalized fraction, */
    /* f, with the decimal point at far left and multiplied by */
    /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
    /*	 ln(x) = ln(f) + ln(10)*r */
    /* Get the initial estimate for ln(f) from a small lookup */
    /* table (see above) indexed by the first two digits of f, */
    /* truncated. */

    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
    r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
    decNumberFromInt32(a, r);		/* a=r */
    decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
    b->exponent=-6;			/*  .. */
    decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
    /* now get top two digits of rhs into b by simple truncate and */
    /* force to integer */
    residue=0;				/* (no residue) */
    aset.digits=2; aset.round=DEC_ROUND_DOWN;
    decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
    b->exponent=0;			/* make integer */
    t=decGetInt(b);			/* [cannot fail] */
    if (t<10) t=X10(t);			/* adjust single-digit b */
    t=LNnn[t-10];			/* look up ln(b) */
    decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
    b->exponent=-(t&3)-3;		/* set exponent */
    b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
    aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
    decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
    /* the initial estimate is now in a, with up to 4 digits correct. */
    /* When rhs is at or near Nmax the estimate will be low, so we */
    /* will approach it from below, avoiding overflow when calling exp. */

    decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */

    /* accumulator bounds are as requested (could underflow, but */
    /* cannot overflow) */
    aset.emax=set->emax;
    aset.emin=set->emin;
    aset.clamp=0;			/* no concrete format */
    /* set up a context to be used for the multiply and subtract */
    bset=aset;
    bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
    bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
					/* [see decExpOp call below] */
    /* for each iteration double the number of digits to calculate, */
    /* up to a maximum of p */
    pp=9;				/* initial precision */
    /* [initially 9 as then the sequence starts 7+2, 16+2, and */
    /* 34+2, which is ideal for standard-sized numbers] */
    aset.digits=pp;			/* working context */
    bset.digits=pp+rhs->digits;		/* wider context */
    for (;;) {				/* iterate */
      #if DECCHECK
      iterations++;
      if (iterations>24) break;		/* consider 9 * 2**24 */
      #endif
      /* calculate the adjustment (exp(-a)*x-1) into b.	 This is a */
      /* catastrophic subtraction but it really is the difference */
      /* from 1 that is of interest. */
      /* Use the internal entry point to Exp as it allows the double */
      /* range for calculating exp(-a) when a is the tiniest subnormal. */
      a->bits^=DECNEG;			/* make -a */
      decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
      a->bits^=DECNEG;			/* restore sign of a */
      /* now multiply by rhs and subtract 1, at the wider precision */
      decMultiplyOp(b, b, rhs, &bset, &ignore);	       /* b=b*rhs */
      decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */

      /* the iteration ends when the adjustment cannot affect the */
      /* result by >=0.5 ulp (at the requested digits), which */
      /* is when its value is smaller than the accumulator by */
      /* set->digits+1 digits (or it is zero) -- this is a looser */
      /* requirement than for Exp because all that happens to the */
      /* accumulator after this is the final rounding (but note that */
      /* there must also be full precision in a, or a=0). */

      if (decNumberIsZero(b) ||
	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
	if (a->digits==p) break;
	if (decNumberIsZero(a)) {
	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
	  break;
	  }
	/* force padding if adjustment has gone to 0 before full length */
	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
	}

      /* not done yet ... */
      decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
      if (pp==p) continue;		     /* precision is at maximum */
      /* lengthen the next calculation */
      pp=pp*2;				     /* double precision */
      if (pp>p) pp=p;			     /* clamp to maximum */
      aset.digits=pp;			     /* working context */
      bset.digits=pp+rhs->digits;	     /* wider context */
      } /* Newton's iteration */

    #if DECCHECK
    /* just a sanity check; remove the test to show always */
    if (iterations>24)
      printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
	    iterations, *status, p, rhs->digits);
    #endif

    /* Copy and round the result to res */
    residue=1;				/* indicate dirt to right */
    if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
    aset.digits=set->digits;		/* [use default rounding] */
    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
    decFinish(res, set, &residue, status);	 /* cleanup/set flags */
    } while(0);				/* end protected */

  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
  if (allocbufb!=NULL) free(allocbufb); /* .. */
  /* [status is handled by caller] */
  return res;
  } /* decLnOp */

/* ------------------------------------------------------------------ */
/* decQuantizeOp  -- force exponent to requested value		      */
/*								      */
/*   This computes C = op(A, B), where op adjusts the coefficient     */
/*   of C (by rounding or shifting) such that the exponent (-scale)   */
/*   of C has the value B or matches the exponent of B.		      */
/*   The numerical value of C will equal A, except for the effects of */
/*   any rounding that occurred.				      */
/*								      */
/*   res is C, the result.  C may be A or B			      */
/*   lhs is A, the number to adjust				      */
/*   rhs is B, the requested exponent				      */
/*   set is the context						      */
/*   quant is 1 for quantize or 0 for rescale			      */
/*   status is the status accumulator (this can be called without     */
/*	    risk of control loss)				      */
/*								      */
/* C must have space for set->digits digits.			      */
/*								      */
/* Unless there is an error or the result is infinite, the exponent   */
/* after the operation is guaranteed to be that requested.	      */
/* ------------------------------------------------------------------ */
static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
				 const decNumber *rhs, decContext *set,
				 Flag quant, uInt *status) {
  #if DECSUBSET
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
  decNumber *allocrhs=NULL;	   /* .., rhs */
  #endif
  const decNumber *inrhs=rhs;	   /* save original rhs */
  Int	reqdigits=set->digits;	   /* requested DIGITS */
  Int	reqexp;			   /* requested exponent [-scale] */
  Int	residue=0;		   /* rounding residue */
  Int	etiny=set->emin-(reqdigits-1);

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operands and set lostDigits status, as needed */
      if (lhs->digits>reqdigits) {
	alloclhs=decRoundOperand(lhs, set, status);
	if (alloclhs==NULL) break;
	lhs=alloclhs;
	}
      if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
	allocrhs=decRoundOperand(rhs, set, status);
	if (allocrhs==NULL) break;
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* Handle special values */
    if (SPECIALARGS) {
      /* NaNs get usual processing */
      if (SPECIALARGS & (DECSNAN | DECNAN))
	decNaNs(res, lhs, rhs, set, status);
      /* one infinity but not both is bad */
      else if ((lhs->bits ^ rhs->bits) & DECINF)
	*status|=DEC_Invalid_operation;
      /* both infinity: return lhs */
      else decNumberCopy(res, lhs);	     /* [nop if in place] */
      break;
      }

    /* set requested exponent */
    if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
     else {				/* rescale -- use value of rhs */
      /* Original rhs must be an integer that fits and is in range, */
      /* which could be from -1999999997 to +999999999, thanks to */
      /* subnormals */
      reqexp=decGetInt(inrhs);		     /* [cannot fail] */
      }

    #if DECSUBSET
    if (!set->extended) etiny=set->emin;     /* no subnormals */
    #endif

    if (reqexp==BADINT			     /* bad (rescale only) or .. */
     || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
     || (reqexp<etiny)			     /* < lowest */
     || (reqexp>set->emax)) {		     /* > emax */
      *status|=DEC_Invalid_operation;
      break;}

    /* the RHS has been processed, so it can be overwritten now if necessary */
    if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
      decNumberCopy(res, lhs);		     /* [nop if in place] */
      res->exponent=reqexp;		     /* .. just set exponent */
      #if DECSUBSET
      if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
      #endif
      }
     else {				     /* non-zero lhs */
      Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
      /* if adjusted coefficient will definitely not fit, give up now */
      if ((lhs->digits-adjust)>reqdigits) {
	*status|=DEC_Invalid_operation;
	break;
	}

      if (adjust>0) {			     /* increasing exponent */
	/* this will decrease the length of the coefficient by adjust */
	/* digits, and must round as it does so */
	decContext workset;		     /* work */
	workset=*set;			     /* clone rounding, etc. */
	workset.digits=lhs->digits-adjust;   /* set requested length */
	/* [note that the latter can be <1, here] */
	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
	decApplyRound(res, &workset, residue, status);	  /* .. and round */
	residue=0;					  /* [used] */
	/* If just rounded a 999s case, exponent will be off by one; */
	/* adjust back (after checking space), if so. */
	if (res->exponent>reqexp) {
	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
	  /* set->digits==3 */
	  if (res->digits==reqdigits) {	     /* cannot shift by 1 */
	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
	    *status|=DEC_Invalid_operation;
	    break;
	    }
	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
	  res->exponent--;		     /* (re)adjust the exponent. */
	  }
	#if DECSUBSET
	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
	#endif
	} /* increase */
       else /* adjust<=0 */ {		     /* decreasing or = exponent */
	/* this will increase the length of the coefficient by -adjust */
	/* digits, by adding zero or more trailing zeros; this is */
	/* already checked for fit, above */
	decNumberCopy(res, lhs);	     /* [it will fit] */
	/* if padding needed (adjust<0), add it now... */
	if (adjust<0) {
	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
	  res->exponent+=adjust;	     /* adjust the exponent */
	  }
	} /* decrease */
      } /* non-zero */

    /* Check for overflow [do not use Finalize in this case, as an */
    /* overflow here is a "don't fit" situation] */
    if (res->exponent>set->emax-res->digits+1) {  /* too big */
      *status|=DEC_Invalid_operation;
      break;
      }
     else {
      decFinalize(res, set, &residue, status);	  /* set subnormal flags */
      *status&=~DEC_Underflow;		/* suppress Underflow [754r] */
      }
    } while(0);				/* end protected */

  #if DECSUBSET
  if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
  #endif
  return res;
  } /* decQuantizeOp */

/* ------------------------------------------------------------------ */
/* decCompareOp -- compare, min, or max two Numbers		      */
/*								      */
/*   This computes C = A ? B and carries out one of four operations:  */
/*     COMPARE	  -- returns the signum (as a number) giving the      */
/*		     result of a comparison unless one or both	      */
/*		     operands is a NaN (in which case a NaN results)  */
/*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
/*		     Invalid operation.				      */
/*     COMPMAX	  -- returns the larger of the operands, using the    */
/*		     754r maxnum operation			      */
/*     COMPMAXMAG -- ditto, comparing absolute values		      */
/*     COMPMIN	  -- the 754r minnum operation			      */
/*     COMPMINMAG -- ditto, comparing absolute values		      */
/*     COMTOTAL	  -- returns the signum (as a number) giving the      */
/*		     result of a comparison using 754r total ordering */
/*								      */
/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
/*   lhs is A							      */
/*   rhs is B							      */
/*   set is the context						      */
/*   op	 is the operation flag					      */
/*   status is the usual accumulator				      */
/*								      */
/* C must have space for one digit for COMPARE or set->digits for     */
/* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.			      */
/* ------------------------------------------------------------------ */
/* The emphasis here is on speed for common cases, and avoiding	      */
/* coefficient comparison if possible.				      */
/* ------------------------------------------------------------------ */
decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
			 const decNumber *rhs, decContext *set,
			 Flag op, uInt *status) {
  #if DECSUBSET
  decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
  decNumber *allocrhs=NULL;	   /* .., rhs */
  #endif
  Int	result=0;		   /* default result value */
  uByte merged;			   /* work */

  #if DECCHECK
  if (decCheckOperands(res, lhs, rhs, set)) return res;
  #endif

  do {				   /* protect allocated storage */
    #if DECSUBSET
    if (!set->extended) {
      /* reduce operands and set lostDigits status, as needed */
      if (lhs->digits>set->digits) {
	alloclhs=decRoundOperand(lhs, set, status);
	if (alloclhs==NULL) {result=BADINT; break;}
	lhs=alloclhs;
	}
      if (rhs->digits>set->digits) {
	allocrhs=decRoundOperand(rhs, set, status);
	if (allocrhs==NULL) {result=BADINT; break;}
	rhs=allocrhs;
	}
      }
    #endif
    /* [following code does not require input rounding] */

    /* If total ordering then handle differing signs 'up front' */
    if (op==COMPTOTAL) {		/* total ordering */
      if (decNumberIsNegative(lhs) & !decNumberIsNegative(rhs)) {
	result=-1;
	break;
	}
      if (!decNumberIsNegative(lhs) & decNumberIsNegative(rhs)) {
	result=+1;
	break;
	}
      }

    /* handle NaNs specially; let infinities drop through */
    /* This assumes sNaN (even just one) leads to NaN. */
    merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
    if (merged) {			/* a NaN bit set */
      if (op==COMPARE);			/* result will be NaN */
       else if (op==COMPSIG)		/* treat qNaN as sNaN */
	*status|=DEC_Invalid_operation | DEC_sNaN;
       else if (op==COMPTOTAL) {	/* total ordering, always finite */
	/* signs are known to be the same; compute the ordering here */
	/* as if the signs are both positive, then invert for negatives */
	if (!decNumberIsNaN(lhs)) result=-1;
	 else if (!decNumberIsNaN(rhs)) result=+1;
	 /* here if both NaNs */
	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
	 else { /* both NaN or both sNaN */
	  /* now it just depends on the payload */
	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
				rhs->lsu, D2U(rhs->digits), 0);
	  /* [Error not possible, as these are 'aligned'] */
	  } /* both same NaNs */
	if (decNumberIsNegative(lhs)) result=-result;
	break;
	} /* total order */

       else if (merged & DECSNAN);	     /* sNaN -> qNaN */
       else { /* here if MIN or MAX and one or two quiet NaNs */
	/* min or max -- 754r rules ignore single NaN */
	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
	  /* just one NaN; force choice to be the non-NaN operand */
	  op=COMPMAX;
	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
			     else result=+1; /* pick lhs */
	  break;
	  }
	} /* max or min */
      op=COMPNAN;			     /* use special path */
      decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
      break;
      }
    /* have numbers */
    if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
     else result=decCompare(lhs, rhs, 0);    /* sign matters */
    } while(0);				     /* end protected */

  if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
   else {
    if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
      if (op==COMPTOTAL && result==0) {
	/* operands are numerically equal or same NaN (and same sign, */
	/* tested first); if identical, leave result 0 */
	if (lhs->exponent!=rhs->exponent) {
	  if (lhs->exponent<rhs->exponent) result=-1;
	   else result=+1;
	  if (decNumberIsNegative(lhs)) result=-result;
	  } /* lexp!=rexp */
	} /* total-order by exponent */
      decNumberZero(res);		/* [always a valid result] */
      if (result!=0) {			/* must be -1 or +1 */
	*res->lsu=1;
	if (result<0) res->bits=DECNEG;
	}
      }
     else if (op==COMPNAN);		/* special, drop through */
     else {				/* MAX or MIN, non-NaN result */
      Int residue=0;			/* rounding accumulator */
      /* choose the operand for the result */
      const decNumber *choice;
      if (result==0) { /* operands are numerically equal */
	/* choose according to sign then exponent (see 754r) */
	uByte slhs=(lhs->bits & DECNEG);
	uByte srhs=(rhs->bits & DECNEG);
	#if DECSUBSET
	if (!set->extended) {		/* subset: force left-hand */
	  op=COMPMAX;
	  result=+1;
	  }
	else
	#endif
	if (slhs!=srhs) {	   /* signs differ */
	  if (slhs) result=-1;	   /* rhs is max */
	       else result=+1;	   /* lhs is max */
	  }
	 else if (slhs && srhs) {  /* both negative */
	  if (lhs->exponent<rhs->exponent) result=+1;
				      else result=-1;
	  /* [if equal, use lhs, technically identical] */
	  }
	 else {			   /* both positive */
	  if (lhs->exponent>rhs->exponent) result=+1;
				      else result=-1;
	  /* [ditto] */
	  }
	} /* numerically equal */
      /* here result will be non-0; reverse if looking for MIN */
      if (op==COMPMIN || op==COMPMINMAG) result=-result;
      choice=(result>0 ? lhs : rhs);	/* choose */
      /* copy chosen to result, rounding if need be */
      decCopyFit(res, choice, set, &residue, status);
      decFinish(res, set, &residue, status);
      }
    }
  #if DECSUBSET
  if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
  if (alloclhs!=NULL) free(alloclhs);	/* .. */
  #endif
  return res;
  } /* decCompareOp */

/* ------------------------------------------------------------------ */
/* decCompare -- compare two decNumbers by numerical value	      */
/*								      */
/*  This routine compares A ? B without altering them.		      */
/*								      */
/*  Arg1 is A, a decNumber which is not a NaN			      */
/*  Arg2 is B, a decNumber which is not a NaN			      */
/*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
/*								      */
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
/*  (the only possible failure is an allocation error)		      */
/* ------------------------------------------------------------------ */
static Int decCompare(const decNumber *lhs, const decNumber *rhs,
		      Flag abs) {
  Int	result;			   /* result value */
  Int	sigr;			   /* rhs signum */
  Int	compare;		   /* work */

  result=1;				     /* assume signum(lhs) */
  if (ISZERO(lhs)) result=0;
  if (abs) {
    if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
    /* RHS is non-zero */
    if (result==0) return -1;		     /* LHS is 0; RHS wins */
    /* [here, both non-zero, result=1] */
    }
   else {				     /* signs matter */
    if (result && decNumberIsNegative(lhs)) result=-1;
    sigr=1;				     /* compute signum(rhs) */
    if (ISZERO(rhs)) sigr=0;
     else if (decNumberIsNegative(rhs)) sigr=-1;
    if (result > sigr) return +1;	     /* L > R, return 1 */
    if (result < sigr) return -1;	     /* L < R, return -1 */
    if (result==0) return 0;		       /* both 0 */
    }

  /* signums are the same; both are non-zero */
  if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
    if (decNumberIsInfinite(rhs)) {
      if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
       else result=-result;		     /* only rhs infinite */
      }
    return result;
    }
  /* must compare the coefficients, allowing for exponents */
  if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
    /* swap sides, and sign */
    const decNumber *temp=lhs;
    lhs=rhs;
    rhs=temp;
    result=-result;
    }
  compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
			 rhs->lsu, D2U(rhs->digits),
			 rhs->exponent-lhs->exponent);
  if (compare!=BADINT) compare*=result;	     /* comparison succeeded */
  return compare;
  } /* decCompare */

/* ------------------------------------------------------------------ */
/* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
/*								      */
/*  This routine compares A ? B*10**E where A and B are unit arrays   */
/*  A is a plain integer					      */
/*  B has an exponent of E (which must be non-negative)		      */
/*								      */
/*  Arg1 is A first Unit (lsu)					      */
/*  Arg2 is A length in Units					      */
/*  Arg3 is B first Unit (lsu)					      */
/*  Arg4 is B length in Units					      */
/*  Arg5 is E (0 if the units are aligned)			      */
/*								      */
/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
/*  (the only possible failure is an allocation error, which can      */
/*  only occur if E!=0)						      */
/* ------------------------------------------------------------------ */
static Int decUnitCompare(const Unit *a, Int alength,
			  const Unit *b, Int blength, Int exp) {
  Unit	*acc;			   /* accumulator for result */
  Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
  Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
  Int	accunits, need;		   /* units in use or needed for acc */
  const Unit *l, *r, *u;	   /* work */
  Int	expunits, exprem, result;  /* .. */

  if (exp==0) {			   /* aligned; fastpath */
    if (alength>blength) return 1;
    if (alength<blength) return -1;
    /* same number of units in both -- need unit-by-unit compare */
    l=a+alength-1;
    r=b+alength-1;
    for (;l>=a; l--, r--) {
      if (*l>*r) return 1;
      if (*l<*r) return -1;
      }
    return 0;			   /* all units match */
    } /* aligned */

  /* Unaligned.	 If one is >1 unit longer than the other, padded */
  /* approximately, then can return easily */
  if (alength>blength+(Int)D2U(exp)) return 1;
  if (alength+1<blength+(Int)D2U(exp)) return -1;

  /* Need to do a real subtract.  For this, a result buffer is needed */
  /* even though only the sign is of interest.	Its length needs */
  /* to be the larger of alength and padded blength, +2 */
  need=blength+D2U(exp);		/* maximum real length of B */
  if (need<alength) need=alength;
  need+=2;
  acc=accbuff;				/* assume use local buffer */
  if (need*sizeof(Unit)>sizeof(accbuff)) {
    allocacc=(Unit *)malloc(need*sizeof(Unit));
    if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
    acc=allocacc;
    }
  /* Calculate units and remainder from exponent. */
  expunits=exp/DECDPUN;
  exprem=exp%DECDPUN;
  /* subtract [A+B*(-m)] */
  accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
			 -(Int)powers[exprem]);
  /* [UnitAddSub result may have leading zeros, even on zero] */
  if (accunits<0) result=-1;		/* negative result */
   else {				/* non-negative result */
    /* check units of the result before freeing any storage */
    for (u=acc; u<acc+accunits-1 && *u==0;) u++;
    result=(*u==0 ? 0 : +1);
    }
  /* clean up and return the result */
  if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
  return result;
  } /* decUnitCompare */

/* ------------------------------------------------------------------ */
/* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
/*								      */
/*  This routine performs the calculation:			      */
/*								      */
/*  C=A+(B*M)							      */
/*								      */
/*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
/*								      */
/*  A may be shorter or longer than B.				      */
/*								      */
/*  Leading zeros are not removed after a calculation.	The result is */
/*  either the same length as the longer of A and B (adding any	      */
/*  shift), or one Unit longer than that (if a Unit carry occurred).  */
/*								      */
/*  A and B content are not altered unless C is also A or B.	      */
/*  C may be the same array as A or B, but only if no zero padding is */
/*  requested (that is, C may be B only if bshift==0).		      */
/*  C is filled from the lsu; only those units necessary to complete  */
/*  the calculation are referenced.				      */
/*								      */
/*  Arg1 is A first Unit (lsu)					      */
/*  Arg2 is A length in Units					      */
/*  Arg3 is B first Unit (lsu)					      */
/*  Arg4 is B length in Units					      */
/*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
/*  Arg6 is C first Unit (lsu)					      */
/*  Arg7 is M, the multiplier					      */
/*								      */
/*  returns the count of Units written to C, which will be non-zero   */
/*  and negated if the result is negative.  That is, the sign of the  */
/*  returned Int is the sign of the result (positive for zero) and    */
/*  the absolute value of the Int is the count of Units.	      */
/*								      */
/*  It is the caller's responsibility to make sure that C size is     */
/*  safe, allowing space if necessary for a one-Unit carry.	      */
/*								      */
/*  This routine is severely performance-critical; *any* change here  */
/*  must be measured (timed) to assure no performance degradation.    */
/*  In particular, trickery here tends to be counter-productive, as   */
/*  increased complexity of code hurts register optimizations on      */
/*  register-poor architectures.  Avoiding divisions is nearly	      */
/*  always a Good Idea, however.				      */
/*								      */
/* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
/* (IBM Warwick, UK) for some of the ideas used in this routine.      */
/* ------------------------------------------------------------------ */
static Int decUnitAddSub(const Unit *a, Int alength,
			 const Unit *b, Int blength, Int bshift,
			 Unit *c, Int m) {
  const Unit *alsu=a;		   /* A lsu [need to remember it] */
  Unit *clsu=c;			   /* C ditto */
  Unit *minC;			   /* low water mark for C */
  Unit *maxC;			   /* high water mark for C */
  eInt carry=0;			   /* carry integer (could be Long) */
  Int  add;			   /* work */
  #if DECDPUN<=4		   /* myriadal, millenary, etc. */
  Int  est;			   /* estimated quotient */
  #endif

  #if DECTRACE
  if (alength<1 || blength<1)
    printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
  #endif

  maxC=c+alength;		   /* A is usually the longer */
  minC=c+blength;		   /* .. and B the shorter */
  if (bshift!=0) {		   /* B is shifted; low As copy across */
    minC+=bshift;
    /* if in place [common], skip copy unless there's a gap [rare] */
    if (a==c && bshift<=alength) {
      c+=bshift;
      a+=bshift;
      }
     else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
      if (a<alsu+alength) *c=*a;
       else *c=0;
      }
    }
  if (minC>maxC) { /* swap */
    Unit *hold=minC;
    minC=maxC;
    maxC=hold;
    }

  /* For speed, do the addition as two loops; the first where both A */
  /* and B contribute, and the second (if necessary) where only one or */
  /* other of the numbers contribute. */
  /* Carry handling is the same (i.e., duplicated) in each case. */
  for (; c<minC; c++) {
    carry+=*a;
    a++;
    carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
    b++;				/* here is not a win] */
    /* here carry is new Unit of digits; it could be +ve or -ve */
    if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
      *c=(Unit)carry;
      carry=0;
      continue;
      }
    #if DECDPUN==4			     /* use divide-by-multiply */
      if (carry>=0) {
	est=(((ueInt)carry>>11)*53687)>>18;
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* likely quotient [89%] */
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
	carry++;
	*c-=DECDPUNMAX+1;
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=(((ueInt)carry>>11)*53687)>>18;
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
      carry++;
      *c-=DECDPUNMAX+1;
    #elif DECDPUN==3
      if (carry>=0) {
	est=(((ueInt)carry>>3)*16777)>>21;
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* likely quotient [99%] */
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
	carry++;
	*c-=DECDPUNMAX+1;
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=(((ueInt)carry>>3)*16777)>>21;
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
      carry++;
      *c-=DECDPUNMAX+1;
    #elif DECDPUN<=2
      /* Can use QUOT10 as carry <= 4 digits */
      if (carry>=0) {
	est=QUOT10(carry, DECDPUN);
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* quotient */
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=QUOT10(carry, DECDPUN);
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
    #else
      /* remainder operator is undefined if negative, so must test */
      if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
	carry=1;
	continue;
	}
      if (carry>=0) {
	*c=(Unit)(carry%(DECDPUNMAX+1));
	carry=carry/(DECDPUNMAX+1);
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      *c=(Unit)(carry%(DECDPUNMAX+1));
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
    #endif
    } /* c */

  /* now may have one or other to complete */
  /* [pretest to avoid loop setup/shutdown] */
  if (c<maxC) for (; c<maxC; c++) {
    if (a<alsu+alength) {		/* still in A */
      carry+=*a;
      a++;
      }
     else {				/* inside B */
      carry+=((eInt)*b)*m;
      b++;
      }
    /* here carry is new Unit of digits; it could be +ve or -ve and */
    /* magnitude up to DECDPUNMAX squared */
    if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
      *c=(Unit)carry;
      carry=0;
      continue;
      }
    /* result for this unit is negative or >DECDPUNMAX */
    #if DECDPUN==4			     /* use divide-by-multiply */
      if (carry>=0) {
	est=(((ueInt)carry>>11)*53687)>>18;
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* likely quotient [79.7%] */
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
	carry++;
	*c-=DECDPUNMAX+1;
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=(((ueInt)carry>>11)*53687)>>18;
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
      carry++;
      *c-=DECDPUNMAX+1;
    #elif DECDPUN==3
      if (carry>=0) {
	est=(((ueInt)carry>>3)*16777)>>21;
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* likely quotient [99%] */
	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
	carry++;
	*c-=DECDPUNMAX+1;
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=(((ueInt)carry>>3)*16777)>>21;
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
      if (*c<DECDPUNMAX+1) continue;	     /* was OK */
      carry++;
      *c-=DECDPUNMAX+1;
    #elif DECDPUN<=2
      if (carry>=0) {
	est=QUOT10(carry, DECDPUN);
	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
	carry=est;			     /* quotient */
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      est=QUOT10(carry, DECDPUN);
      *c=(Unit)(carry-est*(DECDPUNMAX+1));
      carry=est-(DECDPUNMAX+1);		     /* correctly negative */
    #else
      if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
	*c=(Unit)(carry-(DECDPUNMAX+1));
	carry=1;
	continue;
	}
      /* remainder operator is undefined if negative, so must test */
      if (carry>=0) {
	*c=(Unit)(carry%(DECDPUNMAX+1));
	carry=carry/(DECDPUNMAX+1);
	continue;
	}
      /* negative case */
      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
      *c=(Unit)(carry%(DECDPUNMAX+1));
      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
    #endif
    } /* c */

  /* OK, all A and B processed; might still have carry or borrow */
  /* return number of Units in the result, negated if a borrow */
  if (carry==0) return c-clsu;	   /* no carry, so no more to do */
  if (carry>0) {		   /* positive carry */
    *c=(Unit)carry;		   /* place as new unit */
    c++;			   /* .. */
    return c-clsu;
    }
  /* -ve carry: it's a borrow; complement needed */
  add=1;			   /* temporary carry... */
  for (c=clsu; c<maxC; c++) {
    add=DECDPUNMAX+add-*c;
    if (add<=DECDPUNMAX) {
      *c=(Unit)add;
      add=0;
      }
     else {
      *c=0;
      add=1;
      }
    }
  /* add an extra unit iff it would be non-zero */
  #if DECTRACE
    printf("UAS borrow: add %ld, carry %ld\n", add, carry);
  #endif
  if ((add-carry-1)!=0) {
    *c=(Unit)(add-carry-1);
    c++;		      /* interesting, include it */
    }
  return clsu-c;	      /* -ve result indicates borrowed */
  } /* decUnitAddSub */

/* ------------------------------------------------------------------ */
/* decTrim -- trim trailing zeros or normalize			      */
/*								      */
/*   dn is the number to trim or normalize			      */
/*   set is the context to use to check for clamp		      */
/*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
/*   dropped returns the number of discarded trailing zeros	      */
/*   returns dn							      */
/*								      */
/* If clamp is set in the context then the number of zeros trimmed    */
/* may be limited if the exponent is high.			      */
/* All fields are updated as required.	This is a utility operation,  */
/* so special values are unchanged and no error is possible.	      */
/* ------------------------------------------------------------------ */
static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
			   Int *dropped) {
  Int	d, exp;			   /* work */
  uInt	cut;			   /* .. */
  Unit	*up;			   /* -> current Unit */

  #if DECCHECK
  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
  #endif

  *dropped=0;				/* assume no zeros dropped */
  if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
    || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
  if (ISZERO(dn)) {			/* .. or 0 */
    dn->exponent=0;			/* (sign is preserved) */
    return dn;
    }

  /* have a finite number which is even */
  exp=dn->exponent;
  cut=1;			   /* digit (1-DECDPUN) in Unit */
  up=dn->lsu;			   /* -> current Unit */
  for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
    /* slice by powers */
    #if DECDPUN<=4
      uInt quot=QUOT10(*up, cut);
      if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
    #else
      if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
    #endif
    /* have a trailing 0 */
    if (!all) {			   /* trimming */
      /* [if exp>0 then all trailing 0s are significant for trim] */
      if (exp<=0) {		   /* if digit might be significant */
	if (exp==0) break;	   /* then quit */
	exp++;			   /* next digit might be significant */
	}
      }
    cut++;			   /* next power */
    if (cut>DECDPUN) {		   /* need new Unit */
      up++;
      cut=1;
      }
    } /* d */
  if (d==0) return dn;		   /* none to drop */

  /* may need to limit drop if clamping */
  if (set->clamp) {
    Int maxd=set->emax-set->digits+1-dn->exponent;
    if (maxd<=0) return dn;	   /* nothing possible */
    if (d>maxd) d=maxd;
    }

  /* effect the drop */
  decShiftToLeast(dn->lsu, D2U(dn->digits), d);
  dn->exponent+=d;		   /* maintain numerical value */
  dn->digits-=d;		   /* new length */
  *dropped=d;			   /* report the count */
  return dn;
  } /* decTrim */

/* ------------------------------------------------------------------ */
/* decReverse -- reverse a Unit array in place			      */
/*								      */
/*   ulo    is the start of the array				      */
/*   uhi    is the end of the array (highest Unit to include)	      */
/*								      */
/* The units ulo through uhi are reversed in place (if the number     */
/* of units is odd, the middle one is untouched).  Note that the      */
/* digit(s) in each unit are unaffected.			      */
/* ------------------------------------------------------------------ */
static void decReverse(Unit *ulo, Unit *uhi) {
  Unit temp;
  for (; ulo<uhi; ulo++, uhi--) {
    temp=*ulo;
    *ulo=*uhi;
    *uhi=temp;
    }
  return;
  } /* decReverse */

/* ------------------------------------------------------------------ */
/* decShiftToMost -- shift digits in array towards most significant   */
/*								      */
/*   uar    is the array					      */
/*   digits is the count of digits in use in the array		      */
/*   shift  is the number of zeros to pad with (least significant);   */
/*     it must be zero or positive				      */
/*								      */
/*   returns the new length of the integer in the array, in digits    */
/*								      */
/* No overflow is permitted (that is, the uar array must be known to  */
/* be large enough to hold the result, after shifting).		      */
/* ------------------------------------------------------------------ */
static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
  Unit	*target, *source, *first;  /* work */
  Int	cut;			   /* odd 0's to add */
  uInt	next;			   /* work */

  if (shift==0) return digits;	   /* [fastpath] nothing to do */
  if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
    *uar=(Unit)(*uar*powers[shift]);
    return digits+shift;
    }

  next=0;			   /* all paths */
  source=uar+D2U(digits)-1;	   /* where msu comes from */
  target=source+D2U(shift);	   /* where upper part of first cut goes */
  cut=DECDPUN-MSUDIGITS(shift);	   /* where to slice */
  if (cut==0) {			   /* unit-boundary case */
    for (; source>=uar; source--, target--) *target=*source;
    }
   else {
    first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
    for (; source>=uar; source--, target--) {
      /* split the source Unit and accumulate remainder for next */
      #if DECDPUN<=4
	uInt quot=QUOT10(*source, cut);
	uInt rem=*source-quot*powers[cut];
	next+=quot;
      #else
	uInt rem=*source%powers[cut];
	next+=*source/powers[cut];
      #endif
      if (target<=first) *target=(Unit)next;   /* write to target iff valid */
      next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
      }
    } /* shift-move */

  /* propagate any partial unit to one below and clear the rest */
  for (; target>=uar; target--) {
    *target=(Unit)next;
    next=0;
    }
  return digits+shift;
  } /* decShiftToMost */

/* ------------------------------------------------------------------ */
/* decShiftToLeast -- shift digits in array towards least significant */
/*								      */
/*   uar   is the array						      */
/*   units is length of the array, in units			      */
/*   shift is the number of digits to remove from the lsu end; it     */
/*     must be zero or positive and <= than units*DECDPUN.	      */
/*								      */
/*   returns the new length of the integer in the array, in units     */
/*								      */
/* Removed digits are discarded (lost).	 Units not required to hold   */
/* the final result are unchanged.				      */
/* ------------------------------------------------------------------ */
static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
  Unit	*target, *up;		   /* work */
  Int	cut, count;		   /* work */
  Int	quot, rem;		   /* for division */

  if (shift==0) return units;	   /* [fastpath] nothing to do */
  if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
    *uar=0;			   /* all digits cleared gives zero */
    return 1;			   /* leaves just the one */
    }

  target=uar;			   /* both paths */
  cut=MSUDIGITS(shift);
  if (cut==DECDPUN) {		   /* unit-boundary case; easy */
    up=uar+D2U(shift);
    for (; up<uar+units; target++, up++) *target=*up;
    return target-uar;
    }

  /* messier */
  up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
  count=units*DECDPUN-shift;	   /* the maximum new length */
  #if DECDPUN<=4
    quot=QUOT10(*up, cut);
  #else
    quot=*up/powers[cut];
  #endif
  for (; ; target++) {
    *target=(Unit)quot;
    count-=(DECDPUN-cut);
    if (count<=0) break;
    up++;
    quot=*up;
    #if DECDPUN<=4
      quot=QUOT10(quot, cut);
      rem=*up-quot*powers[cut];
    #else
      rem=quot%powers[cut];
      quot=quot/powers[cut];
    #endif
    *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
    count-=cut;
    if (count<=0) break;
    }
  return target-uar+1;
  } /* decShiftToLeast */

#if DECSUBSET
/* ------------------------------------------------------------------ */
/* decRoundOperand -- round an operand	[used for subset only]	      */
/*								      */
/*   dn is the number to round (dn->digits is > set->digits)	      */
/*   set is the relevant context				      */
/*   status is the status accumulator				      */
/*								      */
/*   returns an allocated decNumber with the rounded result.	      */
/*								      */
/* lostDigits and other status may be set by this.		      */
/*								      */
/* Since the input is an operand, it must not be modified.	      */
/* Instead, return an allocated decNumber, rounded as required.	      */
/* It is the caller's responsibility to free the allocated storage.   */
/*								      */
/* If no storage is available then the result cannot be used, so NULL */
/* is returned.							      */
/* ------------------------------------------------------------------ */
static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
				  uInt *status) {
  decNumber *res;			/* result structure */
  uInt newstatus=0;			/* status from round */
  Int  residue=0;			/* rounding accumulator */

  /* Allocate storage for the returned decNumber, big enough for the */
  /* length specified by the context */
  res=(decNumber *)malloc(sizeof(decNumber)
			  +(D2U(set->digits)-1)*sizeof(Unit));
  if (res==NULL) {
    *status|=DEC_Insufficient_storage;
    return NULL;
    }
  decCopyFit(res, dn, set, &residue, &newstatus);
  decApplyRound(res, set, residue, &newstatus);

  /* If that set Inexact then "lost digits" is raised... */
  if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
  *status|=newstatus;
  return res;
  } /* decRoundOperand */
#endif

/* ------------------------------------------------------------------ */
/* decCopyFit -- copy a number, truncating the coefficient if needed  */
/*								      */
/*   dest is the target decNumber				      */
/*   src  is the source decNumber				      */
/*   set is the context [used for length (digits) and rounding mode]  */
/*   residue is the residue accumulator				      */
/*   status contains the current status to be updated		      */
/*								      */
/* (dest==src is allowed and will be a no-op if fits)		      */
/* All fields are updated as required.				      */
/* ------------------------------------------------------------------ */
static void decCopyFit(decNumber *dest, const decNumber *src,
		       decContext *set, Int *residue, uInt *status) {
  dest->bits=src->bits;
  dest->exponent=src->exponent;
  decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
  } /* decCopyFit */

/* ------------------------------------------------------------------ */
/* decSetCoeff -- set the coefficient of a number		      */
/*								      */
/*   dn	   is the number whose coefficient array is to be set.	      */
/*	   It must have space for set->digits digits		      */
/*   set   is the context [for size]				      */
/*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
/*   len   is digits in the source coefficient [may be dn->digits]    */
/*   residue is the residue accumulator.  This has values as in	      */
/*	   decApplyRound, and will be unchanged unless the	      */
/*	   target size is less than len.  In this case, the	      */
/*	   coefficient is truncated and the residue is updated to     */
/*	   reflect the previous residue and the dropped digits.	      */
/*   status is the status accumulator, as usual			      */
/*								      */
/* The coefficient may already be in the number, or it can be an      */
/* external intermediate array.	 If it is in the number, lsu must ==  */
/* dn->lsu and len must == dn->digits.				      */
/*								      */
/* Note that the coefficient length (len) may be < set->digits, and   */
/* in this case this merely copies the coefficient (or is a no-op     */
/* if dn->lsu==lsu).						      */
/*								      */
/* Note also that (only internally, from decQuantizeOp and	      */
/* decSetSubnormal) the value of set->digits may be less than one,    */
/* indicating a round to left.	This routine handles that case	      */
/* correctly; caller ensures space.				      */
/*								      */
/* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
/* updated as necessary.   dn->bits (sign) is unchanged.	      */
/*								      */
/* DEC_Rounded status is set if any digits are discarded.	      */
/* DEC_Inexact status is set if any non-zero digits are discarded, or */
/*			 incoming residue was non-0 (implies rounded) */
/* ------------------------------------------------------------------ */
/* mapping array: maps 0-9 to canonical residues, so that a residue */
/* can be adjusted in the range [-1, +1] and achieve correct rounding */
/*			       0  1  2	3  4  5	 6  7  8  9 */
static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
			Int len, Int *residue, uInt *status) {
  Int	discard;	      /* number of digits to discard */
  uInt	cut;		      /* cut point in Unit */
  const Unit *up;	      /* work */
  Unit	*target;	      /* .. */
  Int	count;		      /* .. */
  #if DECDPUN<=4
  uInt	temp;		      /* .. */
  #endif

  discard=len-set->digits;    /* digits to discard */
  if (discard<=0) {	      /* no digits are being discarded */
    if (dn->lsu!=lsu) {	      /* copy needed */
      /* copy the coefficient array to the result number; no shift needed */
      count=len;	      /* avoids D2U */
      up=lsu;
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
	*target=*up;
      dn->digits=len;	      /* set the new length */
      }
    /* dn->exponent and residue are unchanged, record any inexactitude */
    if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
    return;
    }

  /* some digits must be discarded ... */
  dn->exponent+=discard;      /* maintain numerical value */
  *status|=DEC_Rounded;	      /* accumulate Rounded status */
  if (*residue>1) *residue=1; /* previous residue now to right, so reduce */

  if (discard>len) {	      /* everything, +1, is being discarded */
    /* guard digit is 0 */
    /* residue is all the number [NB could be all 0s] */
    if (*residue<=0) {	      /* not already positive */
      count=len;	      /* avoids D2U */
      for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
	*residue=1;
	break;		      /* no need to check any others */
	}
      }
    if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
    *dn->lsu=0;		      /* coefficient will now be 0 */
    dn->digits=1;	      /* .. */
    return;
    } /* total discard */

  /* partial discard [most common case] */
  /* here, at least the first (most significant) discarded digit exists */

  /* spin up the number, noting residue during the spin, until get to */
  /* the Unit with the first discarded digit.  When reach it, extract */
  /* it and remember its position */
  count=0;
  for (up=lsu;; up++) {
    count+=DECDPUN;
    if (count>=discard) break; /* full ones all checked */
    if (*up!=0) *residue=1;
    } /* up */

  /* here up -> Unit with first discarded digit */
  cut=discard-(count-DECDPUN)-1;
  if (cut==DECDPUN-1) {	      /* unit-boundary case (fast) */
    Unit half=(Unit)powers[DECDPUN]>>1;
    /* set residue directly */
    if (*up>=half) {
      if (*up>half) *residue=7;
      else *residue+=5;	      /* add sticky bit */
      }
     else { /* <half */
      if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
      }
    if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
      *dn->lsu=0;	      /* .. result is 0 */
      dn->digits=1;	      /* .. */
      }
     else {		      /* shift to least */
      count=set->digits;      /* now digits to end up with */
      dn->digits=count;	      /* set the new length */
      up++;		      /* move to next */
      /* on unit boundary, so shift-down copy loop is simple */
      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
	*target=*up;
      }
    } /* unit-boundary case */

   else { /* discard digit is in low digit(s), and not top digit */
    uInt  discard1;		   /* first discarded digit */
    uInt  quot, rem;		   /* for divisions */
    if (cut==0) quot=*up;	   /* is at bottom of unit */
     else /* cut>0 */ {		   /* it's not at bottom of unit */
      #if DECDPUN<=4
	quot=QUOT10(*up, cut);
	rem=*up-quot*powers[cut];
      #else
	rem=*up%powers[cut];
	quot=*up/powers[cut];
      #endif
      if (rem!=0) *residue=1;
      }
    /* discard digit is now at bottom of quot */
    #if DECDPUN<=4
      temp=(quot*6554)>>16;	   /* fast /10 */
      /* Vowels algorithm here not a win (9 instructions) */
      discard1=quot-X10(temp);
      quot=temp;
    #else
      discard1=quot%10;
      quot=quot/10;
    #endif
    /* here, discard1 is the guard digit, and residue is everything */
    /* else [use mapping array to accumulate residue safely] */
    *residue+=resmap[discard1];
    cut++;			   /* update cut */
    /* here: up -> Unit of the array with bottom digit */
    /*	     cut is the division point for each Unit */
    /*	     quot holds the uncut high-order digits for the current unit */
    if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
      *dn->lsu=0;		   /* .. result is 0 */
      dn->digits=1;		   /* .. */
      }
     else {			   /* shift to least needed */
      count=set->digits;	   /* now digits to end up with */
      dn->digits=count;		   /* set the new length */
      /* shift-copy the coefficient array to the result number */
      for (target=dn->lsu; ; target++) {
	*target=(Unit)quot;
	count-=(DECDPUN-cut);
	if (count<=0) break;
	up++;
	quot=*up;
	#if DECDPUN<=4
	  quot=QUOT10(quot, cut);
	  rem=*up-quot*powers[cut];
	#else
	  rem=quot%powers[cut];
	  quot=quot/powers[cut];
	#endif
	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
	count-=cut;
	if (count<=0) break;
	} /* shift-copy loop */
      } /* shift to least */
    } /* not unit boundary */

  if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
  return;
  } /* decSetCoeff */

/* ------------------------------------------------------------------ */
/* decApplyRound -- apply pending rounding to a number		      */
/*								      */
/*   dn	   is the number, with space for set->digits digits	      */
/*   set   is the context [for size and rounding mode]		      */
/*   residue indicates pending rounding, being any accumulated	      */
/*	   guard and sticky information.  It may be:		      */
/*	   6-9: rounding digit is >5				      */
/*	   5:	rounding digit is exactly half-way		      */
/*	   1-4: rounding digit is <5 and >0			      */
/*	   0:	the coefficient is exact			      */
/*	  -1:	as 1, but the hidden digits are subtractive, that     */
/*		is, of the opposite sign to dn.	 In this case the     */
/*		coefficient must be non-0.  This case occurs when     */
/*		subtracting a small number (which can be reduced to   */
/*		a sticky bit); see decAddOp.			      */
/*   status is the status accumulator, as usual			      */
/*								      */
/* This routine applies rounding while keeping the length of the      */
/* coefficient constant.  The exponent and status are unchanged	      */
/* except if:							      */
/*								      */
/*   -- the coefficient was increased and is all nines (in which      */
/*	case Overflow could occur, and is handled directly here so    */
/*	the caller does not need to re-test for overflow)	      */
/*								      */
/*   -- the coefficient was decreased and becomes all nines (in which */
/*	case Underflow could occur, and is also handled directly).    */
/*								      */
/* All fields in dn are updated as required.			      */
/*								      */
/* ------------------------------------------------------------------ */
static void decApplyRound(decNumber *dn, decContext *set, Int residue,
			  uInt *status) {
  Int  bump;		      /* 1 if coefficient needs to be incremented */
			      /* -1 if coefficient needs to be decremented */

  if (residue==0) return;     /* nothing to apply */

  bump=0;		      /* assume a smooth ride */

  /* now decide whether, and how, to round, depending on mode */
  switch (set->round) {
    case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
      /* This is the same as DEC_ROUND_DOWN unless there is a */
      /* positive residue and the lsd of dn is 0 or 5, in which case */
      /* it is bumped; when residue is <0, the number is therefore */
      /* bumped down unless the final digit was 1 or 6 (in which */
      /* case it is bumped down and then up -- a no-op) */
      Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
      if (residue<0 && lsd5!=1) bump=-1;
       else if (residue>0 && lsd5==0) bump=1;
      /* [bump==1 could be applied directly; use common path for clarity] */
      break;} /* r-05 */

    case DEC_ROUND_DOWN: {
      /* no change, except if negative residue */
      if (residue<0) bump=-1;
      break;} /* r-d */

    case DEC_ROUND_HALF_DOWN: {
      if (residue>5) bump=1;
      break;} /* r-h-d */

    case DEC_ROUND_HALF_EVEN: {
      if (residue>5) bump=1;		/* >0.5 goes up */
       else if (residue==5) {		/* exactly 0.5000... */
	/* 0.5 goes up iff [new] lsd is odd */
	if (*dn->lsu & 0x01) bump=1;
	}
      break;} /* r-h-e */

    case DEC_ROUND_HALF_UP: {
      if (residue>=5) bump=1;
      break;} /* r-h-u */

    case DEC_ROUND_UP: {
      if (residue>0) bump=1;
      break;} /* r-u */

    case DEC_ROUND_CEILING: {
      /* same as _UP for positive numbers, and as _DOWN for negatives */
      /* [negative residue cannot occur on 0] */
      if (decNumberIsNegative(dn)) {
	if (residue<0) bump=-1;
	}
       else {
	if (residue>0) bump=1;
	}
      break;} /* r-c */

    case DEC_ROUND_FLOOR: {
      /* same as _UP for negative numbers, and as _DOWN for positive */
      /* [negative residue cannot occur on 0] */
      if (!decNumberIsNegative(dn)) {
	if (residue<0) bump=-1;
	}
       else {
	if (residue>0) bump=1;
	}
      break;} /* r-f */

    default: {	    /* e.g., DEC_ROUND_MAX */
      *status|=DEC_Invalid_context;
      #if DECTRACE || (DECCHECK && DECVERB)
      printf("Unknown rounding mode: %d\n", set->round);
      #endif
      break;}
    } /* switch */

  /* now bump the number, up or down, if need be */
  if (bump==0) return;			     /* no action required */

  /* Simply use decUnitAddSub unless bumping up and the number is */
  /* all nines.	 In this special case set to 100... explicitly */
  /* and adjust the exponent by one (as otherwise could overflow */
  /* the array) */
  /* Similarly handle all-nines result if bumping down. */
  if (bump>0) {
    Unit *up;				     /* work */
    uInt count=dn->digits;		     /* digits to be checked */
    for (up=dn->lsu; ; up++) {
      if (count<=DECDPUN) {
	/* this is the last Unit (the msu) */
	if (*up!=powers[count]-1) break;     /* not still 9s */
	/* here if it, too, is all nines */
	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
	dn->exponent++;			     /* and bump exponent */
	/* [which, very rarely, could cause Overflow...] */
	if ((dn->exponent+dn->digits)>set->emax+1) {
	  decSetOverflow(dn, set, status);
	  }
	return;				     /* done */
	}
      /* a full unit to check, with more to come */
      if (*up!=DECDPUNMAX) break;	     /* not still 9s */
      count-=DECDPUN;
      } /* up */
    } /* bump>0 */
   else {				     /* -1 */
    /* here checking for a pre-bump of 1000... (leading 1, all */
    /* other digits zero) */
    Unit *up, *sup;			     /* work */
    uInt count=dn->digits;		     /* digits to be checked */
    for (up=dn->lsu; ; up++) {
      if (count<=DECDPUN) {
	/* this is the last Unit (the msu) */
	if (*up!=powers[count-1]) break;     /* not 100.. */
	/* here if have the 1000... case */
	sup=up;				     /* save msu pointer */
	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
	/* others all to all-nines, too */
	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
	dn->exponent--;			     /* and bump exponent */

	/* iff the number was at the subnormal boundary (exponent=etiny) */
	/* then the exponent is now out of range, so it will in fact get */
	/* clamped to etiny and the final 9 dropped. */
	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
	/*	  dn->exponent, set->digits); */
	if (dn->exponent+1==set->emin-set->digits+1) {
	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
	   else {
	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
	    dn->digits--;
	    }
	  dn->exponent++;
	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
	  }
	return;				     /* done */
	}

      /* a full unit to check, with more to come */
      if (*up!=0) break;		     /* not still 0s */
      count-=DECDPUN;
      } /* up */

    } /* bump<0 */

  /* Actual bump needed.  Do it. */
  decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
  } /* decApplyRound */

#if DECSUBSET
/* ------------------------------------------------------------------ */
/* decFinish -- finish processing a number			      */
/*								      */
/*   dn is the number						      */
/*   set is the context						      */
/*   residue is the rounding accumulator (as in decApplyRound)	      */
/*   status is the accumulator					      */
/*								      */
/* This finishes off the current number by:			      */
/*    1. If not extended:					      */
/*	 a. Converting a zero result to clean '0'		      */
/*	 b. Reducing positive exponents to 0, if would fit in digits  */
/*    2. Checking for overflow and subnormals (always)		      */
/* Note this is just Finalize when no subset arithmetic.	      */
/* All fields are updated as required.				      */
/* ------------------------------------------------------------------ */
static void decFinish(decNumber *dn, decContext *set, Int *residue,
		      uInt *status) {
  if (!set->extended) {
    if ISZERO(dn) {		   /* value is zero */
      dn->exponent=0;		   /* clean exponent .. */
      dn->bits=0;		   /* .. and sign */
      return;			   /* no error possible */
      }
    if (dn->exponent>=0) {	   /* non-negative exponent */
      /* >0; reduce to integer if possible */
      if (set->digits >= (dn->exponent+dn->digits)) {
	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
	dn->exponent=0;
	}
      }
    } /* !extended */

  decFinalize(dn, set, residue, status);
  } /* decFinish */
#endif

/* ------------------------------------------------------------------ */
/* decFinalize -- final check, clamp, and round of a number	      */
/*								      */
/*   dn is the number						      */
/*   set is the context						      */
/*   residue is the rounding accumulator (as in decApplyRound)	      */
/*   status is the status accumulator				      */
/*								      */
/* This finishes off the current number by checking for subnormal     */
/* results, applying any pending rounding, checking for overflow,     */
/* and applying any clamping.					      */
/* Underflow and overflow conditions are raised as appropriate.	      */
/* All fields are updated as required.				      */
/* ------------------------------------------------------------------ */
static void decFinalize(decNumber *dn, decContext *set, Int *residue,
			uInt *status) {
  Int shift;				/* shift needed if clamping */
  Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */

  /* Must be careful, here, when checking the exponent as the */
  /* adjusted exponent could overflow 31 bits [because it may already */
  /* be up to twice the expected]. */

  /* First test for subnormal.	This must be done before any final */
  /* round as the result could be rounded to Nmin or 0. */
  if (dn->exponent<=tinyexp) {		/* prefilter */
    Int comp;
    decNumber nmin;
    /* A very nasty case here is dn == Nmin and residue<0 */
    if (dn->exponent<tinyexp) {
      /* Go handle subnormals; this will apply round if needed. */
      decSetSubnormal(dn, set, residue, status);
      return;
      }
    /* Equals case: only subnormal if dn=Nmin and negative residue */
    decNumberZero(&nmin);
    nmin.lsu[0]=1;
    nmin.exponent=set->emin;
    comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
    if (comp==BADINT) {				  /* oops */
      *status|=DEC_Insufficient_storage;	  /* abandon... */
      return;
      }
    if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
      decApplyRound(dn, set, *residue, status);	  /* might force down */
      decSetSubnormal(dn, set, residue, status);
      return;
      }
    }

  /* now apply any pending round (this could raise overflow). */
  if (*residue!=0) decApplyRound(dn, set, *residue, status);

  /* Check for overflow [redundant in the 'rare' case] or clamp */
  if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */


  /* here when might have an overflow or clamp to do */
  if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
    decSetOverflow(dn, set, status);
    return;
    }
  /* here when the result is normal but in clamp range */
  if (!set->clamp) return;

  /* here when need to apply the IEEE exponent clamp (fold-down) */
  shift=dn->exponent-(set->emax-set->digits+1);

  /* shift coefficient (if non-zero) */
  if (!ISZERO(dn)) {
    dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
    }
  dn->exponent-=shift;	 /* adjust the exponent to match */
  *status|=DEC_Clamped;	 /* and record the dirty deed */
  return;
  } /* decFinalize */

/* ------------------------------------------------------------------ */
/* decSetOverflow -- set number to proper overflow value	      */
/*								      */
/*   dn is the number (used for sign [only] and result)		      */
/*   set is the context [used for the rounding mode, etc.]	      */
/*   status contains the current status to be updated		      */
/*								      */
/* This sets the sign of a number and sets its value to either	      */
/* Infinity or the maximum finite value, depending on the sign of     */
/* dn and the rounding mode, following IEEE 854 rules.		      */
/* ------------------------------------------------------------------ */
static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
  Flag needmax=0;		   /* result is maximum finite value */
  uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */

  if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
    Int emax=set->emax;			     /* limit value */
    if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
    if (dn->exponent>emax) {		     /* clamp required */
      dn->exponent=emax;
      *status|=DEC_Clamped;
      }
    return;
    }

  decNumberZero(dn);
  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 (sign) needmax=1;	   /* Infinity if non-negative */
      break;} /* r-c */
    case DEC_ROUND_FLOOR: {
      if (!sign) needmax=1;	   /* Infinity if negative */
      break;} /* r-f */
    default: break;		   /* Infinity in all other cases */
    }
  if (needmax) {
    decSetMaxValue(dn, set);
    dn->bits=sign;		   /* set sign */
    }
   else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
  *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
  } /* decSetOverflow */

/* ------------------------------------------------------------------ */
/* decSetMaxValue -- set number to +Nmax (maximum normal value)	      */
/*								      */
/*   dn is the number to set					      */
/*   set is the context [used for digits and emax]		      */
/*								      */
/* This sets the number to the maximum positive value.		      */
/* ------------------------------------------------------------------ */
static void decSetMaxValue(decNumber *dn, decContext *set) {
  Unit *up;			   /* work */
  Int count=set->digits;	   /* nines to add */
  dn->digits=count;
  /* fill in all nines to set maximum value */
  for (up=dn->lsu; ; up++) {
    if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
     else {				/* this is the msu */
      *up=(Unit)(powers[count]-1);
      break;
      }
    count-=DECDPUN;		   /* filled those digits */
    } /* up */
  dn->bits=0;			   /* + sign */
  dn->exponent=set->emax-set->digits+1;
  } /* decSetMaxValue */

/* ------------------------------------------------------------------ */
/* decSetSubnormal -- process value whose exponent is <Emin	      */
/*								      */
/*   dn is the number (used as input as well as output; it may have   */
/*	   an allowed subnormal value, which may need to be rounded)  */
/*   set is the context [used for the rounding mode]		      */
/*   residue is any pending residue				      */
/*   status contains the current status to be updated		      */
/*								      */
/* If subset mode, set result to zero and set Underflow flags.	      */
/*								      */
/* Value may be zero with a low exponent; this does not set Subnormal */
/* but the exponent will be clamped to Etiny.			      */
/*								      */
/* Otherwise ensure exponent is not out of range, and round as	      */
/* necessary.  Underflow is set if the result is Inexact.	      */
/* ------------------------------------------------------------------ */
static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
			    uInt *status) {
  Int	     dnexp;	      /* saves original exponent */
  decContext workset;	      /* work */
  Int	     etiny, adjust;   /* .. */

  #if DECSUBSET
  /* simple set to zero and 'hard underflow' for subset */
  if (!set->extended) {
    decNumberZero(dn);
    /* always full overflow */
    *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
    return;
    }
  #endif

  /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
  /* (Etiny) if needed */
  etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */

  if ISZERO(dn) {			/* value is zero */
    /* residue can never be non-zero here */
    #if DECCHECK
      if (*residue!=0) {
	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
	*status|=DEC_Invalid_operation;
	}
    #endif
    if (dn->exponent<etiny) {		/* clamp required */
      dn->exponent=etiny;
      *status|=DEC_Clamped;
      }
    return;
    }

  *status|=DEC_Subnormal;		/* have a non-zero subnormal */
  adjust=etiny-dn->exponent;		/* calculate digits to remove */
  if (adjust<=0) {			/* not out of range; unrounded */
    /* residue can never be non-zero here, except in the Nmin-residue */
    /* case (which is a subnormal result), so can take fast-path here */
    /* it may already be inexact (from setting the coefficient) */
    if (*status&DEC_Inexact) *status|=DEC_Underflow;
    return;
    }

  /* adjust>0, so need to rescale the result so exponent becomes Etiny */
  /* [this code is similar to that in rescale] */
  dnexp=dn->exponent;			/* save exponent */
  workset=*set;				/* clone rounding, etc. */
  workset.digits=dn->digits-adjust;	/* set requested length */
  workset.emin-=adjust;			/* and adjust emin to match */
  /* [note that the latter can be <1, here, similar to Rescale case] */
  decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
  decApplyRound(dn, &workset, *residue, status);

  /* Use 754R/854 default rule: Underflow is set iff Inexact */
  /* [independent of whether trapped] */
  if (*status&DEC_Inexact) *status|=DEC_Underflow;

  /* if rounded up a 999s case, exponent will be off by one; adjust */
  /* back if so [it will fit, because it was shortened earlier] */
  if (dn->exponent>etiny) {
    dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
    dn->exponent--;			/* (re)adjust the exponent. */
    }

  /* if rounded to zero, it is by definition clamped... */
  if (ISZERO(dn)) *status|=DEC_Clamped;
  } /* decSetSubnormal */

/* ------------------------------------------------------------------ */
/* decCheckMath - check entry conditions for a math function	      */
/*								      */
/*   This checks the context and the operand			      */
/*								      */
/*   rhs is the operand to check				      */
/*   set is the context to check				      */
/*   status is unchanged if both are good			      */
/*								      */
/* returns non-zero if status is changed, 0 otherwise		      */
/*								      */
/* Restrictions enforced:					      */
/*								      */
/*   digits, emax, and -emin in the context must be less than	      */
/*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
/*   non-zero.	Invalid_operation is set in the status if a	      */
/*   restriction is violated.					      */
/* ------------------------------------------------------------------ */
static uInt decCheckMath(const decNumber *rhs, decContext *set,
			 uInt *status) {
  uInt save=*status;			     /* record */
  if (set->digits>DEC_MAX_MATH
   || set->emax>DEC_MAX_MATH
   || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
   else if ((rhs->digits>DEC_MAX_MATH
     || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
     || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
     && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
  return (*status!=save);
  } /* decCheckMath */

/* ------------------------------------------------------------------ */
/* decGetInt -- get integer from a number			      */
/*								      */
/*   dn is the number [which will not be altered]		      */
/*								      */
/*   returns one of:						      */
/*     BADINT if there is a non-zero fraction			      */
/*     the converted integer					      */
/*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
/*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
/*								      */
/* This checks and gets a whole number from the input decNumber.      */
/* The sign can be determined from dn by the caller when BIGEVEN or   */
/* BIGODD is returned.						      */
/* ------------------------------------------------------------------ */
static Int decGetInt(const decNumber *dn) {
  Int  theInt;				/* result accumulator */
  const Unit *up;			/* work */
  Int  got;				/* digits (real or not) processed */
  Int  ilength=dn->digits+dn->exponent; /* integral length */
  Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */

  /* The number must be an integer that fits in 10 digits */
  /* Assert, here, that 10 is enough for any rescale Etiny */
  #if DEC_MAX_EMAX > 999999999
    #error GetInt may need updating [for Emax]
  #endif
  #if DEC_MIN_EMIN < -999999999
    #error GetInt may need updating [for Emin]
  #endif
  if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */

  up=dn->lsu;				/* ready for lsu */
  theInt=0;				/* ready to accumulate */
  if (dn->exponent>=0) {		/* relatively easy */
    /* no fractional part [usual]; allow for positive exponent */
    got=dn->exponent;
    }
   else { /* -ve exponent; some fractional part to check and discard */
    Int count=-dn->exponent;		/* digits to discard */
    /* spin up whole units until reach the Unit with the unit digit */
    for (; count>=DECDPUN; up++) {
      if (*up!=0) return BADINT;	/* non-zero Unit to discard */
      count-=DECDPUN;
      }
    if (count==0) got=0;		/* [a multiple of DECDPUN] */
     else {				/* [not multiple of DECDPUN] */
      Int rem;				/* work */
      /* slice off fraction digits and check for non-zero */
      #if DECDPUN<=4
	theInt=QUOT10(*up, count);
	rem=*up-theInt*powers[count];
      #else
	rem=*up%powers[count];		/* slice off discards */
	theInt=*up/powers[count];
      #endif
      if (rem!=0) return BADINT;	/* non-zero fraction */
      /* it looks good */
      got=DECDPUN-count;		/* number of digits so far */
      up++;				/* ready for next */
      }
    }
  /* now it's known there's no fractional part */

  /* tricky code now, to accumulate up to 9.3 digits */
  if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */

  if (ilength<11) {
    Int save=theInt;
    /* collect any remaining unit(s) */
    for (; got<ilength; up++) {
      theInt+=*up*powers[got];
      got+=DECDPUN;
      }
    if (ilength==10) {			/* need to check for wrap */
      if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
	 /* [that test also disallows the BADINT result case] */
       else if (neg && theInt>1999999997) ilength=11;
       else if (!neg && theInt>999999999) ilength=11;
      if (ilength==11) theInt=save;	/* restore correct low bit */
      }
    }

  if (ilength>10) {			/* too big */
    if (theInt&1) return BIGODD;	/* bottom bit 1 */
    return BIGEVEN;			/* bottom bit 0 */
    }

  if (neg) theInt=-theInt;		/* apply sign */
  return theInt;
  } /* decGetInt */

/* ------------------------------------------------------------------ */
/* decDecap -- decapitate the coefficient of a number		      */
/*								      */
/*   dn	  is the number to be decapitated			      */
/*   drop is the number of digits to be removed from the left of dn;  */
/*     this must be <= dn->digits (if equal, the coefficient is	      */
/*     set to 0)						      */
/*								      */
/* Returns dn; dn->digits will be <= the initial digits less drop     */
/* (after removing drop digits there may be leading zero digits	      */
/* which will also be removed).	 Only dn->lsu and dn->digits change.  */
/* ------------------------------------------------------------------ */
static decNumber *decDecap(decNumber *dn, Int drop) {
  Unit *msu;				/* -> target cut point */
  Int cut;				/* work */
  if (drop>=dn->digits) {		/* losing the whole thing */
    #if DECCHECK
    if (drop>dn->digits)
      printf("decDecap called with drop>digits [%ld>%ld]\n",
	     (LI)drop, (LI)dn->digits);
    #endif
    dn->lsu[0]=0;
    dn->digits=1;
    return dn;
    }
  msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
  cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
  if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
  /* that may have left leading zero digits, so do a proper count... */
  dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
  return dn;
  } /* decDecap */

/* ------------------------------------------------------------------ */
/* 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, it is the same     */
/*   length as str1 and str2, and each character of targ is in either */
/*   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 */

/* ------------------------------------------------------------------ */
/* decNaNs -- handle NaN operand or operands			      */
/*								      */
/*   res     is the result number				      */
/*   lhs     is the first operand				      */
/*   rhs     is the second operand, or NULL if none		      */
/*   context is used to limit payload length			      */
/*   status  contains the current status			      */
/*   returns res in case convenient				      */
/*								      */
/* Called when one or both operands is a NaN, and propagates the      */
/* appropriate result to res.  When an sNaN is found, it is changed   */
/* to a qNaN and Invalid operation is set.			      */
/* ------------------------------------------------------------------ */
static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
			   const decNumber *rhs, decContext *set,
			   uInt *status) {
  /* This decision tree ends up with LHS being the source pointer, */
  /* and status updated if need be */
  if (lhs->bits & DECSNAN)
    *status|=DEC_Invalid_operation | DEC_sNaN;
   else if (rhs==NULL);
   else if (rhs->bits & DECSNAN) {
    lhs=rhs;
    *status|=DEC_Invalid_operation | DEC_sNaN;
    }
   else if (lhs->bits & DECNAN);
   else lhs=rhs;

  /* propagate the payload */
  if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
   else { /* too long */
    const Unit *ul;
    Unit *ur, *uresp1;
    /* copy safe number of units, then decapitate */
    res->bits=lhs->bits;		/* need sign etc. */
    uresp1=res->lsu+D2U(set->digits);
    for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
    res->digits=D2U(set->digits)*DECDPUN;
    /* maybe still too long */
    if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
    }

  res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
  res->bits|=DECNAN;	      /* .. preserving sign */
  res->exponent=0;	      /* clean exponent */
			      /* [coefficient was copied/decapitated] */
  return res;
  } /* decNaNs */

/* ------------------------------------------------------------------ */
/* decStatus -- apply non-zero status				      */
/*								      */
/*   dn	    is the number to set if error			      */
/*   status contains the current status (not yet in context)	      */
/*   set    is the context					      */
/*								      */
/* If the status is an error status, the number is set to a NaN,      */
/* unless the error was an overflow, divide-by-zero, or underflow,    */
/* in which case the number will have already been set.		      */
/*								      */
/* The context status is then updated with the new status.  Note that */
/* this may raise a signal, so control may never return from this     */
/* routine (hence resources must be recovered before it is called).   */
/* ------------------------------------------------------------------ */
static void decStatus(decNumber *dn, uInt status, decContext *set) {
  if (status & DEC_NaNs) {		/* error status -> NaN */
    /* if cause was an sNaN, clear and propagate [NaN is already set up] */
    if (status & DEC_sNaN) status&=~DEC_sNaN;
     else {
      decNumberZero(dn);		/* other error: clean throughout */
      dn->bits=DECNAN;			/* and make a quiet NaN */
      }
    }
  decContextSetStatus(set, status);	/* [may not return] */
  return;
  } /* decStatus */

/* ------------------------------------------------------------------ */
/* decGetDigits -- count digits in a Units array		      */
/*								      */
/*   uar is the Unit array holding the number (this is often an	      */
/*	    accumulator of some sort)				      */
/*   len is the length of the array in units [>=1]		      */
/*								      */
/*   returns the number of (significant) digits in the array	      */
/*								      */
/* All leading zeros are excluded, except the last if the array has   */
/* only zero Units.						      */
/* ------------------------------------------------------------------ */
/* This may be called twice during some operations. */
static Int decGetDigits(Unit *uar, Int len) {
  Unit *up=uar+(len-1);		   /* -> msu */
  Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
  #if DECDPUN>4
  uInt const *pow;		   /* work */
  #endif
				   /* (at least 1 in final msu) */
  #if DECCHECK
  if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
  #endif

  for (; up>=uar; up--) {
    if (*up==0) {		   /* unit is all 0s */
      if (digits==1) break;	   /* a zero has one digit */
      digits-=DECDPUN;		   /* adjust for 0 unit */
      continue;}
    /* found the first (most significant) non-zero Unit */
    #if DECDPUN>1		   /* not done yet */
    if (*up<10) break;		   /* is 1-9 */
    digits++;
    #if DECDPUN>2		   /* not done yet */
    if (*up<100) break;		   /* is 10-99 */
    digits++;
    #if DECDPUN>3		   /* not done yet */
    if (*up<1000) break;	   /* is 100-999 */
    digits++;
    #if DECDPUN>4		   /* count the rest ... */
    for (pow=&powers[4]; *up>=*pow; pow++) digits++;
    #endif
    #endif
    #endif
    #endif
    break;
    } /* up */
  return digits;
  } /* decGetDigits */

#if DECTRACE | DECCHECK
/* ------------------------------------------------------------------ */
/* decNumberShow -- display a number [debug aid]		      */
/*   dn is the number to show					      */
/*								      */
/* Shows: sign, exponent, coefficient (msu first), digits	      */
/*    or: sign, special-value					      */
/* ------------------------------------------------------------------ */
/* this is public so other modules can use it */
void decNumberShow(const decNumber *dn) {
  const Unit *up;		   /* work */
  uInt u, d;			   /* .. */
  Int cut;			   /* .. */
  char isign='+';		   /* main sign */
  if (dn==NULL) {
    printf("NULL\n");
    return;}
  if (decNumberIsNegative(dn)) isign='-';
  printf(" >> %c ", isign);
  if (dn->bits&DECSPECIAL) {	   /* Is a special value */
    if (decNumberIsInfinite(dn)) printf("Infinity");
     else {				     /* a NaN */
      if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
       else printf("NaN");
      }
    /* if coefficient and exponent are 0, no more to do */
    if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
      printf("\n");
      return;}
    /* drop through to report other information */
    printf(" ");
    }

  /* now carefully display the coefficient */
  up=dn->lsu+D2U(dn->digits)-1;		/* msu */
  printf("%ld", (LI)*up);
  for (up=up-1; up>=dn->lsu; up--) {
    u=*up;
    printf(":");
    for (cut=DECDPUN-1; cut>=0; cut--) {
      d=u/powers[cut];
      u-=d*powers[cut];
      printf("%ld", (LI)d);
      } /* cut */
    } /* up */
  if (dn->exponent!=0) {
    char esign='+';
    if (dn->exponent<0) esign='-';
    printf(" E%c%ld", esign, (LI)abs(dn->exponent));
    }
  printf(" [%ld]\n", (LI)dn->digits);
  } /* decNumberShow */
#endif

#if DECTRACE || DECCHECK
/* ------------------------------------------------------------------ */
/* decDumpAr -- display a unit array [debug/check aid]		      */
/*   name is a single-character tag name			      */
/*   ar	  is the array to display				      */
/*   len  is the length of the array in Units			      */
/* ------------------------------------------------------------------ */
static void decDumpAr(char name, const Unit *ar, Int len) {
  Int i;
  const char *spec;
  #if DECDPUN==9
    spec="%09d ";
  #elif DECDPUN==8
    spec="%08d ";
  #elif DECDPUN==7
    spec="%07d ";
  #elif DECDPUN==6
    spec="%06d ";
  #elif DECDPUN==5
    spec="%05d ";
  #elif DECDPUN==4
    spec="%04d ";
  #elif DECDPUN==3
    spec="%03d ";
  #elif DECDPUN==2
    spec="%02d ";
  #else
    spec="%d ";
  #endif
  printf("  :%c: ", name);
  for (i=len-1; i>=0; i--) {
    if (i==len-1) printf("%ld ", (LI)ar[i]);
     else printf(spec, ar[i]);
    }
  printf("\n");
  return;}
#endif

#if DECCHECK
/* ------------------------------------------------------------------ */
/* decCheckOperands -- check operand(s) to a routine		      */
/*   res is the result structure (not checked; it will be set to      */
/*	    quiet NaN if error found (and it is not NULL))	      */
/*   lhs is the first operand (may be DECUNRESU)		      */
/*   rhs is the second (may be DECUNUSED)			      */
/*   set is the context (may be DECUNCONT)			      */
/*   returns 0 if both operands, and the context are clean, or 1      */
/*     otherwise (in which case the context will show an error,	      */
/*     unless NULL).  Note that res is not cleaned; caller should     */
/*     handle this so res=NULL case is safe.			      */
/* The caller is expected to abandon immediately if 1 is returned.    */
/* ------------------------------------------------------------------ */
static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
			     const decNumber *rhs, decContext *set) {
  Flag bad=0;
  if (set==NULL) {		   /* oops; hopeless */
    #if DECTRACE || DECVERB
    printf("Reference to context is NULL.\n");
    #endif
    bad=1;
    return 1;}
   else if (set!=DECUNCONT
     && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
    bad=1;
    #if DECTRACE || DECVERB
    printf("Bad context [digits=%ld round=%ld].\n",
	   (LI)set->digits, (LI)set->round);
    #endif
    }
   else {
    if (res==NULL) {
      bad=1;
      #if DECTRACE
      /* this one not DECVERB as standard tests include NULL */
      printf("Reference to result is NULL.\n");
      #endif
      }
    if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
    if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
    }
  if (bad) {
    if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
    if (res!=DECUNRESU && res!=NULL) {
      decNumberZero(res);
      res->bits=DECNAN;	      /* qNaN */
      }
    }
  return bad;
  } /* decCheckOperands */

/* ------------------------------------------------------------------ */
/* decCheckNumber -- check a number				      */
/*   dn is the number to check					      */
/*   returns 0 if the number is clean, or 1 otherwise		      */
/*								      */
/* The number is considered valid if it could be a result from some   */
/* operation in some valid context.				      */
/* ------------------------------------------------------------------ */
static Flag decCheckNumber(const decNumber *dn) {
  const Unit *up;	      /* work */
  uInt maxuint;		      /* .. */
  Int ae, d, digits;	      /* .. */
  Int emin, emax;	      /* .. */

  if (dn==NULL) {	      /* hopeless */
    #if DECTRACE
    /* this one not DECVERB as standard tests include NULL */
    printf("Reference to decNumber is NULL.\n");
    #endif
    return 1;}

  /* check special values */
  if (dn->bits & DECSPECIAL) {
    if (dn->exponent!=0) {
      #if DECTRACE || DECVERB
      printf("Exponent %ld (not 0) for a special value [%02x].\n",
	     (LI)dn->exponent, dn->bits);
      #endif
      return 1;}

    /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
    if (decNumberIsInfinite(dn)) {
      if (dn->digits!=1) {
	#if DECTRACE || DECVERB
	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
	#endif
	return 1;}
      if (*dn->lsu!=0) {
	#if DECTRACE || DECVERB
	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
	#endif
	decDumpAr('I', dn->lsu, D2U(dn->digits));
	return 1;}
      } /* Inf */
    /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
    /*		   concrete formats (decimal64, etc.). */
    return 0;
    }

  /* check the coefficient */
  if (dn->digits<1 || dn->digits>DECNUMMAXP) {
    #if DECTRACE || DECVERB
    printf("Digits %ld in number.\n", (LI)dn->digits);
    #endif
    return 1;}

  d=dn->digits;

  for (up=dn->lsu; d>0; up++) {
    if (d>DECDPUN) maxuint=DECDPUNMAX;
     else {		      /* reached the msu */
      maxuint=powers[d]-1;
      if (dn->digits>1 && *up<powers[d-1]) {
	#if DECTRACE || DECVERB
	printf("Leading 0 in number.\n");
	decNumberShow(dn);
	#endif
	return 1;}
      }
    if (*up>maxuint) {
      #if DECTRACE || DECVERB
      printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
      #endif
      return 1;}
    d-=DECDPUN;
    }

  /* check the exponent.  Note that input operands can have exponents */
  /* which are out of the set->emin/set->emax and set->digits range */
  /* (just as they can have more digits than set->digits). */
  ae=dn->exponent+dn->digits-1;	   /* adjusted exponent */
  emax=DECNUMMAXE;
  emin=DECNUMMINE;
  digits=DECNUMMAXP;
  if (ae<emin-(digits-1)) {
    #if DECTRACE || DECVERB
    printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
    decNumberShow(dn);
    #endif
    return 1;}
  if (ae>+emax) {
    #if DECTRACE || DECVERB
    printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
    decNumberShow(dn);
    #endif
    return 1;}

  return 0;		 /* it's OK */
  } /* decCheckNumber */

/* ------------------------------------------------------------------ */
/* decCheckInexact -- check a normal finite inexact result has digits */
/*   dn is the number to check					      */
/*   set is the context (for status and precision)		      */
/*   sets Invalid operation, etc., if some digits are missing	      */
/* [this check is not made for DECSUBSET compilation or when	      */
/* subnormal is not set]					      */
/* ------------------------------------------------------------------ */
static void decCheckInexact(const decNumber *dn, decContext *set) {
  #if !DECSUBSET && DECEXTFLAG
    if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
     && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
      #if DECTRACE || DECVERB
      printf("Insufficient digits [%ld] on normal Inexact result.\n",
	     (LI)dn->digits);
      decNumberShow(dn);
      #endif
      decContextSetStatus(set, DEC_Invalid_operation);
      }
  #else
    /* next is a noop for quiet compiler */
    if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
  #endif
  return;
  } /* decCheckInexact */
#endif

#if DECALLOC
#undef malloc
#undef free
/* ------------------------------------------------------------------ */
/* decMalloc -- accountable allocation routine			      */
/*   n is the number of bytes to allocate			      */
/*								      */
/* Semantics is the same as the stdlib malloc routine, but bytes      */
/* allocated are accounted for globally, and corruption fences are    */
/* added before and after the 'actual' storage.			      */
/* ------------------------------------------------------------------ */
/* This routine allocates storage with an extra twelve bytes; 8 are   */
/* at the start and hold:					      */
/*   0-3 the original length requested				      */
/*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
/* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
/* ------------------------------------------------------------------ */
static void *decMalloc(size_t n) {
  uInt	size=n+12;		   /* true size */
  void	*alloc;			   /* -> allocated storage */
  uInt	*j;			   /* work */
  uByte *b, *b0;		   /* .. */

  alloc=malloc(size);		   /* -> allocated storage */
  if (alloc==NULL) return NULL;	   /* out of strorage */
  b0=(uByte *)alloc;		   /* as bytes */
  decAllocBytes+=n;		   /* account for storage */
  j=(uInt *)alloc;		   /* -> first four bytes */
  *j=n;				   /* save n */
  /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
  for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
  for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
  return b0+8;			   /* -> play area */
  } /* decMalloc */

/* ------------------------------------------------------------------ */
/* decFree -- accountable free routine				      */
/*   alloc is the storage to free				      */
/*								      */
/* Semantics is the same as the stdlib malloc routine, except that    */
/* the global storage accounting is updated and the fences are	      */
/* checked to ensure that no routine has written 'out of bounds'.     */
/* ------------------------------------------------------------------ */
/* This routine first checks that the fences have not been corrupted. */
/* It then frees the storage using the 'truw' storage address (that   */
/* is, offset by 8).						      */
/* ------------------------------------------------------------------ */
static void decFree(void *alloc) {
  uInt	*j, n;			   /* pointer, original length */
  uByte *b, *b0;		   /* work */

  if (alloc==NULL) return;	   /* allowed; it's a nop */
  b0=(uByte *)alloc;		   /* as bytes */
  b0-=8;			   /* -> true start of storage */
  j=(uInt *)b0;			   /* -> first four bytes */
  n=*j;				   /* lift */
  for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
    printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
	   b-b0-8, (Int)b0);
  for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
    printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
	   b-b0-8, (Int)b0, n);
  free(b0);			   /* drop the storage */
  decAllocBytes-=n;		   /* account for storage */
  /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
  } /* decFree */
#define malloc(a) decMalloc(a)
#define free(a) decFree(a)
#endif
