qemu/libdecnumber/decNumber.c
<<
>>
Prefs
   1/* Decimal number arithmetic module for the decNumber C Library.
   2   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
   3   Contributed by IBM Corporation.  Author Mike Cowlishaw.
   4
   5   This file is part of GCC.
   6
   7   GCC is free software; you can redistribute it and/or modify it under
   8   the terms of the GNU General Public License as published by the Free
   9   Software Foundation; either version 2, or (at your option) any later
  10   version.
  11
  12   In addition to the permissions in the GNU General Public License,
  13   the Free Software Foundation gives you unlimited permission to link
  14   the compiled version of this file into combinations with other
  15   programs, and to distribute those combinations without any
  16   restriction coming from the use of this file.  (The General Public
  17   License restrictions do apply in other respects; for example, they
  18   cover modification of the file, and distribution when not linked
  19   into a combine executable.)
  20
  21   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  22   WARRANTY; without even the implied warranty of MERCHANTABILITY or
  23   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  24   for more details.
  25
  26   You should have received a copy of the GNU General Public License
  27   along with GCC; see the file COPYING.  If not, write to the Free
  28   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
  29   02110-1301, USA.  */
  30
  31/* ------------------------------------------------------------------ */
  32/* Decimal Number arithmetic module                                   */
  33/* ------------------------------------------------------------------ */
  34/* This module comprises the routines for General Decimal Arithmetic  */
  35/* as defined in the specification which may be found on the          */
  36/* http://www2.hursley.ibm.com/decimal web pages.  It implements both */
  37/* the full ('extended') arithmetic and the simpler ('subset')        */
  38/* arithmetic.                                                        */
  39/*                                                                    */
  40/* Usage notes:                                                       */
  41/*                                                                    */
  42/* 1. This code is ANSI C89 except:                                   */
  43/*                                                                    */
  44/*       If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and       */
  45/*       uint64_t types may be used.  To avoid these, set DECUSE64=0  */
  46/*       and DECDPUN<=4 (see documentation).                          */
  47/*                                                                    */
  48/* 2. The decNumber format which this library uses is optimized for   */
  49/*    efficient processing of relatively short numbers; in particular */
  50/*    it allows the use of fixed sized structures and minimizes copy  */
  51/*    and move operations.  It does, however, support arbitrary       */
  52/*    precision (up to 999,999,999 digits) and arbitrary exponent     */
  53/*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
  54/*    range -999,999,999 through 0).  Mathematical functions (for     */
  55/*    example decNumberExp) as identified below are restricted more   */
  56/*    tightly: digits, emax, and -emin in the context must be <=      */
  57/*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
  58/*    these bounds.                                                   */
  59/*                                                                    */
  60/* 3. Logical functions are further restricted; their operands must   */
  61/*    be finite, positive, have an exponent of zero, and all digits   */
  62/*    must be either 0 or 1.  The result will only contain digits     */
  63/*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
  64/*                                                                    */
  65/* 4. Operands to operator functions are never modified unless they   */
  66/*    are also specified to be the result number (which is always     */
  67/*    permitted).  Other than that case, operands must not overlap.   */
  68/*                                                                    */
  69/* 5. Error handling: the type of the error is ORed into the status   */
  70/*    flags in the current context (decContext structure).  The       */
  71/*    SIGFPE signal is then raised if the corresponding trap-enabler  */
  72/*    flag in the decContext is set (is 1).                           */
  73/*                                                                    */
  74/*    It is the responsibility of the caller to clear the status      */
  75/*    flags as required.                                              */
  76/*                                                                    */
  77/*    The result of any routine which returns a number will always    */
  78/*    be a valid number (which may be a special value, such as an     */
  79/*    Infinity or NaN).                                               */
  80/*                                                                    */
  81/* 6. The decNumber format is not an exchangeable concrete            */
  82/*    representation as it comprises fields which may be machine-     */
  83/*    dependent (packed or unpacked, or special length, for example). */
  84/*    Canonical conversions to and from strings are provided; other   */
  85/*    conversions are available in separate modules.                  */
  86/*                                                                    */
  87/* 7. Normally, input operands are assumed to be valid.  Set DECCHECK */
  88/*    to 1 for extended operand checking (including NULL operands).   */
  89/*    Results are undefined if a badly-formed structure (or a NULL    */
  90/*    pointer to a structure) is provided, though with DECCHECK       */
  91/*    enabled the operator routines are protected against exceptions. */
  92/*    (Except if the result pointer is NULL, which is unrecoverable.) */
  93/*                                                                    */
  94/*    However, the routines will never cause exceptions if they are   */
  95/*    given well-formed operands, even if the value of the operands   */
  96/*    is inappropriate for the operation and DECCHECK is not set.     */
  97/*    (Except for SIGFPE, as and where documented.)                   */
  98/*                                                                    */
  99/* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
 100/* ------------------------------------------------------------------ */
 101/* Implementation notes for maintenance of this module:               */
 102/*                                                                    */
 103/* 1. Storage leak protection:  Routines which use malloc are not     */
 104/*    permitted to use return for fastpath or error exits (i.e.,      */
 105/*    they follow strict structured programming conventions).         */
 106/*    Instead they have a do{}while(0); construct surrounding the     */
 107/*    code which is protected -- break may be used to exit this.      */
 108/*    Other routines can safely use the return statement inline.      */
 109/*                                                                    */
 110/*    Storage leak accounting can be enabled using DECALLOC.          */
 111/*                                                                    */
 112/* 2. All loops use the for(;;) construct.  Any do construct does     */
 113/*    not loop; it is for allocation protection as just described.    */
 114/*                                                                    */
 115/* 3. Setting status in the context must always be the very last      */
 116/*    action in a routine, as non-0 status may raise a trap and hence */
 117/*    the call to set status may not return (if the handler uses long */
 118/*    jump).  Therefore all cleanup must be done first.  In general,  */
 119/*    to achieve this status is accumulated and is only applied just  */
 120/*    before return by calling decContextSetStatus (via decStatus).   */
 121/*                                                                    */
 122/*    Routines which allocate storage cannot, in general, use the     */
 123/*    'top level' routines which could cause a non-returning          */
 124/*    transfer of control.  The decXxxxOp routines are safe (do not   */
 125/*    call decStatus even if traps are set in the context) and should */
 126/*    be used instead (they are also a little faster).                */
 127/*                                                                    */
 128/* 4. Exponent checking is minimized by allowing the exponent to      */
 129/*    grow outside its limits during calculations, provided that      */
 130/*    the decFinalize function is called later.  Multiplication and   */
 131/*    division, and intermediate calculations in exponentiation,      */
 132/*    require more careful checks because of the risk of 31-bit       */
 133/*    overflow (the most negative valid exponent is -1999999997, for  */
 134/*    a 999999999-digit number with adjusted exponent of -999999999). */
 135/*                                                                    */
 136/* 5. Rounding is deferred until finalization of results, with any    */
 137/*    'off to the right' data being represented as a single digit     */
 138/*    residue (in the range -1 through 9).  This avoids any double-   */
 139/*    rounding when more than one shortening takes place (for         */
 140/*    example, when a result is subnormal).                           */
 141/*                                                                    */
 142/* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
 143/*    during many operations, so whole Units are handled and exact    */
 144/*    accounting of digits is not needed.  The correct digits value   */
 145/*    is found by decGetDigits, which accounts for leading zeros.     */
 146/*    This must be called before any rounding if the number of digits */
 147/*    is not known exactly.                                           */
 148/*                                                                    */
 149/* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
 150/*    numbers up to four digits, using appropriate constants.  This   */
 151/*    is not useful for longer numbers because overflow of 32 bits    */
 152/*    would lead to 4 multiplies, which is almost as expensive as     */
 153/*    a divide (unless a floating-point or 64-bit multiply is         */
 154/*    assumed to be available).                                       */
 155/*                                                                    */
 156/* 8. Unusual abbreviations that may be used in the commentary:       */
 157/*      lhs -- left hand side (operand, of an operation)              */
 158/*      lsd -- least significant digit (of coefficient)               */
 159/*      lsu -- least significant Unit (of coefficient)                */
 160/*      msd -- most significant digit (of coefficient)                */
 161/*      msi -- most significant item (in an array)                    */
 162/*      msu -- most significant Unit (of coefficient)                 */
 163/*      rhs -- right hand side (operand, of an operation)             */
 164/*      +ve -- positive                                               */
 165/*      -ve -- negative                                               */
 166/*      **  -- raise to the power                                     */
 167/* ------------------------------------------------------------------ */
 168
 169#include "qemu/osdep.h"
 170#include "qemu/host-utils.h"
 171#include "libdecnumber/dconfig.h"
 172#include "libdecnumber/decNumber.h"
 173#include "libdecnumber/decNumberLocal.h"
 174
 175/* Constants */
 176/* Public lookup table used by the D2U macro */
 177const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
 178
 179#define DECVERB     1              /* set to 1 for verbose DECCHECK */
 180#define powers      DECPOWERS      /* old internal name */
 181
 182/* Local constants */
 183#define DIVIDE      0x80           /* Divide operators */
 184#define REMAINDER   0x40           /* .. */
 185#define DIVIDEINT   0x20           /* .. */
 186#define REMNEAR     0x10           /* .. */
 187#define COMPARE     0x01           /* Compare operators */
 188#define COMPMAX     0x02           /* .. */
 189#define COMPMIN     0x03           /* .. */
 190#define COMPTOTAL   0x04           /* .. */
 191#define COMPNAN     0x05           /* .. [NaN processing] */
 192#define COMPSIG     0x06           /* .. [signaling COMPARE] */
 193#define COMPMAXMAG  0x07           /* .. */
 194#define COMPMINMAG  0x08           /* .. */
 195
 196#define DEC_sNaN     0x40000000    /* local status: sNaN signal */
 197#define BADINT  (Int)0x80000000    /* most-negative Int; error indicator */
 198/* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
 199#define BIGEVEN (Int)0x80000002
 200#define BIGODD  (Int)0x80000003
 201
 202static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
 203
 204/* Granularity-dependent code */
 205#if DECDPUN<=4
 206  #define eInt  Int           /* extended integer */
 207  #define ueInt uInt          /* unsigned extended integer */
 208  /* Constant multipliers for divide-by-power-of five using reciprocal */
 209  /* multiply, after removing powers of 2 by shifting, and final shift */
 210  /* of 17 [we only need up to **4] */
 211  static const uInt multies[]={131073, 26215, 5243, 1049, 210};
 212  /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
 213  #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
 214#else
 215  /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
 216  #if !DECUSE64
 217    #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
 218  #endif
 219  #define eInt  Long          /* extended integer */
 220  #define ueInt uLong         /* unsigned extended integer */
 221#endif
 222
 223/* Local routines */
 224static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
 225                              decContext *, uByte, uInt *);
 226static Flag        decBiStr(const char *, const char *, const char *);
 227static uInt        decCheckMath(const decNumber *, decContext *, uInt *);
 228static void        decApplyRound(decNumber *, decContext *, Int, uInt *);
 229static Int         decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
 230static decNumber * decCompareOp(decNumber *, const decNumber *,
 231                              const decNumber *, decContext *,
 232                              Flag, uInt *);
 233static void        decCopyFit(decNumber *, const decNumber *, decContext *,
 234                              Int *, uInt *);
 235static decNumber * decDecap(decNumber *, Int);
 236static decNumber * decDivideOp(decNumber *, const decNumber *,
 237                              const decNumber *, decContext *, Flag, uInt *);
 238static decNumber * decExpOp(decNumber *, const decNumber *,
 239                              decContext *, uInt *);
 240static void        decFinalize(decNumber *, decContext *, Int *, uInt *);
 241static Int         decGetDigits(Unit *, Int);
 242static Int         decGetInt(const decNumber *);
 243static decNumber * decLnOp(decNumber *, const decNumber *,
 244                              decContext *, uInt *);
 245static decNumber * decMultiplyOp(decNumber *, const decNumber *,
 246                              const decNumber *, decContext *,
 247                              uInt *);
 248static decNumber * decNaNs(decNumber *, const decNumber *,
 249                              const decNumber *, decContext *, uInt *);
 250static decNumber * decQuantizeOp(decNumber *, const decNumber *,
 251                              const decNumber *, decContext *, Flag,
 252                              uInt *);
 253static void        decReverse(Unit *, Unit *);
 254static void        decSetCoeff(decNumber *, decContext *, const Unit *,
 255                              Int, Int *, uInt *);
 256static void        decSetMaxValue(decNumber *, decContext *);
 257static void        decSetOverflow(decNumber *, decContext *, uInt *);
 258static void        decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
 259static Int         decShiftToLeast(Unit *, Int, Int);
 260static Int         decShiftToMost(Unit *, Int, Int);
 261static void        decStatus(decNumber *, uInt, decContext *);
 262static void        decToString(const decNumber *, char[], Flag);
 263static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
 264static Int         decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
 265                              Unit *, Int);
 266static Int         decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
 267static bool        mulUInt128ByPowOf10(uLong *, uLong *, uInt);
 268
 269#if !DECSUBSET
 270/* decFinish == decFinalize when no subset arithmetic needed */
 271#define decFinish(a,b,c,d) decFinalize(a,b,c,d)
 272#else
 273static void        decFinish(decNumber *, decContext *, Int *, uInt *);
 274static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
 275#endif
 276
 277/* Local macros */
 278/* masked special-values bits */
 279#define SPECIALARG  (rhs->bits & DECSPECIAL)
 280#define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
 281
 282/* Diagnostic macros, etc. */
 283#if DECALLOC
 284/* Handle malloc/free accounting.  If enabled, our accountable routines */
 285/* are used; otherwise the code just goes straight to the system malloc */
 286/* and free routines. */
 287#define malloc(a) decMalloc(a)
 288#define free(a) decFree(a)
 289#define DECFENCE 0x5a              /* corruption detector */
 290/* 'Our' malloc and free: */
 291static void *decMalloc(size_t);
 292static void  decFree(void *);
 293uInt decAllocBytes=0;              /* count of bytes allocated */
 294/* Note that DECALLOC code only checks for storage buffer overflow. */
 295/* To check for memory leaks, the decAllocBytes variable must be */
 296/* checked to be 0 at appropriate times (e.g., after the test */
 297/* harness completes a set of tests).  This checking may be unreliable */
 298/* if the testing is done in a multi-thread environment. */
 299#endif
 300
 301#if DECCHECK
 302/* Optional checking routines.  Enabling these means that decNumber */
 303/* and decContext operands to operator routines are checked for */
 304/* correctness.  This roughly doubles the execution time of the */
 305/* fastest routines (and adds 600+ bytes), so should not normally be */
 306/* used in 'production'. */
 307/* decCheckInexact is used to check that inexact results have a full */
 308/* complement of digits (where appropriate -- this is not the case */
 309/* for Quantize, for example) */
 310#define DECUNRESU ((decNumber *)(void *)0xffffffff)
 311#define DECUNUSED ((const decNumber *)(void *)0xffffffff)
 312#define DECUNCONT ((decContext *)(void *)(0xffffffff))
 313static Flag decCheckOperands(decNumber *, const decNumber *,
 314                             const decNumber *, decContext *);
 315static Flag decCheckNumber(const decNumber *);
 316static void decCheckInexact(const decNumber *, decContext *);
 317#endif
 318
 319#if DECTRACE || DECCHECK
 320/* Optional trace/debugging routines (may or may not be used) */
 321void decNumberShow(const decNumber *);  /* displays the components of a number */
 322static void decDumpAr(char, const Unit *, Int);
 323#endif
 324
 325/* ================================================================== */
 326/* Conversions                                                        */
 327/* ================================================================== */
 328
 329/* ------------------------------------------------------------------ */
 330/* from-int32 -- conversion from Int or uInt                          */
 331/*                                                                    */
 332/*  dn is the decNumber to receive the integer                        */
 333/*  in or uin is the integer to be converted                          */
 334/*  returns dn                                                        */
 335/*                                                                    */
 336/* No error is possible.                                              */
 337/* ------------------------------------------------------------------ */
 338decNumber * decNumberFromInt32(decNumber *dn, Int in) {
 339  uInt unsig;
 340  if (in>=0) unsig=in;
 341   else {                               /* negative (possibly BADINT) */
 342    if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
 343     else unsig=-in;                    /* invert */
 344    }
 345  /* in is now positive */
 346  decNumberFromUInt32(dn, unsig);
 347  if (in<0) dn->bits=DECNEG;            /* sign needed */
 348  return dn;
 349  } /* decNumberFromInt32 */
 350
 351decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
 352  Unit *up;                             /* work pointer */
 353  decNumberZero(dn);                    /* clean */
 354  if (uin==0) return dn;                /* [or decGetDigits bad call] */
 355  for (up=dn->lsu; uin>0; up++) {
 356    *up=(Unit)(uin%(DECDPUNMAX+1));
 357    uin=uin/(DECDPUNMAX+1);
 358    }
 359  dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
 360  return dn;
 361  } /* decNumberFromUInt32 */
 362
 363/* ------------------------------------------------------------------ */
 364/* to-int32 -- conversion to Int or uInt                              */
 365/*                                                                    */
 366/*  dn is the decNumber to convert                                    */
 367/*  set is the context for reporting errors                           */
 368/*  returns the converted decNumber, or 0 if Invalid is set           */
 369/*                                                                    */
 370/* Invalid is set if the decNumber does not have exponent==0 or if    */
 371/* it is a NaN, Infinite, or out-of-range.                            */
 372/* ------------------------------------------------------------------ */
 373Int decNumberToInt32(const decNumber *dn, decContext *set) {
 374  #if DECCHECK
 375  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
 376  #endif
 377
 378  /* special or too many digits, or bad exponent */
 379  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
 380   else { /* is a finite integer with 10 or fewer digits */
 381    Int d;                         /* work */
 382    const Unit *up;                /* .. */
 383    uInt hi=0, lo;                 /* .. */
 384    up=dn->lsu;                    /* -> lsu */
 385    lo=*up;                        /* get 1 to 9 digits */
 386    #if DECDPUN>1                  /* split to higher */
 387      hi=lo/10;
 388      lo=lo%10;
 389    #endif
 390    up++;
 391    /* collect remaining Units, if any, into hi */
 392    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
 393    /* now low has the lsd, hi the remainder */
 394    if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
 395      /* most-negative is a reprieve */
 396      if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
 397      /* bad -- drop through */
 398      }
 399     else { /* in-range always */
 400      Int i=X10(hi)+lo;
 401      if (dn->bits&DECNEG) return -i;
 402      return i;
 403      }
 404    } /* integer */
 405  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
 406  return 0;
 407  } /* decNumberToInt32 */
 408
 409uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
 410  #if DECCHECK
 411  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
 412  #endif
 413  /* special or too many digits, or bad exponent, or negative (<0) */
 414  if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
 415    || (dn->bits&DECNEG && !ISZERO(dn)));                   /* bad */
 416   else { /* is a finite integer with 10 or fewer digits */
 417    Int d;                         /* work */
 418    const Unit *up;                /* .. */
 419    uInt hi=0, lo;                 /* .. */
 420    up=dn->lsu;                    /* -> lsu */
 421    lo=*up;                        /* get 1 to 9 digits */
 422    #if DECDPUN>1                  /* split to higher */
 423      hi=lo/10;
 424      lo=lo%10;
 425    #endif
 426    up++;
 427    /* collect remaining Units, if any, into hi */
 428    for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
 429
 430    /* now low has the lsd, hi the remainder */
 431    if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
 432     else return X10(hi)+lo;
 433    } /* integer */
 434  decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
 435  return 0;
 436  } /* decNumberToUInt32 */
 437
 438decNumber *decNumberFromInt64(decNumber *dn, int64_t in)
 439{
 440    uint64_t unsig = in;
 441    if (in < 0) {
 442        unsig = -unsig;
 443    }
 444
 445    decNumberFromUInt64(dn, unsig);
 446    if (in < 0) {
 447        dn->bits = DECNEG;        /* sign needed */
 448    }
 449    return dn;
 450} /* decNumberFromInt64 */
 451
 452decNumber *decNumberFromUInt64(decNumber *dn, uint64_t uin)
 453{
 454    Unit *up;                             /* work pointer */
 455    decNumberZero(dn);                    /* clean */
 456    if (uin == 0) {
 457        return dn;                /* [or decGetDigits bad call] */
 458    }
 459    for (up = dn->lsu; uin > 0; up++) {
 460        *up = (Unit)(uin % (DECDPUNMAX + 1));
 461        uin = uin / (DECDPUNMAX + 1);
 462    }
 463    dn->digits = decGetDigits(dn->lsu, up-dn->lsu);
 464    return dn;
 465} /* decNumberFromUInt64 */
 466
 467decNumber *decNumberFromInt128(decNumber *dn, uint64_t lo, int64_t hi)
 468{
 469    uint64_t unsig_hi = hi;
 470    if (hi < 0) {
 471        if (lo == 0) {
 472            unsig_hi = -unsig_hi;
 473        } else {
 474            unsig_hi = ~unsig_hi;
 475            lo = -lo;
 476        }
 477    }
 478
 479    decNumberFromUInt128(dn, lo, unsig_hi);
 480    if (hi < 0) {
 481        dn->bits = DECNEG;        /* sign needed */
 482    }
 483    return dn;
 484} /* decNumberFromInt128 */
 485
 486decNumber *decNumberFromUInt128(decNumber *dn, uint64_t lo, uint64_t hi)
 487{
 488    uint64_t rem;
 489    Unit *up;                             /* work pointer */
 490    decNumberZero(dn);                    /* clean */
 491    if (lo == 0 && hi == 0) {
 492        return dn;                /* [or decGetDigits bad call] */
 493    }
 494    for (up = dn->lsu; hi > 0 || lo > 0; up++) {
 495        rem = divu128(&lo, &hi, DECDPUNMAX + 1);
 496        *up = (Unit)rem;
 497    }
 498    dn->digits = decGetDigits(dn->lsu, up - dn->lsu);
 499    return dn;
 500} /* decNumberFromUInt128 */
 501
 502/* ------------------------------------------------------------------ */
 503/* to-int64 -- conversion to int64                                    */
 504/*                                                                    */
 505/*  dn is the decNumber to convert.  dn is assumed to have been       */
 506/*    rounded to a floating point integer value.                      */
 507/*  set is the context for reporting errors                           */
 508/*  returns the converted decNumber, or 0 if Invalid is set           */
 509/*                                                                    */
 510/* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
 511/* range for a signed 64 bit integer.                                 */
 512/* ------------------------------------------------------------------ */
 513
 514int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set)
 515{
 516    if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
 517       (dn->digits + dn->exponent > 19)) {
 518        goto Invalid;
 519    } else {
 520        int64_t d;        /* work */
 521        const Unit *up;   /* .. */
 522        uint64_t hi = 0;
 523        up = dn->lsu;     /* -> lsu */
 524
 525        for (d = 1; d <= dn->digits; up++, d += DECDPUN) {
 526            uint64_t prev = hi;
 527            hi += *up * powers[d-1];
 528            if ((hi < prev) || (hi > INT64_MAX)) {
 529                goto Invalid;
 530            }
 531        }
 532
 533        uint64_t prev = hi;
 534        hi *= (uint64_t)powers[dn->exponent];
 535        if ((hi < prev) || (hi > INT64_MAX)) {
 536            goto Invalid;
 537        }
 538        return (decNumberIsNegative(dn)) ? -((int64_t)hi) : (int64_t)hi;
 539    }
 540
 541Invalid:
 542    decContextSetStatus(set, DEC_Invalid_operation);
 543    return 0;
 544} /* decNumberIntegralToInt64 */
 545
 546/* ------------------------------------------------------------------ */
 547/* decNumberIntegralToInt128 -- conversion to int128                  */
 548/*                                                                    */
 549/*  dn is the decNumber to convert.  dn is assumed to have been       */
 550/*    rounded to a floating point integer value.                      */
 551/*  set is the context for reporting errors                           */
 552/*  returns the converted decNumber via plow and phigh                */
 553/*                                                                    */
 554/* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
 555/* range for a signed 128 bit integer.                                */
 556/* ------------------------------------------------------------------ */
 557
 558void decNumberIntegralToInt128(const decNumber *dn, decContext *set,
 559        uint64_t *plow, uint64_t *phigh)
 560{
 561    int d;        /* work */
 562    const Unit *up;   /* .. */
 563    uint64_t lo = 0, hi = 0;
 564
 565    if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
 566       (dn->digits + dn->exponent > 39)) {
 567        goto Invalid;
 568    }
 569
 570    up = dn->lsu;     /* -> lsu */
 571
 572    for (d = (dn->digits - 1) / DECDPUN; d >= 0; d--) {
 573        if (mulu128(&lo, &hi, DECDPUNMAX + 1)) {
 574            /* overflow */
 575            goto Invalid;
 576        }
 577        if (uadd64_overflow(lo, up[d], &lo)) {
 578            if (uadd64_overflow(hi, 1, &hi)) {
 579                /* overflow */
 580                goto Invalid;
 581            }
 582        }
 583    }
 584
 585    if (mulUInt128ByPowOf10(&lo, &hi, dn->exponent)) {
 586        /* overflow */
 587        goto Invalid;
 588    }
 589
 590    if (decNumberIsNegative(dn)) {
 591        if (lo == 0) {
 592            *phigh = -hi;
 593            *plow = 0;
 594        } else {
 595            *phigh = ~hi;
 596            *plow = -lo;
 597        }
 598    } else {
 599        *plow = lo;
 600        *phigh = hi;
 601    }
 602
 603    return;
 604
 605Invalid:
 606    decContextSetStatus(set, DEC_Invalid_operation);
 607} /* decNumberIntegralToInt128 */
 608
 609/* ------------------------------------------------------------------ */
 610/* to-scientific-string -- conversion to numeric string               */
 611/* to-engineering-string -- conversion to numeric string              */
 612/*                                                                    */
 613/*   decNumberToString(dn, string);                                   */
 614/*   decNumberToEngString(dn, string);                                */
 615/*                                                                    */
 616/*  dn is the decNumber to convert                                    */
 617/*  string is the string where the result will be laid out            */
 618/*                                                                    */
 619/*  string must be at least dn->digits+14 characters long             */
 620/*                                                                    */
 621/*  No error is possible, and no status can be set.                   */
 622/* ------------------------------------------------------------------ */
 623char * decNumberToString(const decNumber *dn, char *string){
 624  decToString(dn, string, 0);
 625  return string;
 626  } /* DecNumberToString */
 627
 628char * decNumberToEngString(const decNumber *dn, char *string){
 629  decToString(dn, string, 1);
 630  return string;
 631  } /* DecNumberToEngString */
 632
 633/* ------------------------------------------------------------------ */
 634/* to-number -- conversion from numeric string                        */
 635/*                                                                    */
 636/* decNumberFromString -- convert string to decNumber                 */
 637/*   dn        -- the number structure to fill                        */
 638/*   chars[]   -- the string to convert ('\0' terminated)             */
 639/*   set       -- the context used for processing any error,          */
 640/*                determining the maximum precision available         */
 641/*                (set.digits), determining the maximum and minimum   */
 642/*                exponent (set.emax and set.emin), determining if    */
 643/*                extended values are allowed, and checking the       */
 644/*                rounding mode if overflow occurs or rounding is     */
 645/*                needed.                                             */
 646/*                                                                    */
 647/* The length of the coefficient and the size of the exponent are     */
 648/* checked by this routine, so the correct error (Underflow or        */
 649/* Overflow) can be reported or rounding applied, as necessary.       */
 650/*                                                                    */
 651/* If bad syntax is detected, the result will be a quiet NaN.         */
 652/* ------------------------------------------------------------------ */
 653decNumber * decNumberFromString(decNumber *dn, const char chars[],
 654                                decContext *set) {
 655  Int   exponent=0;                /* working exponent [assume 0] */
 656  uByte bits=0;                    /* working flags [assume +ve] */
 657  Unit  *res;                      /* where result will be built */
 658  Unit  resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
 659                                   /* [+9 allows for ln() constants] */
 660  Unit  *allocres=NULL;            /* -> allocated result, iff allocated */
 661  Int   d=0;                       /* count of digits found in decimal part */
 662  const char *dotchar=NULL;        /* where dot was found */
 663  const char *cfirst=chars;        /* -> first character of decimal part */
 664  const char *last=NULL;           /* -> last digit of decimal part */
 665  const char *c;                   /* work */
 666  Unit  *up;                       /* .. */
 667  #if DECDPUN>1
 668  Int   cut, out;                  /* .. */
 669  #endif
 670  Int   residue;                   /* rounding residue */
 671  uInt  status=0;                  /* error code */
 672
 673  #if DECCHECK
 674  if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
 675    return decNumberZero(dn);
 676  #endif
 677
 678  do {                             /* status & malloc protection */
 679    for (c=chars;; c++) {          /* -> input character */
 680      if (*c>='0' && *c<='9') {    /* test for Arabic digit */
 681        last=c;
 682        d++;                       /* count of real digits */
 683        continue;                  /* still in decimal part */
 684        }
 685      if (*c=='.' && dotchar==NULL) { /* first '.' */
 686        dotchar=c;                 /* record offset into decimal part */
 687        if (c==cfirst) cfirst++;   /* first digit must follow */
 688        continue;}
 689      if (c==chars) {              /* first in string... */
 690        if (*c=='-') {             /* valid - sign */
 691          cfirst++;
 692          bits=DECNEG;
 693          continue;}
 694        if (*c=='+') {             /* valid + sign */
 695          cfirst++;
 696          continue;}
 697        }
 698      /* *c is not a digit, or a valid +, -, or '.' */
 699      break;
 700      } /* c */
 701
 702    if (last==NULL) {              /* no digits yet */
 703      status=DEC_Conversion_syntax;/* assume the worst */
 704      if (*c=='\0') break;         /* and no more to come... */
 705      #if DECSUBSET
 706      /* if subset then infinities and NaNs are not allowed */
 707      if (!set->extended) break;   /* hopeless */
 708      #endif
 709      /* Infinities and NaNs are possible, here */
 710      if (dotchar!=NULL) break;    /* .. unless had a dot */
 711      decNumberZero(dn);           /* be optimistic */
 712      if (decBiStr(c, "infinity", "INFINITY")
 713       || decBiStr(c, "inf", "INF")) {
 714        dn->bits=bits | DECINF;
 715        status=0;                  /* is OK */
 716        break; /* all done */
 717        }
 718      /* a NaN expected */
 719      /* 2003.09.10 NaNs are now permitted to have a sign */
 720      dn->bits=bits | DECNAN;      /* assume simple NaN */
 721      if (*c=='s' || *c=='S') {    /* looks like an sNaN */
 722        c++;
 723        dn->bits=bits | DECSNAN;
 724        }
 725      if (*c!='n' && *c!='N') break;    /* check caseless "NaN" */
 726      c++;
 727      if (*c!='a' && *c!='A') break;    /* .. */
 728      c++;
 729      if (*c!='n' && *c!='N') break;    /* .. */
 730      c++;
 731      /* now either nothing, or nnnn payload, expected */
 732      /* -> start of integer and skip leading 0s [including plain 0] */
 733      for (cfirst=c; *cfirst=='0';) cfirst++;
 734      if (*cfirst=='\0') {         /* "NaN" or "sNaN", maybe with all 0s */
 735        status=0;                  /* it's good */
 736        break;                     /* .. */
 737        }
 738      /* something other than 0s; setup last and d as usual [no dots] */
 739      for (c=cfirst;; c++, d++) {
 740        if (*c<'0' || *c>'9') break; /* test for Arabic digit */
 741        last=c;
 742        }
 743      if (*c!='\0') break;         /* not all digits */
 744      if (d>set->digits-1) {
 745        /* [NB: payload in a decNumber can be full length unless */
 746        /* clamped, in which case can only be digits-1] */
 747        if (set->clamp) break;
 748        if (d>set->digits) break;
 749        } /* too many digits? */
 750      /* good; drop through to convert the integer to coefficient */
 751      status=0;                    /* syntax is OK */
 752      bits=dn->bits;               /* for copy-back */
 753      } /* last==NULL */
 754
 755     else if (*c!='\0') {          /* more to process... */
 756      /* had some digits; exponent is only valid sequence now */
 757      Flag nege;                   /* 1=negative exponent */
 758      const char *firstexp;        /* -> first significant exponent digit */
 759      status=DEC_Conversion_syntax;/* assume the worst */
 760      if (*c!='e' && *c!='E') break;
 761      /* Found 'e' or 'E' -- now process explicit exponent */
 762      /* 1998.07.11: sign no longer required */
 763      nege=0;
 764      c++;                         /* to (possible) sign */
 765      if (*c=='-') {nege=1; c++;}
 766       else if (*c=='+') c++;
 767      if (*c=='\0') break;
 768
 769      for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
 770      firstexp=c;                            /* save exponent digit place */
 771      for (; ;c++) {
 772        if (*c<'0' || *c>'9') break;         /* not a digit */
 773        exponent=X10(exponent)+(Int)*c-(Int)'0';
 774        } /* c */
 775      /* if not now on a '\0', *c must not be a digit */
 776      if (*c!='\0') break;
 777
 778      /* (this next test must be after the syntax checks) */
 779      /* if it was too long the exponent may have wrapped, so check */
 780      /* carefully and set it to a certain overflow if wrap possible */
 781      if (c>=firstexp+9+1) {
 782        if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
 783        /* [up to 1999999999 is OK, for example 1E-1000000998] */
 784        }
 785      if (nege) exponent=-exponent;     /* was negative */
 786      status=0;                         /* is OK */
 787      } /* stuff after digits */
 788
 789    /* Here when whole string has been inspected; syntax is good */
 790    /* cfirst->first digit (never dot), last->last digit (ditto) */
 791
 792    /* strip leading zeros/dot [leave final 0 if all 0's] */
 793    if (*cfirst=='0') {                 /* [cfirst has stepped over .] */
 794      for (c=cfirst; c<last; c++, cfirst++) {
 795        if (*c=='.') continue;          /* ignore dots */
 796        if (*c!='0') break;             /* non-zero found */
 797        d--;                            /* 0 stripped */
 798        } /* c */
 799      #if DECSUBSET
 800      /* make a rapid exit for easy zeros if !extended */
 801      if (*cfirst=='0' && !set->extended) {
 802        decNumberZero(dn);              /* clean result */
 803        break;                          /* [could be return] */
 804        }
 805      #endif
 806      } /* at least one leading 0 */
 807
 808    /* Handle decimal point... */
 809    if (dotchar!=NULL && dotchar<last)  /* non-trailing '.' found? */
 810      exponent-=(last-dotchar);         /* adjust exponent */
 811    /* [we can now ignore the .] */
 812
 813    /* OK, the digits string is good.  Assemble in the decNumber, or in */
 814    /* a temporary units array if rounding is needed */
 815    if (d<=set->digits) res=dn->lsu;    /* fits into supplied decNumber */
 816     else {                             /* rounding needed */
 817      Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
 818      res=resbuff;                      /* assume use local buffer */
 819      if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
 820        allocres=(Unit *)malloc(needbytes);
 821        if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
 822        res=allocres;
 823        }
 824      }
 825    /* res now -> number lsu, buffer, or allocated storage for Unit array */
 826
 827    /* Place the coefficient into the selected Unit array */
 828    /* [this is often 70% of the cost of this function when DECDPUN>1] */
 829    #if DECDPUN>1
 830    out=0;                         /* accumulator */
 831    up=res+D2U(d)-1;               /* -> msu */
 832    cut=d-(up-res)*DECDPUN;        /* digits in top unit */
 833    for (c=cfirst;; c++) {         /* along the digits */
 834      if (*c=='.') continue;       /* ignore '.' [don't decrement cut] */
 835      out=X10(out)+(Int)*c-(Int)'0';
 836      if (c==last) break;          /* done [never get to trailing '.'] */
 837      cut--;
 838      if (cut>0) continue;         /* more for this unit */
 839      *up=(Unit)out;               /* write unit */
 840      up--;                        /* prepare for unit below.. */
 841      cut=DECDPUN;                 /* .. */
 842      out=0;                       /* .. */
 843      } /* c */
 844    *up=(Unit)out;                 /* write lsu */
 845
 846    #else
 847    /* DECDPUN==1 */
 848    up=res;                        /* -> lsu */
 849    for (c=last; c>=cfirst; c--) { /* over each character, from least */
 850      if (*c=='.') continue;       /* ignore . [don't step up] */
 851      *up=(Unit)((Int)*c-(Int)'0');
 852      up++;
 853      } /* c */
 854    #endif
 855
 856    dn->bits=bits;
 857    dn->exponent=exponent;
 858    dn->digits=d;
 859
 860    /* if not in number (too long) shorten into the number */
 861    if (d>set->digits) {
 862      residue=0;
 863      decSetCoeff(dn, set, res, d, &residue, &status);
 864      /* always check for overflow or subnormal and round as needed */
 865      decFinalize(dn, set, &residue, &status);
 866      }
 867     else { /* no rounding, but may still have overflow or subnormal */
 868      /* [these tests are just for performance; finalize repeats them] */
 869      if ((dn->exponent-1<set->emin-dn->digits)
 870       || (dn->exponent-1>set->emax-set->digits)) {
 871        residue=0;
 872        decFinalize(dn, set, &residue, &status);
 873        }
 874      }
 875    /* decNumberShow(dn); */
 876    } while(0);                         /* [for break] */
 877
 878  if (allocres!=NULL) free(allocres);   /* drop any storage used */
 879  if (status!=0) decStatus(dn, status, set);
 880  return dn;
 881  } /* decNumberFromString */
 882
 883/* ================================================================== */
 884/* Operators                                                          */
 885/* ================================================================== */
 886
 887/* ------------------------------------------------------------------ */
 888/* decNumberAbs -- absolute value operator                            */
 889/*                                                                    */
 890/*   This computes C = abs(A)                                         */
 891/*                                                                    */
 892/*   res is C, the result.  C may be A                                */
 893/*   rhs is A                                                         */
 894/*   set is the context                                               */
 895/*                                                                    */
 896/* See also decNumberCopyAbs for a quiet bitwise version of this.     */
 897/* C must have space for set->digits digits.                          */
 898/* ------------------------------------------------------------------ */
 899/* This has the same effect as decNumberPlus unless A is negative,    */
 900/* in which case it has the same effect as decNumberMinus.            */
 901/* ------------------------------------------------------------------ */
 902decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
 903                         decContext *set) {
 904  decNumber dzero;                      /* for 0 */
 905  uInt status=0;                        /* accumulator */
 906
 907  #if DECCHECK
 908  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
 909  #endif
 910
 911  decNumberZero(&dzero);                /* set 0 */
 912  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
 913  decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
 914  if (status!=0) decStatus(res, status, set);
 915  #if DECCHECK
 916  decCheckInexact(res, set);
 917  #endif
 918  return res;
 919  } /* decNumberAbs */
 920
 921/* ------------------------------------------------------------------ */
 922/* decNumberAdd -- add two Numbers                                    */
 923/*                                                                    */
 924/*   This computes C = A + B                                          */
 925/*                                                                    */
 926/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
 927/*   lhs is A                                                         */
 928/*   rhs is B                                                         */
 929/*   set is the context                                               */
 930/*                                                                    */
 931/* C must have space for set->digits digits.                          */
 932/* ------------------------------------------------------------------ */
 933/* This just calls the routine shared with Subtract                   */
 934decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
 935                         const decNumber *rhs, decContext *set) {
 936  uInt status=0;                        /* accumulator */
 937  decAddOp(res, lhs, rhs, set, 0, &status);
 938  if (status!=0) decStatus(res, status, set);
 939  #if DECCHECK
 940  decCheckInexact(res, set);
 941  #endif
 942  return res;
 943  } /* decNumberAdd */
 944
 945/* ------------------------------------------------------------------ */
 946/* decNumberAnd -- AND two Numbers, digitwise                         */
 947/*                                                                    */
 948/*   This computes C = A & B                                          */
 949/*                                                                    */
 950/*   res is C, the result.  C may be A and/or B (e.g., X=X&X)         */
 951/*   lhs is A                                                         */
 952/*   rhs is B                                                         */
 953/*   set is the context (used for result length and error report)     */
 954/*                                                                    */
 955/* C must have space for set->digits digits.                          */
 956/*                                                                    */
 957/* Logical function restrictions apply (see above); a NaN is          */
 958/* returned with Invalid_operation if a restriction is violated.      */
 959/* ------------------------------------------------------------------ */
 960decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
 961                         const decNumber *rhs, decContext *set) {
 962  const Unit *ua, *ub;                  /* -> operands */
 963  const Unit *msua, *msub;              /* -> operand msus */
 964  Unit *uc,  *msuc;                     /* -> result and its msu */
 965  Int   msudigs;                        /* digits in res msu */
 966  #if DECCHECK
 967  if (decCheckOperands(res, lhs, rhs, set)) return res;
 968  #endif
 969
 970  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
 971   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
 972    decStatus(res, DEC_Invalid_operation, set);
 973    return res;
 974    }
 975
 976  /* operands are valid */
 977  ua=lhs->lsu;                          /* bottom-up */
 978  ub=rhs->lsu;                          /* .. */
 979  uc=res->lsu;                          /* .. */
 980  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
 981  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
 982  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
 983  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
 984  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
 985    Unit a, b;                          /* extract units */
 986    if (ua>msua) a=0;
 987     else a=*ua;
 988    if (ub>msub) b=0;
 989     else b=*ub;
 990    *uc=0;                              /* can now write back */
 991    if (a|b) {                          /* maybe 1 bits to examine */
 992      Int i, j;
 993      *uc=0;                            /* can now write back */
 994      /* This loop could be unrolled and/or use BIN2BCD tables */
 995      for (i=0; i<DECDPUN; i++) {
 996        if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
 997        j=a%10;
 998        a=a/10;
 999        j|=b%10;
1000        b=b/10;
1001        if (j>1) {
1002          decStatus(res, DEC_Invalid_operation, set);
1003          return res;
1004          }
1005        if (uc==msuc && i==msudigs-1) break; /* just did final digit */
1006        } /* each digit */
1007      } /* both OK */
1008    } /* each unit */
1009  /* [here uc-1 is the msu of the result] */
1010  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1011  res->exponent=0;                      /* integer */
1012  res->bits=0;                          /* sign=0 */
1013  return res;  /* [no status to set] */
1014  } /* decNumberAnd */
1015
1016/* ------------------------------------------------------------------ */
1017/* decNumberCompare -- compare two Numbers                            */
1018/*                                                                    */
1019/*   This computes C = A ? B                                          */
1020/*                                                                    */
1021/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1022/*   lhs is A                                                         */
1023/*   rhs is B                                                         */
1024/*   set is the context                                               */
1025/*                                                                    */
1026/* C must have space for one digit (or NaN).                          */
1027/* ------------------------------------------------------------------ */
1028decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
1029                             const decNumber *rhs, decContext *set) {
1030  uInt status=0;                        /* accumulator */
1031  decCompareOp(res, lhs, rhs, set, COMPARE, &status);
1032  if (status!=0) decStatus(res, status, set);
1033  return res;
1034  } /* decNumberCompare */
1035
1036/* ------------------------------------------------------------------ */
1037/* decNumberCompareSignal -- compare, signalling on all NaNs          */
1038/*                                                                    */
1039/*   This computes C = A ? B                                          */
1040/*                                                                    */
1041/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1042/*   lhs is A                                                         */
1043/*   rhs is B                                                         */
1044/*   set is the context                                               */
1045/*                                                                    */
1046/* C must have space for one digit (or NaN).                          */
1047/* ------------------------------------------------------------------ */
1048decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
1049                                   const decNumber *rhs, decContext *set) {
1050  uInt status=0;                        /* accumulator */
1051  decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
1052  if (status!=0) decStatus(res, status, set);
1053  return res;
1054  } /* decNumberCompareSignal */
1055
1056/* ------------------------------------------------------------------ */
1057/* decNumberCompareTotal -- compare two Numbers, using total ordering */
1058/*                                                                    */
1059/*   This computes C = A ? B, under total ordering                    */
1060/*                                                                    */
1061/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1062/*   lhs is A                                                         */
1063/*   rhs is B                                                         */
1064/*   set is the context                                               */
1065/*                                                                    */
1066/* C must have space for one digit; the result will always be one of  */
1067/* -1, 0, or 1.                                                       */
1068/* ------------------------------------------------------------------ */
1069decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
1070                                  const decNumber *rhs, decContext *set) {
1071  uInt status=0;                        /* accumulator */
1072  decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
1073  if (status!=0) decStatus(res, status, set);
1074  return res;
1075  } /* decNumberCompareTotal */
1076
1077/* ------------------------------------------------------------------ */
1078/* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
1079/*                                                                    */
1080/*   This computes C = |A| ? |B|, under total ordering                */
1081/*                                                                    */
1082/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1083/*   lhs is A                                                         */
1084/*   rhs is B                                                         */
1085/*   set is the context                                               */
1086/*                                                                    */
1087/* C must have space for one digit; the result will always be one of  */
1088/* -1, 0, or 1.                                                       */
1089/* ------------------------------------------------------------------ */
1090decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
1091                                     const decNumber *rhs, decContext *set) {
1092  uInt status=0;                   /* accumulator */
1093  uInt needbytes;                  /* for space calculations */
1094  decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
1095  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
1096  decNumber bufb[D2N(DECBUFFER+1)];
1097  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
1098  decNumber *a, *b;                /* temporary pointers */
1099
1100  #if DECCHECK
1101  if (decCheckOperands(res, lhs, rhs, set)) return res;
1102  #endif
1103
1104  do {                                  /* protect allocated storage */
1105    /* if either is negative, take a copy and absolute */
1106    if (decNumberIsNegative(lhs)) {     /* lhs<0 */
1107      a=bufa;
1108      needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
1109      if (needbytes>sizeof(bufa)) {     /* need malloc space */
1110        allocbufa=(decNumber *)malloc(needbytes);
1111        if (allocbufa==NULL) {          /* hopeless -- abandon */
1112          status|=DEC_Insufficient_storage;
1113          break;}
1114        a=allocbufa;                    /* use the allocated space */
1115        }
1116      decNumberCopy(a, lhs);            /* copy content */
1117      a->bits&=~DECNEG;                 /* .. and clear the sign */
1118      lhs=a;                            /* use copy from here on */
1119      }
1120    if (decNumberIsNegative(rhs)) {     /* rhs<0 */
1121      b=bufb;
1122      needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
1123      if (needbytes>sizeof(bufb)) {     /* need malloc space */
1124        allocbufb=(decNumber *)malloc(needbytes);
1125        if (allocbufb==NULL) {          /* hopeless -- abandon */
1126          status|=DEC_Insufficient_storage;
1127          break;}
1128        b=allocbufb;                    /* use the allocated space */
1129        }
1130      decNumberCopy(b, rhs);            /* copy content */
1131      b->bits&=~DECNEG;                 /* .. and clear the sign */
1132      rhs=b;                            /* use copy from here on */
1133      }
1134    decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
1135    } while(0);                         /* end protected */
1136
1137  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1138  if (allocbufb!=NULL) free(allocbufb); /* .. */
1139  if (status!=0) decStatus(res, status, set);
1140  return res;
1141  } /* decNumberCompareTotalMag */
1142
1143/* ------------------------------------------------------------------ */
1144/* decNumberDivide -- divide one number by another                    */
1145/*                                                                    */
1146/*   This computes C = A / B                                          */
1147/*                                                                    */
1148/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
1149/*   lhs is A                                                         */
1150/*   rhs is B                                                         */
1151/*   set is the context                                               */
1152/*                                                                    */
1153/* C must have space for set->digits digits.                          */
1154/* ------------------------------------------------------------------ */
1155decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
1156                            const decNumber *rhs, decContext *set) {
1157  uInt status=0;                        /* accumulator */
1158  decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
1159  if (status!=0) decStatus(res, status, set);
1160  #if DECCHECK
1161  decCheckInexact(res, set);
1162  #endif
1163  return res;
1164  } /* decNumberDivide */
1165
1166/* ------------------------------------------------------------------ */
1167/* decNumberDivideInteger -- divide and return integer quotient       */
1168/*                                                                    */
1169/*   This computes C = A # B, where # is the integer divide operator  */
1170/*                                                                    */
1171/*   res is C, the result.  C may be A and/or B (e.g., X=X#X)         */
1172/*   lhs is A                                                         */
1173/*   rhs is B                                                         */
1174/*   set is the context                                               */
1175/*                                                                    */
1176/* C must have space for set->digits digits.                          */
1177/* ------------------------------------------------------------------ */
1178decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1179                                   const decNumber *rhs, decContext *set) {
1180  uInt status=0;                        /* accumulator */
1181  decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1182  if (status!=0) decStatus(res, status, set);
1183  return res;
1184  } /* decNumberDivideInteger */
1185
1186/* ------------------------------------------------------------------ */
1187/* decNumberExp -- exponentiation                                     */
1188/*                                                                    */
1189/*   This computes C = exp(A)                                         */
1190/*                                                                    */
1191/*   res is C, the result.  C may be A                                */
1192/*   rhs is A                                                         */
1193/*   set is the context; note that rounding mode has no effect        */
1194/*                                                                    */
1195/* C must have space for set->digits digits.                          */
1196/*                                                                    */
1197/* Mathematical function restrictions apply (see above); a NaN is     */
1198/* returned with Invalid_operation if a restriction is violated.      */
1199/*                                                                    */
1200/* Finite results will always be full precision and Inexact, except   */
1201/* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
1202/*                                                                    */
1203/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1204/* almost always be correctly rounded, but may be up to 1 ulp in      */
1205/* error in rare cases.                                               */
1206/* ------------------------------------------------------------------ */
1207/* This is a wrapper for decExpOp which can handle the slightly wider */
1208/* (double) range needed by Ln (which has to be able to calculate     */
1209/* exp(-a) where a can be the tiniest number (Ntiny).                 */
1210/* ------------------------------------------------------------------ */
1211decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
1212                         decContext *set) {
1213  uInt status=0;                        /* accumulator */
1214  #if DECSUBSET
1215  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1216  #endif
1217
1218  #if DECCHECK
1219  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1220  #endif
1221
1222  /* Check restrictions; these restrictions ensure that if h=8 (see */
1223  /* decExpOp) then the result will either overflow or underflow to 0. */
1224  /* Other math functions restrict the input range, too, for inverses. */
1225  /* If not violated then carry out the operation. */
1226  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1227    #if DECSUBSET
1228    if (!set->extended) {
1229      /* reduce operand and set lostDigits status, as needed */
1230      if (rhs->digits>set->digits) {
1231        allocrhs=decRoundOperand(rhs, set, &status);
1232        if (allocrhs==NULL) break;
1233        rhs=allocrhs;
1234        }
1235      }
1236    #endif
1237    decExpOp(res, rhs, set, &status);
1238    } while(0);                         /* end protected */
1239
1240  #if DECSUBSET
1241  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
1242  #endif
1243  /* apply significant status */
1244  if (status!=0) decStatus(res, status, set);
1245  #if DECCHECK
1246  decCheckInexact(res, set);
1247  #endif
1248  return res;
1249  } /* decNumberExp */
1250
1251/* ------------------------------------------------------------------ */
1252/* decNumberFMA -- fused multiply add                                 */
1253/*                                                                    */
1254/*   This computes D = (A * B) + C with only one rounding             */
1255/*                                                                    */
1256/*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
1257/*   lhs is A                                                         */
1258/*   rhs is B                                                         */
1259/*   fhs is C [far hand side]                                         */
1260/*   set is the context                                               */
1261/*                                                                    */
1262/* Mathematical function restrictions apply (see above); a NaN is     */
1263/* returned with Invalid_operation if a restriction is violated.      */
1264/*                                                                    */
1265/* C must have space for set->digits digits.                          */
1266/* ------------------------------------------------------------------ */
1267decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
1268                         const decNumber *rhs, const decNumber *fhs,
1269                         decContext *set) {
1270  uInt status=0;                   /* accumulator */
1271  decContext dcmul;                /* context for the multiplication */
1272  uInt needbytes;                  /* for space calculations */
1273  decNumber bufa[D2N(DECBUFFER*2+1)];
1274  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
1275  decNumber *acc;                  /* accumulator pointer */
1276  decNumber dzero;                 /* work */
1277
1278  #if DECCHECK
1279  if (decCheckOperands(res, lhs, rhs, set)) return res;
1280  if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1281  #endif
1282
1283  do {                                  /* protect allocated storage */
1284    #if DECSUBSET
1285    if (!set->extended) {               /* [undefined if subset] */
1286      status|=DEC_Invalid_operation;
1287      break;}
1288    #endif
1289    /* Check math restrictions [these ensure no overflow or underflow] */
1290    if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1291     || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1292     || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1293    /* set up context for multiply */
1294    dcmul=*set;
1295    dcmul.digits=lhs->digits+rhs->digits; /* just enough */
1296    /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1297    dcmul.emax=DEC_MAX_EMAX;            /* effectively unbounded .. */
1298    dcmul.emin=DEC_MIN_EMIN;            /* [thanks to Math restrictions] */
1299    /* set up decNumber space to receive the result of the multiply */
1300    acc=bufa;                           /* may fit */
1301    needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1302    if (needbytes>sizeof(bufa)) {       /* need malloc space */
1303      allocbufa=(decNumber *)malloc(needbytes);
1304      if (allocbufa==NULL) {            /* hopeless -- abandon */
1305        status|=DEC_Insufficient_storage;
1306        break;}
1307      acc=allocbufa;                    /* use the allocated space */
1308      }
1309    /* multiply with extended range and necessary precision */
1310    /*printf("emin=%ld\n", dcmul.emin); */
1311    decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1312    /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1313    /* status; if either is seen than ignore fhs (in case it is */
1314    /* another sNaN) and set acc to NaN unless we had an sNaN */
1315    /* [decMultiplyOp leaves that to caller] */
1316    /* Note sNaN has to go through addOp to shorten payload if */
1317    /* necessary */
1318    if ((status&DEC_Invalid_operation)!=0) {
1319      if (!(status&DEC_sNaN)) {         /* but be true invalid */
1320        decNumberZero(res);             /* acc not yet set */
1321        res->bits=DECNAN;
1322        break;
1323        }
1324      decNumberZero(&dzero);            /* make 0 (any non-NaN would do) */
1325      fhs=&dzero;                       /* use that */
1326      }
1327    #if DECCHECK
1328     else { /* multiply was OK */
1329      if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
1330      }
1331    #endif
1332    /* add the third operand and result -> res, and all is done */
1333    decAddOp(res, acc, fhs, set, 0, &status);
1334    } while(0);                         /* end protected */
1335
1336  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1337  if (status!=0) decStatus(res, status, set);
1338  #if DECCHECK
1339  decCheckInexact(res, set);
1340  #endif
1341  return res;
1342  } /* decNumberFMA */
1343
1344/* ------------------------------------------------------------------ */
1345/* decNumberInvert -- invert a Number, digitwise                      */
1346/*                                                                    */
1347/*   This computes C = ~A                                             */
1348/*                                                                    */
1349/*   res is C, the result.  C may be A (e.g., X=~X)                   */
1350/*   rhs is A                                                         */
1351/*   set is the context (used for result length and error report)     */
1352/*                                                                    */
1353/* C must have space for set->digits digits.                          */
1354/*                                                                    */
1355/* Logical function restrictions apply (see above); a NaN is          */
1356/* returned with Invalid_operation if a restriction is violated.      */
1357/* ------------------------------------------------------------------ */
1358decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
1359                            decContext *set) {
1360  const Unit *ua, *msua;                /* -> operand and its msu */
1361  Unit  *uc, *msuc;                     /* -> result and its msu */
1362  Int   msudigs;                        /* digits in res msu */
1363  #if DECCHECK
1364  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1365  #endif
1366
1367  if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1368    decStatus(res, DEC_Invalid_operation, set);
1369    return res;
1370    }
1371  /* operand is valid */
1372  ua=rhs->lsu;                          /* bottom-up */
1373  uc=res->lsu;                          /* .. */
1374  msua=ua+D2U(rhs->digits)-1;           /* -> msu of rhs */
1375  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
1376  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
1377  for (; uc<=msuc; ua++, uc++) {        /* Unit loop */
1378    Unit a;                             /* extract unit */
1379    Int  i, j;                          /* work */
1380    if (ua>msua) a=0;
1381     else a=*ua;
1382    *uc=0;                              /* can now write back */
1383    /* always need to examine all bits in rhs */
1384    /* This loop could be unrolled and/or use BIN2BCD tables */
1385    for (i=0; i<DECDPUN; i++) {
1386      if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
1387      j=a%10;
1388      a=a/10;
1389      if (j>1) {
1390        decStatus(res, DEC_Invalid_operation, set);
1391        return res;
1392        }
1393      if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
1394      } /* each digit */
1395    } /* each unit */
1396  /* [here uc-1 is the msu of the result] */
1397  res->digits=decGetDigits(res->lsu, uc-res->lsu);
1398  res->exponent=0;                      /* integer */
1399  res->bits=0;                          /* sign=0 */
1400  return res;  /* [no status to set] */
1401  } /* decNumberInvert */
1402
1403/* ------------------------------------------------------------------ */
1404/* decNumberLn -- natural logarithm                                   */
1405/*                                                                    */
1406/*   This computes C = ln(A)                                          */
1407/*                                                                    */
1408/*   res is C, the result.  C may be A                                */
1409/*   rhs is A                                                         */
1410/*   set is the context; note that rounding mode has no effect        */
1411/*                                                                    */
1412/* C must have space for set->digits digits.                          */
1413/*                                                                    */
1414/* Notable cases:                                                     */
1415/*   A<0 -> Invalid                                                   */
1416/*   A=0 -> -Infinity (Exact)                                         */
1417/*   A=+Infinity -> +Infinity (Exact)                                 */
1418/*   A=1 exactly -> 0 (Exact)                                         */
1419/*                                                                    */
1420/* Mathematical function restrictions apply (see above); a NaN is     */
1421/* returned with Invalid_operation if a restriction is violated.      */
1422/*                                                                    */
1423/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1424/* almost always be correctly rounded, but may be up to 1 ulp in      */
1425/* error in rare cases.                                               */
1426/* ------------------------------------------------------------------ */
1427/* This is a wrapper for decLnOp which can handle the slightly wider  */
1428/* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
1429/* to calculate at p+e+2).                                            */
1430/* ------------------------------------------------------------------ */
1431decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
1432                        decContext *set) {
1433  uInt status=0;                   /* accumulator */
1434  #if DECSUBSET
1435  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1436  #endif
1437
1438  #if DECCHECK
1439  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1440  #endif
1441
1442  /* Check restrictions; this is a math function; if not violated */
1443  /* then carry out the operation. */
1444  if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1445    #if DECSUBSET
1446    if (!set->extended) {
1447      /* reduce operand and set lostDigits status, as needed */
1448      if (rhs->digits>set->digits) {
1449        allocrhs=decRoundOperand(rhs, set, &status);
1450        if (allocrhs==NULL) break;
1451        rhs=allocrhs;
1452        }
1453      /* special check in subset for rhs=0 */
1454      if (ISZERO(rhs)) {                /* +/- zeros -> error */
1455        status|=DEC_Invalid_operation;
1456        break;}
1457      } /* extended=0 */
1458    #endif
1459    decLnOp(res, rhs, set, &status);
1460    } while(0);                         /* end protected */
1461
1462  #if DECSUBSET
1463  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
1464  #endif
1465  /* apply significant status */
1466  if (status!=0) decStatus(res, status, set);
1467  #if DECCHECK
1468  decCheckInexact(res, set);
1469  #endif
1470  return res;
1471  } /* decNumberLn */
1472
1473/* ------------------------------------------------------------------ */
1474/* decNumberLogB - get adjusted exponent, by 754r rules               */
1475/*                                                                    */
1476/*   This computes C = adjustedexponent(A)                            */
1477/*                                                                    */
1478/*   res is C, the result.  C may be A                                */
1479/*   rhs is A                                                         */
1480/*   set is the context, used only for digits and status              */
1481/*                                                                    */
1482/* C must have space for 10 digits (A might have 10**9 digits and     */
1483/* an exponent of +999999999, or one digit and an exponent of         */
1484/* -1999999999).                                                      */
1485/*                                                                    */
1486/* This returns the adjusted exponent of A after (in theory) padding  */
1487/* with zeros on the right to set->digits digits while keeping the    */
1488/* same value.  The exponent is not limited by emin/emax.             */
1489/*                                                                    */
1490/* Notable cases:                                                     */
1491/*   A<0 -> Use |A|                                                   */
1492/*   A=0 -> -Infinity (Division by zero)                              */
1493/*   A=Infinite -> +Infinity (Exact)                                  */
1494/*   A=1 exactly -> 0 (Exact)                                         */
1495/*   NaNs are propagated as usual                                     */
1496/* ------------------------------------------------------------------ */
1497decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
1498                          decContext *set) {
1499  uInt status=0;                   /* accumulator */
1500
1501  #if DECCHECK
1502  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1503  #endif
1504
1505  /* NaNs as usual; Infinities return +Infinity; 0->oops */
1506  if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1507   else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
1508   else if (decNumberIsZero(rhs)) {
1509    decNumberZero(res);                 /* prepare for Infinity */
1510    res->bits=DECNEG|DECINF;            /* -Infinity */
1511    status|=DEC_Division_by_zero;       /* as per 754r */
1512    }
1513   else { /* finite non-zero */
1514    Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
1515    decNumberFromInt32(res, ae);        /* lay it out */
1516    }
1517
1518  if (status!=0) decStatus(res, status, set);
1519  return res;
1520  } /* decNumberLogB */
1521
1522/* ------------------------------------------------------------------ */
1523/* decNumberLog10 -- logarithm in base 10                             */
1524/*                                                                    */
1525/*   This computes C = log10(A)                                       */
1526/*                                                                    */
1527/*   res is C, the result.  C may be A                                */
1528/*   rhs is A                                                         */
1529/*   set is the context; note that rounding mode has no effect        */
1530/*                                                                    */
1531/* C must have space for set->digits digits.                          */
1532/*                                                                    */
1533/* Notable cases:                                                     */
1534/*   A<0 -> Invalid                                                   */
1535/*   A=0 -> -Infinity (Exact)                                         */
1536/*   A=+Infinity -> +Infinity (Exact)                                 */
1537/*   A=10**n (if n is an integer) -> n (Exact)                        */
1538/*                                                                    */
1539/* Mathematical function restrictions apply (see above); a NaN is     */
1540/* returned with Invalid_operation if a restriction is violated.      */
1541/*                                                                    */
1542/* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1543/* almost always be correctly rounded, but may be up to 1 ulp in      */
1544/* error in rare cases.                                               */
1545/* ------------------------------------------------------------------ */
1546/* This calculates ln(A)/ln(10) using appropriate precision.  For     */
1547/* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
1548/* requested digits and t is the number of digits in the exponent     */
1549/* (maximum 6).  For ln(10) it is p + 3; this is often handled by the */
1550/* fastpath in decLnOp.  The final division is done to the requested  */
1551/* precision.                                                         */
1552/* ------------------------------------------------------------------ */
1553decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
1554                          decContext *set) {
1555  uInt status=0, ignore=0;         /* status accumulators */
1556  uInt needbytes;                  /* for space calculations */
1557  Int p;                           /* working precision */
1558  Int t;                           /* digits in exponent of A */
1559
1560  /* buffers for a and b working decimals */
1561  /* (adjustment calculator, same size) */
1562  decNumber bufa[D2N(DECBUFFER+2)];
1563  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
1564  decNumber *a=bufa;               /* temporary a */
1565  decNumber bufb[D2N(DECBUFFER+2)];
1566  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
1567  decNumber *b=bufb;               /* temporary b */
1568  decNumber bufw[D2N(10)];         /* working 2-10 digit number */
1569  decNumber *w=bufw;               /* .. */
1570  #if DECSUBSET
1571  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
1572  #endif
1573
1574  decContext aset;                 /* working context */
1575
1576  #if DECCHECK
1577  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1578  #endif
1579
1580  /* Check restrictions; this is a math function; if not violated */
1581  /* then carry out the operation. */
1582  if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
1583    #if DECSUBSET
1584    if (!set->extended) {
1585      /* reduce operand and set lostDigits status, as needed */
1586      if (rhs->digits>set->digits) {
1587        allocrhs=decRoundOperand(rhs, set, &status);
1588        if (allocrhs==NULL) break;
1589        rhs=allocrhs;
1590        }
1591      /* special check in subset for rhs=0 */
1592      if (ISZERO(rhs)) {                /* +/- zeros -> error */
1593        status|=DEC_Invalid_operation;
1594        break;}
1595      } /* extended=0 */
1596    #endif
1597
1598    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
1599
1600    /* handle exact powers of 10; only check if +ve finite */
1601    if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1602      Int residue=0;               /* (no residue) */
1603      uInt copystat=0;             /* clean status */
1604
1605      /* round to a single digit... */
1606      aset.digits=1;
1607      decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
1608      /* if exact and the digit is 1, rhs is a power of 10 */
1609      if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1610        /* the exponent, conveniently, is the power of 10; making */
1611        /* this the result needs a little care as it might not fit, */
1612        /* so first convert it into the working number, and then move */
1613        /* to res */
1614        decNumberFromInt32(w, w->exponent);
1615        residue=0;
1616        decCopyFit(res, w, set, &residue, &status); /* copy & round */
1617        decFinish(res, set, &residue, &status);     /* cleanup/set flags */
1618        break;
1619        } /* not a power of 10 */
1620      } /* not a candidate for exact */
1621
1622    /* simplify the information-content calculation to use 'total */
1623    /* number of digits in a, including exponent' as compared to the */
1624    /* requested digits, as increasing this will only rarely cost an */
1625    /* iteration in ln(a) anyway */
1626    t=6;                                /* it can never be >6 */
1627
1628    /* allocate space when needed... */
1629    p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1630    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1631    if (needbytes>sizeof(bufa)) {       /* need malloc space */
1632      allocbufa=(decNumber *)malloc(needbytes);
1633      if (allocbufa==NULL) {            /* hopeless -- abandon */
1634        status|=DEC_Insufficient_storage;
1635        break;}
1636      a=allocbufa;                      /* use the allocated space */
1637      }
1638    aset.digits=p;                      /* as calculated */
1639    aset.emax=DEC_MAX_MATH;             /* usual bounds */
1640    aset.emin=-DEC_MAX_MATH;            /* .. */
1641    aset.clamp=0;                       /* and no concrete format */
1642    decLnOp(a, rhs, &aset, &status);    /* a=ln(rhs) */
1643
1644    /* skip the division if the result so far is infinite, NaN, or */
1645    /* zero, or there was an error; note NaN from sNaN needs copy */
1646    if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1647    if (a->bits&DECSPECIAL || ISZERO(a)) {
1648      decNumberCopy(res, a);            /* [will fit] */
1649      break;}
1650
1651    /* for ln(10) an extra 3 digits of precision are needed */
1652    p=set->digits+3;
1653    needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1654    if (needbytes>sizeof(bufb)) {       /* need malloc space */
1655      allocbufb=(decNumber *)malloc(needbytes);
1656      if (allocbufb==NULL) {            /* hopeless -- abandon */
1657        status|=DEC_Insufficient_storage;
1658        break;}
1659      b=allocbufb;                      /* use the allocated space */
1660      }
1661    decNumberZero(w);                   /* set up 10... */
1662    #if DECDPUN==1
1663    w->lsu[1]=1; w->lsu[0]=0;           /* .. */
1664    #else
1665    w->lsu[0]=10;                       /* .. */
1666    #endif
1667    w->digits=2;                        /* .. */
1668
1669    aset.digits=p;
1670    decLnOp(b, w, &aset, &ignore);      /* b=ln(10) */
1671
1672    aset.digits=set->digits;            /* for final divide */
1673    decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
1674    } while(0);                         /* [for break] */
1675
1676  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1677  if (allocbufb!=NULL) free(allocbufb); /* .. */
1678  #if DECSUBSET
1679  if (allocrhs !=NULL) free(allocrhs);  /* .. */
1680  #endif
1681  /* apply significant status */
1682  if (status!=0) decStatus(res, status, set);
1683  #if DECCHECK
1684  decCheckInexact(res, set);
1685  #endif
1686  return res;
1687  } /* decNumberLog10 */
1688
1689/* ------------------------------------------------------------------ */
1690/* decNumberMax -- compare two Numbers and return the maximum         */
1691/*                                                                    */
1692/*   This computes C = A ? B, returning the maximum by 754R rules     */
1693/*                                                                    */
1694/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1695/*   lhs is A                                                         */
1696/*   rhs is B                                                         */
1697/*   set is the context                                               */
1698/*                                                                    */
1699/* C must have space for set->digits digits.                          */
1700/* ------------------------------------------------------------------ */
1701decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
1702                         const decNumber *rhs, decContext *set) {
1703  uInt status=0;                        /* accumulator */
1704  decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1705  if (status!=0) decStatus(res, status, set);
1706  #if DECCHECK
1707  decCheckInexact(res, set);
1708  #endif
1709  return res;
1710  } /* decNumberMax */
1711
1712/* ------------------------------------------------------------------ */
1713/* decNumberMaxMag -- compare and return the maximum by magnitude     */
1714/*                                                                    */
1715/*   This computes C = A ? B, returning the maximum by 754R rules     */
1716/*                                                                    */
1717/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1718/*   lhs is A                                                         */
1719/*   rhs is B                                                         */
1720/*   set is the context                                               */
1721/*                                                                    */
1722/* C must have space for set->digits digits.                          */
1723/* ------------------------------------------------------------------ */
1724decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
1725                         const decNumber *rhs, decContext *set) {
1726  uInt status=0;                        /* accumulator */
1727  decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1728  if (status!=0) decStatus(res, status, set);
1729  #if DECCHECK
1730  decCheckInexact(res, set);
1731  #endif
1732  return res;
1733  } /* decNumberMaxMag */
1734
1735/* ------------------------------------------------------------------ */
1736/* decNumberMin -- compare two Numbers and return the minimum         */
1737/*                                                                    */
1738/*   This computes C = A ? B, returning the minimum by 754R rules     */
1739/*                                                                    */
1740/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1741/*   lhs is A                                                         */
1742/*   rhs is B                                                         */
1743/*   set is the context                                               */
1744/*                                                                    */
1745/* C must have space for set->digits digits.                          */
1746/* ------------------------------------------------------------------ */
1747decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
1748                         const decNumber *rhs, decContext *set) {
1749  uInt status=0;                        /* accumulator */
1750  decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1751  if (status!=0) decStatus(res, status, set);
1752  #if DECCHECK
1753  decCheckInexact(res, set);
1754  #endif
1755  return res;
1756  } /* decNumberMin */
1757
1758/* ------------------------------------------------------------------ */
1759/* decNumberMinMag -- compare and return the minimum by magnitude     */
1760/*                                                                    */
1761/*   This computes C = A ? B, returning the minimum by 754R rules     */
1762/*                                                                    */
1763/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
1764/*   lhs is A                                                         */
1765/*   rhs is B                                                         */
1766/*   set is the context                                               */
1767/*                                                                    */
1768/* C must have space for set->digits digits.                          */
1769/* ------------------------------------------------------------------ */
1770decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
1771                         const decNumber *rhs, decContext *set) {
1772  uInt status=0;                        /* accumulator */
1773  decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1774  if (status!=0) decStatus(res, status, set);
1775  #if DECCHECK
1776  decCheckInexact(res, set);
1777  #endif
1778  return res;
1779  } /* decNumberMinMag */
1780
1781/* ------------------------------------------------------------------ */
1782/* decNumberMinus -- prefix minus operator                            */
1783/*                                                                    */
1784/*   This computes C = 0 - A                                          */
1785/*                                                                    */
1786/*   res is C, the result.  C may be A                                */
1787/*   rhs is A                                                         */
1788/*   set is the context                                               */
1789/*                                                                    */
1790/* See also decNumberCopyNegate for a quiet bitwise version of this.  */
1791/* C must have space for set->digits digits.                          */
1792/* ------------------------------------------------------------------ */
1793/* Simply use AddOp for the subtract, which will do the necessary.    */
1794/* ------------------------------------------------------------------ */
1795decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
1796                           decContext *set) {
1797  decNumber dzero;
1798  uInt status=0;                        /* accumulator */
1799
1800  #if DECCHECK
1801  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1802  #endif
1803
1804  decNumberZero(&dzero);                /* make 0 */
1805  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
1806  decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1807  if (status!=0) decStatus(res, status, set);
1808  #if DECCHECK
1809  decCheckInexact(res, set);
1810  #endif
1811  return res;
1812  } /* decNumberMinus */
1813
1814/* ------------------------------------------------------------------ */
1815/* decNumberNextMinus -- next towards -Infinity                       */
1816/*                                                                    */
1817/*   This computes C = A - infinitesimal, rounded towards -Infinity   */
1818/*                                                                    */
1819/*   res is C, the result.  C may be A                                */
1820/*   rhs is A                                                         */
1821/*   set is the context                                               */
1822/*                                                                    */
1823/* This is a generalization of 754r NextDown.                         */
1824/* ------------------------------------------------------------------ */
1825decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
1826                               decContext *set) {
1827  decNumber dtiny;                           /* constant */
1828  decContext workset=*set;                   /* work */
1829  uInt status=0;                             /* accumulator */
1830  #if DECCHECK
1831  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1832  #endif
1833
1834  /* +Infinity is the special case */
1835  if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1836    decSetMaxValue(res, set);                /* is +ve */
1837    /* there is no status to set */
1838    return res;
1839    }
1840  decNumberZero(&dtiny);                     /* start with 0 */
1841  dtiny.lsu[0]=1;                            /* make number that is .. */
1842  dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest */
1843  workset.round=DEC_ROUND_FLOOR;
1844  decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1845  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1846  if (status!=0) decStatus(res, status, set);
1847  return res;
1848  } /* decNumberNextMinus */
1849
1850/* ------------------------------------------------------------------ */
1851/* decNumberNextPlus -- next towards +Infinity                        */
1852/*                                                                    */
1853/*   This computes C = A + infinitesimal, rounded towards +Infinity   */
1854/*                                                                    */
1855/*   res is C, the result.  C may be A                                */
1856/*   rhs is A                                                         */
1857/*   set is the context                                               */
1858/*                                                                    */
1859/* This is a generalization of 754r NextUp.                           */
1860/* ------------------------------------------------------------------ */
1861decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
1862                              decContext *set) {
1863  decNumber dtiny;                           /* constant */
1864  decContext workset=*set;                   /* work */
1865  uInt status=0;                             /* accumulator */
1866  #if DECCHECK
1867  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1868  #endif
1869
1870  /* -Infinity is the special case */
1871  if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1872    decSetMaxValue(res, set);
1873    res->bits=DECNEG;                        /* negative */
1874    /* there is no status to set */
1875    return res;
1876    }
1877  decNumberZero(&dtiny);                     /* start with 0 */
1878  dtiny.lsu[0]=1;                            /* make number that is .. */
1879  dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest */
1880  workset.round=DEC_ROUND_CEILING;
1881  decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1882  status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1883  if (status!=0) decStatus(res, status, set);
1884  return res;
1885  } /* decNumberNextPlus */
1886
1887/* ------------------------------------------------------------------ */
1888/* decNumberNextToward -- next towards rhs                            */
1889/*                                                                    */
1890/*   This computes C = A +/- infinitesimal, rounded towards           */
1891/*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
1892/*                                                                    */
1893/*   res is C, the result.  C may be A or B.                          */
1894/*   lhs is A                                                         */
1895/*   rhs is B                                                         */
1896/*   set is the context                                               */
1897/*                                                                    */
1898/* This is a generalization of 754r NextAfter.                        */
1899/* ------------------------------------------------------------------ */
1900decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
1901                                const decNumber *rhs, decContext *set) {
1902  decNumber dtiny;                           /* constant */
1903  decContext workset=*set;                   /* work */
1904  Int result;                                /* .. */
1905  uInt status=0;                             /* accumulator */
1906  #if DECCHECK
1907  if (decCheckOperands(res, lhs, rhs, set)) return res;
1908  #endif
1909
1910  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1911    decNaNs(res, lhs, rhs, set, &status);
1912    }
1913   else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1914    result=decCompare(lhs, rhs, 0);     /* sign matters */
1915    if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
1916     else { /* valid compare */
1917      if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
1918       else { /* differ: need NextPlus or NextMinus */
1919        uByte sub;                      /* add or subtract */
1920        if (result<0) {                 /* lhs<rhs, do nextplus */
1921          /* -Infinity is the special case */
1922          if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1923            decSetMaxValue(res, set);
1924            res->bits=DECNEG;           /* negative */
1925            return res;                 /* there is no status to set */
1926            }
1927          workset.round=DEC_ROUND_CEILING;
1928          sub=0;                        /* add, please */
1929          } /* plus */
1930         else {                         /* lhs>rhs, do nextminus */
1931          /* +Infinity is the special case */
1932          if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1933            decSetMaxValue(res, set);
1934            return res;                 /* there is no status to set */
1935            }
1936          workset.round=DEC_ROUND_FLOOR;
1937          sub=DECNEG;                   /* subtract, please */
1938          } /* minus */
1939        decNumberZero(&dtiny);          /* start with 0 */
1940        dtiny.lsu[0]=1;                 /* make number that is .. */
1941        dtiny.exponent=DEC_MIN_EMIN-1;  /* .. smaller than tiniest */
1942        decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
1943        /* turn off exceptions if the result is a normal number */
1944        /* (including Nmin), otherwise let all status through */
1945        if (decNumberIsNormal(res, set)) status=0;
1946        } /* unequal */
1947      } /* compare OK */
1948    } /* numeric */
1949  if (status!=0) decStatus(res, status, set);
1950  return res;
1951  } /* decNumberNextToward */
1952
1953/* ------------------------------------------------------------------ */
1954/* decNumberOr -- OR two Numbers, digitwise                           */
1955/*                                                                    */
1956/*   This computes C = A | B                                          */
1957/*                                                                    */
1958/*   res is C, the result.  C may be A and/or B (e.g., X=X|X)         */
1959/*   lhs is A                                                         */
1960/*   rhs is B                                                         */
1961/*   set is the context (used for result length and error report)     */
1962/*                                                                    */
1963/* C must have space for set->digits digits.                          */
1964/*                                                                    */
1965/* Logical function restrictions apply (see above); a NaN is          */
1966/* returned with Invalid_operation if a restriction is violated.      */
1967/* ------------------------------------------------------------------ */
1968decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
1969                        const decNumber *rhs, decContext *set) {
1970  const Unit *ua, *ub;                  /* -> operands */
1971  const Unit *msua, *msub;              /* -> operand msus */
1972  Unit  *uc, *msuc;                     /* -> result and its msu */
1973  Int   msudigs;                        /* digits in res msu */
1974  #if DECCHECK
1975  if (decCheckOperands(res, lhs, rhs, set)) return res;
1976  #endif
1977
1978  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1979   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1980    decStatus(res, DEC_Invalid_operation, set);
1981    return res;
1982    }
1983  /* operands are valid */
1984  ua=lhs->lsu;                          /* bottom-up */
1985  ub=rhs->lsu;                          /* .. */
1986  uc=res->lsu;                          /* .. */
1987  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
1988  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
1989  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
1990  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
1991  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
1992    Unit a, b;                          /* extract units */
1993    if (ua>msua) a=0;
1994     else a=*ua;
1995    if (ub>msub) b=0;
1996     else b=*ub;
1997    *uc=0;                              /* can now write back */
1998    if (a|b) {                          /* maybe 1 bits to examine */
1999      Int i, j;
2000      /* This loop could be unrolled and/or use BIN2BCD tables */
2001      for (i=0; i<DECDPUN; i++) {
2002        if ((a|b)&1) *uc=*uc+(Unit)powers[i];     /* effect OR */
2003        j=a%10;
2004        a=a/10;
2005        j|=b%10;
2006        b=b/10;
2007        if (j>1) {
2008          decStatus(res, DEC_Invalid_operation, set);
2009          return res;
2010          }
2011        if (uc==msuc && i==msudigs-1) break;      /* just did final digit */
2012        } /* each digit */
2013      } /* non-zero */
2014    } /* each unit */
2015  /* [here uc-1 is the msu of the result] */
2016  res->digits=decGetDigits(res->lsu, uc-res->lsu);
2017  res->exponent=0;                      /* integer */
2018  res->bits=0;                          /* sign=0 */
2019  return res;  /* [no status to set] */
2020  } /* decNumberOr */
2021
2022/* ------------------------------------------------------------------ */
2023/* decNumberPlus -- prefix plus operator                              */
2024/*                                                                    */
2025/*   This computes C = 0 + A                                          */
2026/*                                                                    */
2027/*   res is C, the result.  C may be A                                */
2028/*   rhs is A                                                         */
2029/*   set is the context                                               */
2030/*                                                                    */
2031/* See also decNumberCopy for a quiet bitwise version of this.        */
2032/* C must have space for set->digits digits.                          */
2033/* ------------------------------------------------------------------ */
2034/* This simply uses AddOp; Add will take fast path after preparing A. */
2035/* Performance is a concern here, as this routine is often used to    */
2036/* check operands and apply rounding and overflow/underflow testing.  */
2037/* ------------------------------------------------------------------ */
2038decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
2039                          decContext *set) {
2040  decNumber dzero;
2041  uInt status=0;                        /* accumulator */
2042  #if DECCHECK
2043  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2044  #endif
2045
2046  decNumberZero(&dzero);                /* make 0 */
2047  dzero.exponent=rhs->exponent;         /* [no coefficient expansion] */
2048  decAddOp(res, &dzero, rhs, set, 0, &status);
2049  if (status!=0) decStatus(res, status, set);
2050  #if DECCHECK
2051  decCheckInexact(res, set);
2052  #endif
2053  return res;
2054  } /* decNumberPlus */
2055
2056/* ------------------------------------------------------------------ */
2057/* decNumberMultiply -- multiply two Numbers                          */
2058/*                                                                    */
2059/*   This computes C = A x B                                          */
2060/*                                                                    */
2061/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
2062/*   lhs is A                                                         */
2063/*   rhs is B                                                         */
2064/*   set is the context                                               */
2065/*                                                                    */
2066/* C must have space for set->digits digits.                          */
2067/* ------------------------------------------------------------------ */
2068decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
2069                              const decNumber *rhs, decContext *set) {
2070  uInt status=0;                   /* accumulator */
2071  decMultiplyOp(res, lhs, rhs, set, &status);
2072  if (status!=0) decStatus(res, status, set);
2073  #if DECCHECK
2074  decCheckInexact(res, set);
2075  #endif
2076  return res;
2077  } /* decNumberMultiply */
2078
2079/* ------------------------------------------------------------------ */
2080/* decNumberPower -- raise a number to a power                        */
2081/*                                                                    */
2082/*   This computes C = A ** B                                         */
2083/*                                                                    */
2084/*   res is C, the result.  C may be A and/or B (e.g., X=X**X)        */
2085/*   lhs is A                                                         */
2086/*   rhs is B                                                         */
2087/*   set is the context                                               */
2088/*                                                                    */
2089/* C must have space for set->digits digits.                          */
2090/*                                                                    */
2091/* Mathematical function restrictions apply (see above); a NaN is     */
2092/* returned with Invalid_operation if a restriction is violated.      */
2093/*                                                                    */
2094/* However, if 1999999997<=B<=999999999 and B is an integer then the  */
2095/* restrictions on A and the context are relaxed to the usual bounds, */
2096/* for compatibility with the earlier (integer power only) version    */
2097/* of this function.                                                  */
2098/*                                                                    */
2099/* When B is an integer, the result may be exact, even if rounded.    */
2100/*                                                                    */
2101/* The final result is rounded according to the context; it will      */
2102/* almost always be correctly rounded, but may be up to 1 ulp in      */
2103/* error in rare cases.                                               */
2104/* ------------------------------------------------------------------ */
2105decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
2106                           const decNumber *rhs, decContext *set) {
2107  #if DECSUBSET
2108  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
2109  decNumber *allocrhs=NULL;        /* .., rhs */
2110  #endif
2111  decNumber *allocdac=NULL;        /* -> allocated acc buffer, iff used */
2112  decNumber *allocinv=NULL;        /* -> allocated 1/x buffer, iff used */
2113  Int   reqdigits=set->digits;     /* requested DIGITS */
2114  Int   n;                         /* rhs in binary */
2115  Flag  rhsint=0;                  /* 1 if rhs is an integer */
2116  Flag  useint=0;                  /* 1 if can use integer calculation */
2117  Flag  isoddint=0;                /* 1 if rhs is an integer and odd */
2118  Int   i;                         /* work */
2119  #if DECSUBSET
2120  Int   dropped;                   /* .. */
2121  #endif
2122  uInt  needbytes;                 /* buffer size needed */
2123  Flag  seenbit;                   /* seen a bit while powering */
2124  Int   residue=0;                 /* rounding residue */
2125  uInt  status=0;                  /* accumulators */
2126  uByte bits=0;                    /* result sign if errors */
2127  decContext aset;                 /* working context */
2128  decNumber dnOne;                 /* work value 1... */
2129  /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
2130  decNumber dacbuff[D2N(DECBUFFER+9)];
2131  decNumber *dac=dacbuff;          /* -> result accumulator */
2132  /* same again for possible 1/lhs calculation */
2133  decNumber invbuff[D2N(DECBUFFER+9)];
2134
2135  #if DECCHECK
2136  if (decCheckOperands(res, lhs, rhs, set)) return res;
2137  #endif
2138
2139  do {                             /* protect allocated storage */
2140    #if DECSUBSET
2141    if (!set->extended) { /* reduce operands and set status, as needed */
2142      if (lhs->digits>reqdigits) {
2143        alloclhs=decRoundOperand(lhs, set, &status);
2144        if (alloclhs==NULL) break;
2145        lhs=alloclhs;
2146        }
2147      if (rhs->digits>reqdigits) {
2148        allocrhs=decRoundOperand(rhs, set, &status);
2149        if (allocrhs==NULL) break;
2150        rhs=allocrhs;
2151        }
2152      }
2153    #endif
2154    /* [following code does not require input rounding] */
2155
2156    /* handle NaNs and rhs Infinity (lhs infinity is harder) */
2157    if (SPECIALARGS) {
2158      if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
2159        decNaNs(res, lhs, rhs, set, &status);
2160        break;}
2161      if (decNumberIsInfinite(rhs)) {   /* rhs Infinity */
2162        Flag rhsneg=rhs->bits&DECNEG;   /* save rhs sign */
2163        if (decNumberIsNegative(lhs)    /* lhs<0 */
2164         && !decNumberIsZero(lhs))      /* .. */
2165          status|=DEC_Invalid_operation;
2166         else {                         /* lhs >=0 */
2167          decNumberZero(&dnOne);        /* set up 1 */
2168          dnOne.lsu[0]=1;
2169          decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
2170          decNumberZero(res);           /* prepare for 0/1/Infinity */
2171          if (decNumberIsNegative(dac)) {    /* lhs<1 */
2172            if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
2173            }
2174           else if (dac->lsu[0]==0) {        /* lhs=1 */
2175            /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2176            Int shift=set->digits-1;
2177            *res->lsu=1;                     /* was 0, make int 1 */
2178            res->digits=decShiftToMost(res->lsu, 1, shift);
2179            res->exponent=-shift;            /* make 1.0000... */
2180            status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2181            }
2182           else {                            /* lhs>1 */
2183            if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
2184            }
2185          } /* lhs>=0 */
2186        break;}
2187      /* [lhs infinity drops through] */
2188      } /* specials */
2189
2190    /* Original rhs may be an integer that fits and is in range */
2191    n=decGetInt(rhs);
2192    if (n!=BADINT) {                    /* it is an integer */
2193      rhsint=1;                         /* record the fact for 1**n */
2194      isoddint=(Flag)n&1;               /* [works even if big] */
2195      if (n!=BIGEVEN && n!=BIGODD)      /* can use integer path? */
2196        useint=1;                       /* looks good */
2197      }
2198
2199    if (decNumberIsNegative(lhs)        /* -x .. */
2200      && isoddint) bits=DECNEG;         /* .. to an odd power */
2201
2202    /* handle LHS infinity */
2203    if (decNumberIsInfinite(lhs)) {     /* [NaNs already handled] */
2204      uByte rbits=rhs->bits;            /* save */
2205      decNumberZero(res);               /* prepare */
2206      if (n==0) *res->lsu=1;            /* [-]Inf**0 => 1 */
2207       else {
2208        /* -Inf**nonint -> error */
2209        if (!rhsint && decNumberIsNegative(lhs)) {
2210          status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
2211          break;}
2212        if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
2213        /* [otherwise will be 0 or -0] */
2214        res->bits=bits;
2215        }
2216      break;}
2217
2218    /* similarly handle LHS zero */
2219    if (decNumberIsZero(lhs)) {
2220      if (n==0) {                            /* 0**0 => Error */
2221        #if DECSUBSET
2222        if (!set->extended) {                /* [unless subset] */
2223          decNumberZero(res);
2224          *res->lsu=1;                       /* return 1 */
2225          break;}
2226        #endif
2227        status|=DEC_Invalid_operation;
2228        }
2229       else {                                /* 0**x */
2230        uByte rbits=rhs->bits;               /* save */
2231        if (rbits & DECNEG) {                /* was a 0**(-n) */
2232          #if DECSUBSET
2233          if (!set->extended) {              /* [bad if subset] */
2234            status|=DEC_Invalid_operation;
2235            break;}
2236          #endif
2237          bits|=DECINF;
2238          }
2239        decNumberZero(res);                  /* prepare */
2240        /* [otherwise will be 0 or -0] */
2241        res->bits=bits;
2242        }
2243      break;}
2244
2245    /* here both lhs and rhs are finite; rhs==0 is handled in the */
2246    /* integer path.  Next handle the non-integer cases */
2247    if (!useint) {                      /* non-integral rhs */
2248      /* any -ve lhs is bad, as is either operand or context out of */
2249      /* bounds */
2250      if (decNumberIsNegative(lhs)) {
2251        status|=DEC_Invalid_operation;
2252        break;}
2253      if (decCheckMath(lhs, set, &status)
2254       || decCheckMath(rhs, set, &status)) break; /* variable status */
2255
2256      decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
2257      aset.emax=DEC_MAX_MATH;           /* usual bounds */
2258      aset.emin=-DEC_MAX_MATH;          /* .. */
2259      aset.clamp=0;                     /* and no concrete format */
2260
2261      /* calculate the result using exp(ln(lhs)*rhs), which can */
2262      /* all be done into the accumulator, dac.  The precision needed */
2263      /* is enough to contain the full information in the lhs (which */
2264      /* is the total digits, including exponent), or the requested */
2265      /* precision, if larger, + 4; 6 is used for the exponent */
2266      /* maximum length, and this is also used when it is shorter */
2267      /* than the requested digits as it greatly reduces the >0.5 ulp */
2268      /* cases at little cost (because Ln doubles digits each */
2269      /* iteration so a few extra digits rarely causes an extra */
2270      /* iteration) */
2271      aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2272      } /* non-integer rhs */
2273
2274     else { /* rhs is in-range integer */
2275      if (n==0) {                       /* x**0 = 1 */
2276        /* (0**0 was handled above) */
2277        decNumberZero(res);             /* result=1 */
2278        *res->lsu=1;                    /* .. */
2279        break;}
2280      /* rhs is a non-zero integer */
2281      if (n<0) n=-n;                    /* use abs(n) */
2282
2283      aset=*set;                        /* clone the context */
2284      aset.round=DEC_ROUND_HALF_EVEN;   /* internally use balanced */
2285      /* calculate the working DIGITS */
2286      aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2287      #if DECSUBSET
2288      if (!set->extended) aset.digits--;     /* use classic precision */
2289      #endif
2290      /* it's an error if this is more than can be handled */
2291      if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2292      } /* integer path */
2293
2294    /* aset.digits is the count of digits for the accumulator needed */
2295    /* if accumulator is too long for local storage, then allocate */
2296    needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2297    /* [needbytes also used below if 1/lhs needed] */
2298    if (needbytes>sizeof(dacbuff)) {
2299      allocdac=(decNumber *)malloc(needbytes);
2300      if (allocdac==NULL) {   /* hopeless -- abandon */
2301        status|=DEC_Insufficient_storage;
2302        break;}
2303      dac=allocdac;           /* use the allocated space */
2304      }
2305    /* here, aset is set up and accumulator is ready for use */
2306
2307    if (!useint) {                           /* non-integral rhs */
2308      /* x ** y; special-case x=1 here as it will otherwise always */
2309      /* reduce to integer 1; decLnOp has a fastpath which detects */
2310      /* the case of x=1 */
2311      decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
2312      /* [no error possible, as lhs 0 already handled] */
2313      if (ISZERO(dac)) {                     /* x==1, 1.0, etc. */
2314        /* need to return fully-padded 1.0000 etc., but rhsint->1 */
2315        *dac->lsu=1;                         /* was 0, make int 1 */
2316        if (!rhsint) {                       /* add padding */
2317          Int shift=set->digits-1;
2318          dac->digits=decShiftToMost(dac->lsu, 1, shift);
2319          dac->exponent=-shift;              /* make 1.0000... */
2320          status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
2321          }
2322        }
2323       else {
2324        decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
2325        decExpOp(dac, dac, &aset, &status);            /* dac=exp(dac) */
2326        }
2327      /* and drop through for final rounding */
2328      } /* non-integer rhs */
2329
2330     else {                             /* carry on with integer */
2331      decNumberZero(dac);               /* acc=1 */
2332      *dac->lsu=1;                      /* .. */
2333
2334      /* if a negative power the constant 1 is needed, and if not subset */
2335      /* invert the lhs now rather than inverting the result later */
2336      if (decNumberIsNegative(rhs)) {   /* was a **-n [hence digits>0] */
2337        decNumber *inv=invbuff;         /* assume use fixed buffer */
2338        decNumberCopy(&dnOne, dac);     /* dnOne=1;  [needed now or later] */
2339        #if DECSUBSET
2340        if (set->extended) {            /* need to calculate 1/lhs */
2341        #endif
2342          /* divide lhs into 1, putting result in dac [dac=1/dac] */
2343          decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2344          /* now locate or allocate space for the inverted lhs */
2345          if (needbytes>sizeof(invbuff)) {
2346            allocinv=(decNumber *)malloc(needbytes);
2347            if (allocinv==NULL) {       /* hopeless -- abandon */
2348              status|=DEC_Insufficient_storage;
2349              break;}
2350            inv=allocinv;               /* use the allocated space */
2351            }
2352          /* [inv now points to big-enough buffer or allocated storage] */
2353          decNumberCopy(inv, dac);      /* copy the 1/lhs */
2354          decNumberCopy(dac, &dnOne);   /* restore acc=1 */
2355          lhs=inv;                      /* .. and go forward with new lhs */
2356        #if DECSUBSET
2357          }
2358        #endif
2359        }
2360
2361      /* Raise-to-the-power loop... */
2362      seenbit=0;                   /* set once a 1-bit is encountered */
2363      for (i=1;;i++){              /* for each bit [top bit ignored] */
2364        /* abandon if had overflow or terminal underflow */
2365        if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
2366          if (status&DEC_Overflow || ISZERO(dac)) break;
2367          }
2368        /* [the following two lines revealed an optimizer bug in a C++ */
2369        /* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2370        n=n<<1;                    /* move next bit to testable position */
2371        if (n<0) {                 /* top bit is set */
2372          seenbit=1;               /* OK, significant bit seen */
2373          decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
2374          }
2375        if (i==31) break;          /* that was the last bit */
2376        if (!seenbit) continue;    /* no need to square 1 */
2377        decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
2378        } /*i*/ /* 32 bits */
2379
2380      /* complete internal overflow or underflow processing */
2381      if (status & (DEC_Overflow|DEC_Underflow)) {
2382        #if DECSUBSET
2383        /* If subset, and power was negative, reverse the kind of -erflow */
2384        /* [1/x not yet done] */
2385        if (!set->extended && decNumberIsNegative(rhs)) {
2386          if (status & DEC_Overflow)
2387            status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2388           else { /* trickier -- Underflow may or may not be set */
2389            status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
2390            status|=DEC_Overflow;
2391            }
2392          }
2393        #endif
2394        dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
2395        /* round subnormals [to set.digits rather than aset.digits] */
2396        /* or set overflow result similarly as required */
2397        decFinalize(dac, set, &residue, &status);
2398        decNumberCopy(res, dac);   /* copy to result (is now OK length) */
2399        break;
2400        }
2401
2402      #if DECSUBSET
2403      if (!set->extended &&                  /* subset math */
2404          decNumberIsNegative(rhs)) {        /* was a **-n [hence digits>0] */
2405        /* so divide result into 1 [dac=1/dac] */
2406        decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2407        }
2408      #endif
2409      } /* rhs integer path */
2410
2411    /* reduce result to the requested length and copy to result */
2412    decCopyFit(res, dac, set, &residue, &status);
2413    decFinish(res, set, &residue, &status);  /* final cleanup */
2414    #if DECSUBSET
2415    if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
2416    #endif
2417    } while(0);                         /* end protected */
2418
2419  if (allocdac!=NULL) free(allocdac);   /* drop any storage used */
2420  if (allocinv!=NULL) free(allocinv);   /* .. */
2421  #if DECSUBSET
2422  if (alloclhs!=NULL) free(alloclhs);   /* .. */
2423  if (allocrhs!=NULL) free(allocrhs);   /* .. */
2424  #endif
2425  if (status!=0) decStatus(res, status, set);
2426  #if DECCHECK
2427  decCheckInexact(res, set);
2428  #endif
2429  return res;
2430  } /* decNumberPower */
2431
2432/* ------------------------------------------------------------------ */
2433/* decNumberQuantize -- force exponent to requested value             */
2434/*                                                                    */
2435/*   This computes C = op(A, B), where op adjusts the coefficient     */
2436/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2437/*   of C has exponent of B.  The numerical value of C will equal A,  */
2438/*   except for the effects of any rounding that occurred.            */
2439/*                                                                    */
2440/*   res is C, the result.  C may be A or B                           */
2441/*   lhs is A, the number to adjust                                   */
2442/*   rhs is B, the number with exponent to match                      */
2443/*   set is the context                                               */
2444/*                                                                    */
2445/* C must have space for set->digits digits.                          */
2446/*                                                                    */
2447/* Unless there is an error or the result is infinite, the exponent   */
2448/* after the operation is guaranteed to be equal to that of B.        */
2449/* ------------------------------------------------------------------ */
2450decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
2451                              const decNumber *rhs, decContext *set) {
2452  uInt status=0;                        /* accumulator */
2453  decQuantizeOp(res, lhs, rhs, set, 1, &status);
2454  if (status!=0) decStatus(res, status, set);
2455  return res;
2456  } /* decNumberQuantize */
2457
2458/* ------------------------------------------------------------------ */
2459/* decNumberReduce -- remove trailing zeros                           */
2460/*                                                                    */
2461/*   This computes C = 0 + A, and normalizes the result               */
2462/*                                                                    */
2463/*   res is C, the result.  C may be A                                */
2464/*   rhs is A                                                         */
2465/*   set is the context                                               */
2466/*                                                                    */
2467/* C must have space for set->digits digits.                          */
2468/* ------------------------------------------------------------------ */
2469/* Previously known as Normalize */
2470decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
2471                               decContext *set) {
2472  return decNumberReduce(res, rhs, set);
2473  } /* decNumberNormalize */
2474
2475decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
2476                            decContext *set) {
2477  #if DECSUBSET
2478  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
2479  #endif
2480  uInt status=0;                   /* as usual */
2481  Int  residue=0;                  /* as usual */
2482  Int  dropped;                    /* work */
2483
2484  #if DECCHECK
2485  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2486  #endif
2487
2488  do {                             /* protect allocated storage */
2489    #if DECSUBSET
2490    if (!set->extended) {
2491      /* reduce operand and set lostDigits status, as needed */
2492      if (rhs->digits>set->digits) {
2493        allocrhs=decRoundOperand(rhs, set, &status);
2494        if (allocrhs==NULL) break;
2495        rhs=allocrhs;
2496        }
2497      }
2498    #endif
2499    /* [following code does not require input rounding] */
2500
2501    /* Infinities copy through; NaNs need usual treatment */
2502    if (decNumberIsNaN(rhs)) {
2503      decNaNs(res, rhs, NULL, set, &status);
2504      break;
2505      }
2506
2507    /* reduce result to the requested length and copy to result */
2508    decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
2509    decFinish(res, set, &residue, &status);       /* cleanup/set flags */
2510    decTrim(res, set, 1, &dropped);               /* normalize in place */
2511    } while(0);                              /* end protected */
2512
2513  #if DECSUBSET
2514  if (allocrhs !=NULL) free(allocrhs);       /* .. */
2515  #endif
2516  if (status!=0) decStatus(res, status, set);/* then report status */
2517  return res;
2518  } /* decNumberReduce */
2519
2520/* ------------------------------------------------------------------ */
2521/* decNumberRescale -- force exponent to requested value              */
2522/*                                                                    */
2523/*   This computes C = op(A, B), where op adjusts the coefficient     */
2524/*   of C (by rounding or shifting) such that the exponent (-scale)   */
2525/*   of C has the value B.  The numerical value of C will equal A,    */
2526/*   except for the effects of any rounding that occurred.            */
2527/*                                                                    */
2528/*   res is C, the result.  C may be A or B                           */
2529/*   lhs is A, the number to adjust                                   */
2530/*   rhs is B, the requested exponent                                 */
2531/*   set is the context                                               */
2532/*                                                                    */
2533/* C must have space for set->digits digits.                          */
2534/*                                                                    */
2535/* Unless there is an error or the result is infinite, the exponent   */
2536/* after the operation is guaranteed to be equal to B.                */
2537/* ------------------------------------------------------------------ */
2538decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
2539                             const decNumber *rhs, decContext *set) {
2540  uInt status=0;                        /* accumulator */
2541  decQuantizeOp(res, lhs, rhs, set, 0, &status);
2542  if (status!=0) decStatus(res, status, set);
2543  return res;
2544  } /* decNumberRescale */
2545
2546/* ------------------------------------------------------------------ */
2547/* decNumberRemainder -- divide and return remainder                  */
2548/*                                                                    */
2549/*   This computes C = A % B                                          */
2550/*                                                                    */
2551/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
2552/*   lhs is A                                                         */
2553/*   rhs is B                                                         */
2554/*   set is the context                                               */
2555/*                                                                    */
2556/* C must have space for set->digits digits.                          */
2557/* ------------------------------------------------------------------ */
2558decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
2559                               const decNumber *rhs, decContext *set) {
2560  uInt status=0;                        /* accumulator */
2561  decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2562  if (status!=0) decStatus(res, status, set);
2563  #if DECCHECK
2564  decCheckInexact(res, set);
2565  #endif
2566  return res;
2567  } /* decNumberRemainder */
2568
2569/* ------------------------------------------------------------------ */
2570/* decNumberRemainderNear -- divide and return remainder from nearest */
2571/*                                                                    */
2572/*   This computes C = A % B, where % is the IEEE remainder operator  */
2573/*                                                                    */
2574/*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
2575/*   lhs is A                                                         */
2576/*   rhs is B                                                         */
2577/*   set is the context                                               */
2578/*                                                                    */
2579/* C must have space for set->digits digits.                          */
2580/* ------------------------------------------------------------------ */
2581decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2582                                   const decNumber *rhs, decContext *set) {
2583  uInt status=0;                        /* accumulator */
2584  decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2585  if (status!=0) decStatus(res, status, set);
2586  #if DECCHECK
2587  decCheckInexact(res, set);
2588  #endif
2589  return res;
2590  } /* decNumberRemainderNear */
2591
2592/* ------------------------------------------------------------------ */
2593/* decNumberRotate -- rotate the coefficient of a Number left/right   */
2594/*                                                                    */
2595/*   This computes C = A rot B  (in base ten and rotating set->digits */
2596/*   digits).                                                         */
2597/*                                                                    */
2598/*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)       */
2599/*   lhs is A                                                         */
2600/*   rhs is B, the number of digits to rotate (-ve to right)          */
2601/*   set is the context                                               */
2602/*                                                                    */
2603/* The digits of the coefficient of A are rotated to the left (if B   */
2604/* is positive) or to the right (if B is negative) without adjusting  */
2605/* the exponent or the sign of A.  If lhs->digits is less than        */
2606/* set->digits the coefficient is padded with zeros on the left       */
2607/* before the rotate.  Any leading zeros in the result are removed    */
2608/* as usual.                                                          */
2609/*                                                                    */
2610/* B must be an integer (q=0) and in the range -set->digits through   */
2611/* +set->digits.                                                      */
2612/* C must have space for set->digits digits.                          */
2613/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2614/* B must be valid).  No status is set unless B is invalid or an      */
2615/* operand is an sNaN.                                                */
2616/* ------------------------------------------------------------------ */
2617decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
2618                           const decNumber *rhs, decContext *set) {
2619  uInt status=0;              /* accumulator */
2620  Int  rotate;                /* rhs as an Int */
2621
2622  #if DECCHECK
2623  if (decCheckOperands(res, lhs, rhs, set)) return res;
2624  #endif
2625
2626  /* NaNs propagate as normal */
2627  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2628    decNaNs(res, lhs, rhs, set, &status);
2629   /* rhs must be an integer */
2630   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2631    status=DEC_Invalid_operation;
2632   else { /* both numeric, rhs is an integer */
2633    rotate=decGetInt(rhs);                   /* [cannot fail] */
2634    if (rotate==BADINT                       /* something bad .. */
2635     || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
2636     || abs(rotate)>set->digits)             /* .. or out of range */
2637      status=DEC_Invalid_operation;
2638     else {                                  /* rhs is OK */
2639      decNumberCopy(res, lhs);
2640      /* convert -ve rotate to equivalent positive rotation */
2641      if (rotate<0) rotate=set->digits+rotate;
2642      if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
2643       && !decNumberIsInfinite(res)) {       /* lhs was infinite */
2644        /* left-rotate to do; 0 < rotate < set->digits */
2645        uInt units, shift;                   /* work */
2646        uInt msudigits;                      /* digits in result msu */
2647        Unit *msu=res->lsu+D2U(res->digits)-1;    /* current msu */
2648        Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
2649        for (msu++; msu<=msumax; msu++) *msu=0;   /* ensure high units=0 */
2650        res->digits=set->digits;                  /* now full-length */
2651        msudigits=MSUDIGITS(res->digits);         /* actual digits in msu */
2652
2653        /* rotation here is done in-place, in three steps */
2654        /* 1. shift all to least up to one unit to unit-align final */
2655        /*    lsd [any digits shifted out are rotated to the left, */
2656        /*    abutted to the original msd (which may require split)] */
2657        /* */
2658        /*    [if there are no whole units left to rotate, the */
2659        /*    rotation is now complete] */
2660        /* */
2661        /* 2. shift to least, from below the split point only, so that */
2662        /*    the final msd is in the right place in its Unit [any */
2663        /*    digits shifted out will fit exactly in the current msu, */
2664        /*    left aligned, no split required] */
2665        /* */
2666        /* 3. rotate all the units by reversing left part, right */
2667        /*    part, and then whole */
2668        /* */
2669        /* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2670        /* */
2671        /*   start: 00a bcd efg hij klm npq */
2672        /* */
2673        /*      1a  000 0ab cde fgh|ijk lmn [pq saved] */
2674        /*      1b  00p qab cde fgh|ijk lmn */
2675        /* */
2676        /*      2a  00p qab cde fgh|00i jkl [mn saved] */
2677        /*      2b  mnp qab cde fgh|00i jkl */
2678        /* */
2679        /*      3a  fgh cde qab mnp|00i jkl */
2680        /*      3b  fgh cde qab mnp|jkl 00i */
2681        /*      3c  00i jkl mnp qab cde fgh */
2682
2683        /* Step 1: amount to shift is the partial right-rotate count */
2684        rotate=set->digits-rotate;      /* make it right-rotate */
2685        units=rotate/DECDPUN;           /* whole units to rotate */
2686        shift=rotate%DECDPUN;           /* left-over digits count */
2687        if (shift>0) {                  /* not an exact number of units */
2688          uInt save=res->lsu[0]%powers[shift];    /* save low digit(s) */
2689          decShiftToLeast(res->lsu, D2U(res->digits), shift);
2690          if (shift>msudigits) {        /* msumax-1 needs >0 digits */
2691            uInt rem=save%powers[shift-msudigits];/* split save */
2692            *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
2693            *(msumax-1)=*(msumax-1)
2694                       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
2695            }
2696           else { /* all fits in msumax */
2697            *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
2698            }
2699          } /* digits shift needed */
2700
2701        /* If whole units to rotate... */
2702        if (units>0) {                  /* some to do */
2703          /* Step 2: the units to touch are the whole ones in rotate, */
2704          /*   if any, and the shift is DECDPUN-msudigits (which may be */
2705          /*   0, again) */
2706          shift=DECDPUN-msudigits;
2707          if (shift>0) {                /* not an exact number of units */
2708            uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
2709            decShiftToLeast(res->lsu, units, shift);
2710            *msumax=*msumax+(Unit)(save*powers[msudigits]);
2711            } /* partial shift needed */
2712
2713          /* Step 3: rotate the units array using triple reverse */
2714          /* (reversing is easy and fast) */
2715          decReverse(res->lsu+units, msumax);     /* left part */
2716          decReverse(res->lsu, res->lsu+units-1); /* right part */
2717          decReverse(res->lsu, msumax);           /* whole */
2718          } /* whole units to rotate */
2719        /* the rotation may have left an undetermined number of zeros */
2720        /* on the left, so true length needs to be calculated */
2721        res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2722        } /* rotate needed */
2723      } /* rhs OK */
2724    } /* numerics */
2725  if (status!=0) decStatus(res, status, set);
2726  return res;
2727  } /* decNumberRotate */
2728
2729/* ------------------------------------------------------------------ */
2730/* decNumberSameQuantum -- test for equal exponents                   */
2731/*                                                                    */
2732/*   res is the result number, which will contain either 0 or 1       */
2733/*   lhs is a number to test                                          */
2734/*   rhs is the second (usually a pattern)                            */
2735/*                                                                    */
2736/* No errors are possible and no context is needed.                   */
2737/* ------------------------------------------------------------------ */
2738decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2739                                 const decNumber *rhs) {
2740  Unit ret=0;                      /* return value */
2741
2742  #if DECCHECK
2743  if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2744  #endif
2745
2746  if (SPECIALARGS) {
2747    if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2748     else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2749     /* [anything else with a special gives 0] */
2750    }
2751   else if (lhs->exponent==rhs->exponent) ret=1;
2752
2753  decNumberZero(res);              /* OK to overwrite an operand now */
2754  *res->lsu=ret;
2755  return res;
2756  } /* decNumberSameQuantum */
2757
2758/* ------------------------------------------------------------------ */
2759/* decNumberScaleB -- multiply by a power of 10                       */
2760/*                                                                    */
2761/* This computes C = A x 10**B where B is an integer (q=0) with       */
2762/* maximum magnitude 2*(emax+digits)                                  */
2763/*                                                                    */
2764/*   res is C, the result.  C may be A or B                           */
2765/*   lhs is A, the number to adjust                                   */
2766/*   rhs is B, the requested power of ten to use                      */
2767/*   set is the context                                               */
2768/*                                                                    */
2769/* C must have space for set->digits digits.                          */
2770/*                                                                    */
2771/* The result may underflow or overflow.                              */
2772/* ------------------------------------------------------------------ */
2773decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
2774                            const decNumber *rhs, decContext *set) {
2775  Int  reqexp;                /* requested exponent change [B] */
2776  uInt status=0;              /* accumulator */
2777  Int  residue;               /* work */
2778
2779  #if DECCHECK
2780  if (decCheckOperands(res, lhs, rhs, set)) return res;
2781  #endif
2782
2783  /* Handle special values except lhs infinite */
2784  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2785    decNaNs(res, lhs, rhs, set, &status);
2786    /* rhs must be an integer */
2787   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2788    status=DEC_Invalid_operation;
2789   else {
2790    /* lhs is a number; rhs is a finite with q==0 */
2791    reqexp=decGetInt(rhs);                   /* [cannot fail] */
2792    if (reqexp==BADINT                       /* something bad .. */
2793     || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
2794     || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
2795      status=DEC_Invalid_operation;
2796     else {                                  /* rhs is OK */
2797      decNumberCopy(res, lhs);               /* all done if infinite lhs */
2798      if (!decNumberIsInfinite(res)) {       /* prepare to scale */
2799        res->exponent+=reqexp;               /* adjust the exponent */
2800        residue=0;
2801        decFinalize(res, set, &residue, &status); /* .. and check */
2802        } /* finite LHS */
2803      } /* rhs OK */
2804    } /* rhs finite */
2805  if (status!=0) decStatus(res, status, set);
2806  return res;
2807  } /* decNumberScaleB */
2808
2809/* ------------------------------------------------------------------ */
2810/* decNumberShift -- shift the coefficient of a Number left or right  */
2811/*                                                                    */
2812/*   This computes C = A << B or C = A >> -B  (in base ten).          */
2813/*                                                                    */
2814/*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)        */
2815/*   lhs is A                                                         */
2816/*   rhs is B, the number of digits to shift (-ve to right)           */
2817/*   set is the context                                               */
2818/*                                                                    */
2819/* The digits of the coefficient of A are shifted to the left (if B   */
2820/* is positive) or to the right (if B is negative) without adjusting  */
2821/* the exponent or the sign of A.                                     */
2822/*                                                                    */
2823/* B must be an integer (q=0) and in the range -set->digits through   */
2824/* +set->digits.                                                      */
2825/* C must have space for set->digits digits.                          */
2826/* NaNs are propagated as usual.  Infinities are unaffected (but      */
2827/* B must be valid).  No status is set unless B is invalid or an      */
2828/* operand is an sNaN.                                                */
2829/* ------------------------------------------------------------------ */
2830decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
2831                           const decNumber *rhs, decContext *set) {
2832  uInt status=0;              /* accumulator */
2833  Int  shift;                 /* rhs as an Int */
2834
2835  #if DECCHECK
2836  if (decCheckOperands(res, lhs, rhs, set)) return res;
2837  #endif
2838
2839  /* NaNs propagate as normal */
2840  if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2841    decNaNs(res, lhs, rhs, set, &status);
2842   /* rhs must be an integer */
2843   else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2844    status=DEC_Invalid_operation;
2845   else { /* both numeric, rhs is an integer */
2846    shift=decGetInt(rhs);                    /* [cannot fail] */
2847    if (shift==BADINT                        /* something bad .. */
2848     || shift==BIGODD || shift==BIGEVEN      /* .. very big .. */
2849     || abs(shift)>set->digits)              /* .. or out of range */
2850      status=DEC_Invalid_operation;
2851     else {                                  /* rhs is OK */
2852      decNumberCopy(res, lhs);
2853      if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
2854        if (shift>0) {                       /* to left */
2855          if (shift==set->digits) {          /* removing all */
2856            *res->lsu=0;                     /* so place 0 */
2857            res->digits=1;                   /* .. */
2858            }
2859           else {                            /* */
2860            /* first remove leading digits if necessary */
2861            if (res->digits+shift>set->digits) {
2862              decDecap(res, res->digits+shift-set->digits);
2863              /* that updated res->digits; may have gone to 1 (for a */
2864              /* single digit or for zero */
2865              }
2866            if (res->digits>1 || *res->lsu)  /* if non-zero.. */
2867              res->digits=decShiftToMost(res->lsu, res->digits, shift);
2868            } /* partial left */
2869          } /* left */
2870         else { /* to right */
2871          if (-shift>=res->digits) {         /* discarding all */
2872            *res->lsu=0;                     /* so place 0 */
2873            res->digits=1;                   /* .. */
2874            }
2875           else {
2876            decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2877            res->digits-=(-shift);
2878            }
2879          } /* to right */
2880        } /* non-0 non-Inf shift */
2881      } /* rhs OK */
2882    } /* numerics */
2883  if (status!=0) decStatus(res, status, set);
2884  return res;
2885  } /* decNumberShift */
2886
2887/* ------------------------------------------------------------------ */
2888/* decNumberSquareRoot -- square root operator                        */
2889/*                                                                    */
2890/*   This computes C = squareroot(A)                                  */
2891/*                                                                    */
2892/*   res is C, the result.  C may be A                                */
2893/*   rhs is A                                                         */
2894/*   set is the context; note that rounding mode has no effect        */
2895/*                                                                    */
2896/* C must have space for set->digits digits.                          */
2897/* ------------------------------------------------------------------ */
2898/* This uses the following varying-precision algorithm in:            */
2899/*                                                                    */
2900/*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
2901/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2902/*   pp229-237, ACM, September 1985.                                  */
2903/*                                                                    */
2904/* The square-root is calculated using Newton's method, after which   */
2905/* a check is made to ensure the result is correctly rounded.         */
2906/*                                                                    */
2907/* % [Reformatted original Numerical Turing source code follows.]     */
2908/* function sqrt(x : real) : real                                     */
2909/* % sqrt(x) returns the properly rounded approximation to the square */
2910/* % root of x, in the precision of the calling environment, or it    */
2911/* % fails if x < 0.                                                  */
2912/* % t e hull and a abrham, august, 1984                              */
2913/* if x <= 0 then                                                     */
2914/*   if x < 0 then                                                    */
2915/*     assert false                                                   */
2916/*   else                                                             */
2917/*     result 0                                                       */
2918/*   end if                                                           */
2919/* end if                                                             */
2920/* var f := setexp(x, 0)  % fraction part of x   [0.1 <= x < 1]       */
2921/* var e := getexp(x)     % exponent part of x                        */
2922/* var approx : real                                                  */
2923/* if e mod 2 = 0  then                                               */
2924/*   approx := .259 + .819 * f   % approx to root of f                */
2925/* else                                                               */
2926/*   f := f/l0                   % adjustments                        */
2927/*   e := e + 1                  %   for odd                          */
2928/*   approx := .0819 + 2.59 * f  %   exponent                         */
2929/* end if                                                             */
2930/*                                                                    */
2931/* var p:= 3                                                          */
2932/* const maxp := currentprecision + 2                                 */
2933/* loop                                                               */
2934/*   p := min(2*p - 2, maxp)     % p = 4,6,10, . . . , maxp           */
2935/*   precision p                                                      */
2936/*   approx := .5 * (approx + f/approx)                               */
2937/*   exit when p = maxp                                               */
2938/* end loop                                                           */
2939/*                                                                    */
2940/* % approx is now within 1 ulp of the properly rounded square root   */
2941/* % of f; to ensure proper rounding, compare squares of (approx -    */
2942/* % l/2 ulp) and (approx + l/2 ulp) with f.                          */
2943/* p := currentprecision                                              */
2944/* begin                                                              */
2945/*   precision p + 2                                                  */
2946/*   const approxsubhalf := approx - setexp(.5, -p)                   */
2947/*   if mulru(approxsubhalf, approxsubhalf) > f then                  */
2948/*     approx := approx - setexp(.l, -p + 1)                          */
2949/*   else                                                             */
2950/*     const approxaddhalf := approx + setexp(.5, -p)                 */
2951/*     if mulrd(approxaddhalf, approxaddhalf) < f then                */
2952/*       approx := approx + setexp(.l, -p + 1)                        */
2953/*     end if                                                         */
2954/*   end if                                                           */
2955/* end                                                                */
2956/* result setexp(approx, e div 2)  % fix exponent                     */
2957/* end sqrt                                                           */
2958/* ------------------------------------------------------------------ */
2959decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2960                                decContext *set) {
2961  decContext workset, approxset;   /* work contexts */
2962  decNumber dzero;                 /* used for constant zero */
2963  Int  maxp;                       /* largest working precision */
2964  Int  workp;                      /* working precision */
2965  Int  residue=0;                  /* rounding residue */
2966  uInt status=0, ignore=0;         /* status accumulators */
2967  uInt rstatus;                    /* .. */
2968  Int  exp;                        /* working exponent */
2969  Int  ideal;                      /* ideal (preferred) exponent */
2970  Int  needbytes;                  /* work */
2971  Int  dropped;                    /* .. */
2972
2973  #if DECSUBSET
2974  decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated */
2975  #endif
2976  /* buffer for f [needs +1 in case DECBUFFER 0] */
2977  decNumber buff[D2N(DECBUFFER+1)];
2978  /* buffer for a [needs +2 to match likely maxp] */
2979  decNumber bufa[D2N(DECBUFFER+2)];
2980  /* buffer for temporary, b [must be same size as a] */
2981  decNumber bufb[D2N(DECBUFFER+2)];
2982  decNumber *allocbuff=NULL;       /* -> allocated buff, iff allocated */
2983  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
2984  decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated */
2985  decNumber *f=buff;               /* reduced fraction */
2986  decNumber *a=bufa;               /* approximation to result */
2987  decNumber *b=bufb;               /* intermediate result */
2988  /* buffer for temporary variable, up to 3 digits */
2989  decNumber buft[D2N(3)];
2990  decNumber *t=buft;               /* up-to-3-digit constant or work */
2991
2992  #if DECCHECK
2993  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2994  #endif
2995
2996  do {                             /* protect allocated storage */
2997    #if DECSUBSET
2998    if (!set->extended) {
2999      /* reduce operand and set lostDigits status, as needed */
3000      if (rhs->digits>set->digits) {
3001        allocrhs=decRoundOperand(rhs, set, &status);
3002        if (allocrhs==NULL) break;
3003        /* [Note: 'f' allocation below could reuse this buffer if */
3004        /* used, but as this is rare they are kept separate for clarity.] */
3005        rhs=allocrhs;
3006        }
3007      }
3008    #endif
3009    /* [following code does not require input rounding] */
3010
3011    /* handle infinities and NaNs */
3012    if (SPECIALARG) {
3013      if (decNumberIsInfinite(rhs)) {         /* an infinity */
3014        if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
3015         else decNumberCopy(res, rhs);        /* +Infinity */
3016        }
3017       else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3018      break;
3019      }
3020
3021    /* calculate the ideal (preferred) exponent [floor(exp/2)] */
3022    /* [We would like to write: ideal=rhs->exponent>>1, but this */
3023    /* generates a compiler warning.  Generated code is the same.] */
3024    ideal=(rhs->exponent&~1)/2;         /* target */
3025
3026    /* handle zeros */
3027    if (ISZERO(rhs)) {
3028      decNumberCopy(res, rhs);          /* could be 0 or -0 */
3029      res->exponent=ideal;              /* use the ideal [safe] */
3030      /* use decFinish to clamp any out-of-range exponent, etc. */
3031      decFinish(res, set, &residue, &status);
3032      break;
3033      }
3034
3035    /* any other -x is an oops */
3036    if (decNumberIsNegative(rhs)) {
3037      status|=DEC_Invalid_operation;
3038      break;
3039      }
3040
3041    /* space is needed for three working variables */
3042    /*   f -- the same precision as the RHS, reduced to 0.01->0.99... */
3043    /*   a -- Hull's approximation -- precision, when assigned, is */
3044    /*        currentprecision+1 or the input argument precision, */
3045    /*        whichever is larger (+2 for use as temporary) */
3046    /*   b -- intermediate temporary result (same size as a) */
3047    /* if any is too long for local storage, then allocate */
3048    workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
3049    maxp=workp+2;                            /* largest working precision */
3050
3051    needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
3052    if (needbytes>(Int)sizeof(buff)) {
3053      allocbuff=(decNumber *)malloc(needbytes);
3054      if (allocbuff==NULL) {  /* hopeless -- abandon */
3055        status|=DEC_Insufficient_storage;
3056        break;}
3057      f=allocbuff;            /* use the allocated space */
3058      }
3059    /* a and b both need to be able to hold a maxp-length number */
3060    needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
3061    if (needbytes>(Int)sizeof(bufa)) {            /* [same applies to b] */
3062      allocbufa=(decNumber *)malloc(needbytes);
3063      allocbufb=(decNumber *)malloc(needbytes);
3064      if (allocbufa==NULL || allocbufb==NULL) {   /* hopeless */
3065        status|=DEC_Insufficient_storage;
3066        break;}
3067      a=allocbufa;            /* use the allocated spaces */
3068      b=allocbufb;            /* .. */
3069      }
3070
3071    /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
3072    decNumberCopy(f, rhs);
3073    exp=f->exponent+f->digits;               /* adjusted to Hull rules */
3074    f->exponent=-(f->digits);                /* to range */
3075
3076    /* set up working context */
3077    decContextDefault(&workset, DEC_INIT_DECIMAL64);
3078
3079    /* [Until further notice, no error is possible and status bits */
3080    /* (Rounded, etc.) should be ignored, not accumulated.] */
3081
3082    /* Calculate initial approximation, and allow for odd exponent */
3083    workset.digits=workp;                    /* p for initial calculation */
3084    t->bits=0; t->digits=3;
3085    a->bits=0; a->digits=3;
3086    if ((exp & 1)==0) {                      /* even exponent */
3087      /* Set t=0.259, a=0.819 */
3088      t->exponent=-3;
3089      a->exponent=-3;
3090      #if DECDPUN>=3
3091        t->lsu[0]=259;
3092        a->lsu[0]=819;
3093      #elif DECDPUN==2
3094        t->lsu[0]=59; t->lsu[1]=2;
3095        a->lsu[0]=19; a->lsu[1]=8;
3096      #else
3097        t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
3098        a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
3099      #endif
3100      }
3101     else {                                  /* odd exponent */
3102      /* Set t=0.0819, a=2.59 */
3103      f->exponent--;                         /* f=f/10 */
3104      exp++;                                 /* e=e+1 */
3105      t->exponent=-4;
3106      a->exponent=-2;
3107      #if DECDPUN>=3
3108        t->lsu[0]=819;
3109        a->lsu[0]=259;
3110      #elif DECDPUN==2
3111        t->lsu[0]=19; t->lsu[1]=8;
3112        a->lsu[0]=59; a->lsu[1]=2;
3113      #else
3114        t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
3115        a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
3116      #endif
3117      }
3118    decMultiplyOp(a, a, f, &workset, &ignore);    /* a=a*f */
3119    decAddOp(a, a, t, &workset, 0, &ignore);      /* ..+t */
3120    /* [a is now the initial approximation for sqrt(f), calculated with */
3121    /* currentprecision, which is also a's precision.] */
3122
3123    /* the main calculation loop */
3124    decNumberZero(&dzero);                   /* make 0 */
3125    decNumberZero(t);                        /* set t = 0.5 */
3126    t->lsu[0]=5;                             /* .. */
3127    t->exponent=-1;                          /* .. */
3128    workset.digits=3;                        /* initial p */
3129    for (;;) {
3130      /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
3131      workset.digits=workset.digits*2-2;
3132      if (workset.digits>maxp) workset.digits=maxp;
3133      /* a = 0.5 * (a + f/a) */
3134      /* [calculated at p then rounded to currentprecision] */
3135      decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
3136      decAddOp(b, b, a, &workset, 0, &ignore);    /* b=b+a */
3137      decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
3138      if (a->digits==maxp) break;            /* have required digits */
3139      } /* loop */
3140
3141    /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
3142    /* now reduce to length, etc.; this needs to be done with a */
3143    /* having the correct exponent so as to handle subnormals */
3144    /* correctly */
3145    approxset=*set;                          /* get emin, emax, etc. */
3146    approxset.round=DEC_ROUND_HALF_EVEN;
3147    a->exponent+=exp/2;                      /* set correct exponent */
3148
3149    rstatus=0;                               /* clear status */
3150    residue=0;                               /* .. and accumulator */
3151    decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
3152    decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
3153
3154    /* Overflow was possible if the input exponent was out-of-range, */
3155    /* in which case quit */
3156    if (rstatus&DEC_Overflow) {
3157      status=rstatus;                        /* use the status as-is */
3158      decNumberCopy(res, a);                 /* copy to result */
3159      break;
3160      }
3161
3162    /* Preserve status except Inexact/Rounded */
3163    status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
3164
3165    /* Carry out the Hull correction */
3166    a->exponent-=exp/2;                      /* back to 0.1->1 */
3167
3168    /* a is now at final precision and within 1 ulp of the properly */
3169    /* rounded square root of f; to ensure proper rounding, compare */
3170    /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3171    /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3172    /* the ulp */
3173    workset.digits--;                             /* maxp-1 is OK now */
3174    t->exponent=-a->digits-1;                     /* make 0.5 ulp */
3175    decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
3176    workset.round=DEC_ROUND_UP;
3177    decMultiplyOp(b, b, b, &workset, &ignore);    /* b = mulru(b, b) */
3178    decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
3179    if (decNumberIsNegative(b)) {                 /* f < b [i.e., b > f] */
3180      /* this is the more common adjustment, though both are rare */
3181      t->exponent++;                              /* make 1.0 ulp */
3182      t->lsu[0]=1;                                /* .. */
3183      decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
3184      /* assign to approx [round to length] */
3185      approxset.emin-=exp/2;                      /* adjust to match a */
3186      approxset.emax-=exp/2;
3187      decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3188      }
3189     else {
3190      decAddOp(b, a, t, &workset, 0, &ignore);    /* b = a + 0.5 ulp */
3191      workset.round=DEC_ROUND_DOWN;
3192      decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
3193      decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
3194      if (decNumberIsNegative(b)) {               /* b < f */
3195        t->exponent++;                            /* make 1.0 ulp */
3196        t->lsu[0]=1;                              /* .. */
3197        decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
3198        /* assign to approx [round to length] */
3199        approxset.emin-=exp/2;                    /* adjust to match a */
3200        approxset.emax-=exp/2;
3201        decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3202        }
3203      }
3204    /* [no errors are possible in the above, and rounding/inexact during */
3205    /* estimation are irrelevant, so status was not accumulated] */
3206
3207    /* Here, 0.1 <= a < 1  (still), so adjust back */
3208    a->exponent+=exp/2;                      /* set correct exponent */
3209
3210    /* count droppable zeros [after any subnormal rounding] by */
3211    /* trimming a copy */
3212    decNumberCopy(b, a);
3213    decTrim(b, set, 1, &dropped);            /* [drops trailing zeros] */
3214
3215    /* Set Inexact and Rounded.  The answer can only be exact if */
3216    /* it is short enough so that squaring it could fit in workp digits, */
3217    /* and it cannot have trailing zeros due to clamping, so these are */
3218    /* the only (relatively rare) conditions a careful check is needed */
3219    if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
3220      status|=DEC_Inexact|DEC_Rounded;
3221      }
3222     else {                                  /* could be exact/unrounded */
3223      uInt mstatus=0;                        /* local status */
3224      decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
3225      if (mstatus&DEC_Overflow) {            /* result just won't fit */
3226        status|=DEC_Inexact|DEC_Rounded;
3227        }
3228       else {                                /* plausible */
3229        decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
3230        if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
3231         else {                              /* is Exact */
3232          /* here, dropped is the count of trailing zeros in 'a' */
3233          /* use closest exponent to ideal... */
3234          Int todrop=ideal-a->exponent;      /* most that can be dropped */
3235          if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
3236           else {                            /* unrounded */
3237            if (dropped<todrop) {            /* clamp to those available */
3238              todrop=dropped;
3239              status|=DEC_Clamped;
3240              }
3241            if (todrop>0) {                  /* have some to drop */
3242              decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3243              a->exponent+=todrop;           /* maintain numerical value */
3244              a->digits-=todrop;             /* new length */
3245              }
3246            }
3247          }
3248        }
3249      }
3250
3251    /* double-check Underflow, as perhaps the result could not have */
3252    /* been subnormal (initial argument too big), or it is now Exact */
3253    if (status&DEC_Underflow) {
3254      Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
3255      /* check if truly subnormal */
3256      #if DECEXTFLAG                         /* DEC_Subnormal too */
3257        if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3258      #else
3259        if (ae>=set->emin*2) status&=~DEC_Underflow;
3260      #endif
3261      /* check if truly inexact */
3262      if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3263      }
3264
3265    decNumberCopy(res, a);                   /* a is now the result */
3266    } while(0);                              /* end protected */
3267
3268  if (allocbuff!=NULL) free(allocbuff);      /* drop any storage used */
3269  if (allocbufa!=NULL) free(allocbufa);      /* .. */
3270  if (allocbufb!=NULL) free(allocbufb);      /* .. */
3271  #if DECSUBSET
3272  if (allocrhs !=NULL) free(allocrhs);       /* .. */
3273  #endif
3274  if (status!=0) decStatus(res, status, set);/* then report status */
3275  #if DECCHECK
3276  decCheckInexact(res, set);
3277  #endif
3278  return res;
3279  } /* decNumberSquareRoot */
3280
3281/* ------------------------------------------------------------------ */
3282/* decNumberSubtract -- subtract two Numbers                          */
3283/*                                                                    */
3284/*   This computes C = A - B                                          */
3285/*                                                                    */
3286/*   res is C, the result.  C may be A and/or B (e.g., X=X-X)         */
3287/*   lhs is A                                                         */
3288/*   rhs is B                                                         */
3289/*   set is the context                                               */
3290/*                                                                    */
3291/* C must have space for set->digits digits.                          */
3292/* ------------------------------------------------------------------ */
3293decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
3294                              const decNumber *rhs, decContext *set) {
3295  uInt status=0;                        /* accumulator */
3296
3297  decAddOp(res, lhs, rhs, set, DECNEG, &status);
3298  if (status!=0) decStatus(res, status, set);
3299  #if DECCHECK
3300  decCheckInexact(res, set);
3301  #endif
3302  return res;
3303  } /* decNumberSubtract */
3304
3305/* ------------------------------------------------------------------ */
3306/* decNumberToIntegralExact -- round-to-integral-value with InExact   */
3307/* decNumberToIntegralValue -- round-to-integral-value                */
3308/*                                                                    */
3309/*   res is the result                                                */
3310/*   rhs is input number                                              */
3311/*   set is the context                                               */
3312/*                                                                    */
3313/* res must have space for any value of rhs.                          */
3314/*                                                                    */
3315/* This implements the IEEE special operators and therefore treats    */
3316/* special values as valid.  For finite numbers it returns            */
3317/* rescale(rhs, 0) if rhs->exponent is <0.                            */
3318/* Otherwise the result is rhs (so no error is possible, except for   */
3319/* sNaN).                                                             */
3320/*                                                                    */
3321/* The context is used for rounding mode and status after sNaN, but   */
3322/* the digits setting is ignored.  The Exact version will signal      */
3323/* Inexact if the result differs numerically from rhs; the other      */
3324/* never signals Inexact.                                             */
3325/* ------------------------------------------------------------------ */
3326decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3327                                     decContext *set) {
3328  decNumber dn;
3329  decContext workset;              /* working context */
3330  uInt status=0;                   /* accumulator */
3331
3332  #if DECCHECK
3333  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3334  #endif
3335
3336  /* handle infinities and NaNs */
3337  if (SPECIALARG) {
3338    if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
3339     else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3340    }
3341   else { /* finite */
3342    /* have a finite number; no error possible (res must be big enough) */
3343    if (rhs->exponent>=0) return decNumberCopy(res, rhs);
3344    /* that was easy, but if negative exponent there is work to do... */
3345    workset=*set;                  /* clone rounding, etc. */
3346    workset.digits=rhs->digits;    /* no length rounding */
3347    workset.traps=0;               /* no traps */
3348    decNumberZero(&dn);            /* make a number with exponent 0 */
3349    decNumberQuantize(res, rhs, &dn, &workset);
3350    status|=workset.status;
3351    }
3352  if (status!=0) decStatus(res, status, set);
3353  return res;
3354  } /* decNumberToIntegralExact */
3355
3356decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3357                                     decContext *set) {
3358  decContext workset=*set;         /* working context */
3359  workset.traps=0;                 /* no traps */
3360  decNumberToIntegralExact(res, rhs, &workset);
3361  /* this never affects set, except for sNaNs; NaN will have been set */
3362  /* or propagated already, so no need to call decStatus */
3363  set->status|=workset.status&DEC_Invalid_operation;
3364  return res;
3365  } /* decNumberToIntegralValue */
3366
3367/* ------------------------------------------------------------------ */
3368/* decNumberXor -- XOR two Numbers, digitwise                         */
3369/*                                                                    */
3370/*   This computes C = A ^ B                                          */
3371/*                                                                    */
3372/*   res is C, the result.  C may be A and/or B (e.g., X=X^X)         */
3373/*   lhs is A                                                         */
3374/*   rhs is B                                                         */
3375/*   set is the context (used for result length and error report)     */
3376/*                                                                    */
3377/* C must have space for set->digits digits.                          */
3378/*                                                                    */
3379/* Logical function restrictions apply (see above); a NaN is          */
3380/* returned with Invalid_operation if a restriction is violated.      */
3381/* ------------------------------------------------------------------ */
3382decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
3383                         const decNumber *rhs, decContext *set) {
3384  const Unit *ua, *ub;                  /* -> operands */
3385  const Unit *msua, *msub;              /* -> operand msus */
3386  Unit  *uc, *msuc;                     /* -> result and its msu */
3387  Int   msudigs;                        /* digits in res msu */
3388  #if DECCHECK
3389  if (decCheckOperands(res, lhs, rhs, set)) return res;
3390  #endif
3391
3392  if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3393   || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3394    decStatus(res, DEC_Invalid_operation, set);
3395    return res;
3396    }
3397  /* operands are valid */
3398  ua=lhs->lsu;                          /* bottom-up */
3399  ub=rhs->lsu;                          /* .. */
3400  uc=res->lsu;                          /* .. */
3401  msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs */
3402  msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs */
3403  msuc=uc+D2U(set->digits)-1;           /* -> msu of result */
3404  msudigs=MSUDIGITS(set->digits);       /* [faster than remainder] */
3405  for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop */
3406    Unit a, b;                          /* extract units */
3407    if (ua>msua) a=0;
3408     else a=*ua;
3409    if (ub>msub) b=0;
3410     else b=*ub;
3411    *uc=0;                              /* can now write back */
3412    if (a|b) {                          /* maybe 1 bits to examine */
3413      Int i, j;
3414      /* This loop could be unrolled and/or use BIN2BCD tables */
3415      for (i=0; i<DECDPUN; i++) {
3416        if ((a^b)&1) *uc=*uc+(Unit)powers[i];     /* effect XOR */
3417        j=a%10;
3418        a=a/10;
3419        j|=b%10;
3420        b=b/10;
3421        if (j>1) {
3422          decStatus(res, DEC_Invalid_operation, set);
3423          return res;
3424          }
3425        if (uc==msuc && i==msudigs-1) break;      /* just did final digit */
3426        } /* each digit */
3427      } /* non-zero */
3428    } /* each unit */
3429  /* [here uc-1 is the msu of the result] */
3430  res->digits=decGetDigits(res->lsu, uc-res->lsu);
3431  res->exponent=0;                      /* integer */
3432  res->bits=0;                          /* sign=0 */
3433  return res;  /* [no status to set] */
3434  } /* decNumberXor */
3435
3436
3437/* ================================================================== */
3438/* Utility routines                                                   */
3439/* ================================================================== */
3440
3441/* ------------------------------------------------------------------ */
3442/* decNumberClass -- return the decClass of a decNumber               */
3443/*   dn -- the decNumber to test                                      */
3444/*   set -- the context to use for Emin                               */
3445/*   returns the decClass enum                                        */
3446/* ------------------------------------------------------------------ */
3447enum decClass decNumberClass(const decNumber *dn, decContext *set) {
3448  if (decNumberIsSpecial(dn)) {
3449    if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3450    if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3451    /* must be an infinity */
3452    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3453    return DEC_CLASS_POS_INF;
3454    }
3455  /* is finite */
3456  if (decNumberIsNormal(dn, set)) { /* most common */
3457    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3458    return DEC_CLASS_POS_NORMAL;
3459    }
3460  /* is subnormal or zero */
3461  if (decNumberIsZero(dn)) {    /* most common */
3462    if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3463    return DEC_CLASS_POS_ZERO;
3464    }
3465  if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3466  return DEC_CLASS_POS_SUBNORMAL;
3467  } /* decNumberClass */
3468
3469/* ------------------------------------------------------------------ */
3470/* decNumberClassToString -- convert decClass to a string             */
3471/*                                                                    */
3472/*  eclass is a valid decClass                                        */
3473/*  returns a constant string describing the class (max 13+1 chars)   */
3474/* ------------------------------------------------------------------ */
3475const char *decNumberClassToString(enum decClass eclass) {
3476  if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
3477  if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
3478  if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
3479  if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
3480  if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3481  if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3482  if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
3483  if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
3484  if (eclass==DEC_CLASS_QNAN)          return DEC_ClassString_QN;
3485  if (eclass==DEC_CLASS_SNAN)          return DEC_ClassString_SN;
3486  return DEC_ClassString_UN;           /* Unknown */
3487  } /* decNumberClassToString */
3488
3489/* ------------------------------------------------------------------ */
3490/* decNumberCopy -- copy a number                                     */
3491/*                                                                    */
3492/*   dest is the target decNumber                                     */
3493/*   src  is the source decNumber                                     */
3494/*   returns dest                                                     */
3495/*                                                                    */
3496/* (dest==src is allowed and is a no-op)                              */
3497/* All fields are updated as required.  This is a utility operation,  */
3498/* so special values are unchanged and no error is possible.          */
3499/* ------------------------------------------------------------------ */
3500decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
3501
3502  #if DECCHECK
3503  if (src==NULL) return decNumberZero(dest);
3504  #endif
3505
3506  if (dest==src) return dest;                /* no copy required */
3507
3508  /* Use explicit assignments here as structure assignment could copy */
3509  /* more than just the lsu (for small DECDPUN).  This would not affect */
3510  /* the value of the results, but could disturb test harness spill */
3511  /* checking. */
3512  dest->bits=src->bits;
3513  dest->exponent=src->exponent;
3514  dest->digits=src->digits;
3515  dest->lsu[0]=src->lsu[0];
3516  if (src->digits>DECDPUN) {                 /* more Units to come */
3517    const Unit *smsup, *s;                   /* work */
3518    Unit  *d;                                /* .. */
3519    /* memcpy for the remaining Units would be safe as they cannot */
3520    /* overlap.  However, this explicit loop is faster in short cases. */
3521    d=dest->lsu+1;                           /* -> first destination */
3522    smsup=src->lsu+D2U(src->digits);         /* -> source msu+1 */
3523    for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3524    }
3525  return dest;
3526  } /* decNumberCopy */
3527
3528/* ------------------------------------------------------------------ */
3529/* decNumberCopyAbs -- quiet absolute value operator                  */
3530/*                                                                    */
3531/*   This sets C = abs(A)                                             */
3532/*                                                                    */
3533/*   res is C, the result.  C may be A                                */
3534/*   rhs is A                                                         */
3535/*                                                                    */
3536/* C must have space for set->digits digits.                          */
3537/* No exception or error can occur; this is a quiet bitwise operation.*/
3538/* See also decNumberAbs for a checking version of this.              */
3539/* ------------------------------------------------------------------ */
3540decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3541  #if DECCHECK
3542  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3543  #endif
3544  decNumberCopy(res, rhs);
3545  res->bits&=~DECNEG;                   /* turn off sign */
3546  return res;
3547  } /* decNumberCopyAbs */
3548
3549/* ------------------------------------------------------------------ */
3550/* decNumberCopyNegate -- quiet negate value operator                 */
3551/*                                                                    */
3552/*   This sets C = negate(A)                                          */
3553/*                                                                    */
3554/*   res is C, the result.  C may be A                                */
3555/*   rhs is A                                                         */
3556/*                                                                    */
3557/* C must have space for set->digits digits.                          */
3558/* No exception or error can occur; this is a quiet bitwise operation.*/
3559/* See also decNumberMinus for a checking version of this.            */
3560/* ------------------------------------------------------------------ */
3561decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3562  #if DECCHECK
3563  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3564  #endif
3565  decNumberCopy(res, rhs);
3566  res->bits^=DECNEG;                    /* invert the sign */
3567  return res;
3568  } /* decNumberCopyNegate */
3569
3570/* ------------------------------------------------------------------ */
3571/* decNumberCopySign -- quiet copy and set sign operator              */
3572/*                                                                    */
3573/*   This sets C = A with the sign of B                               */
3574/*                                                                    */
3575/*   res is C, the result.  C may be A                                */
3576/*   lhs is A                                                         */
3577/*   rhs is B                                                         */
3578/*                                                                    */
3579/* C must have space for set->digits digits.                          */
3580/* No exception or error can occur; this is a quiet bitwise operation.*/
3581/* ------------------------------------------------------------------ */
3582decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
3583                              const decNumber *rhs) {
3584  uByte sign;                           /* rhs sign */
3585  #if DECCHECK
3586  if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3587  #endif
3588  sign=rhs->bits & DECNEG;              /* save sign bit */
3589  decNumberCopy(res, lhs);
3590  res->bits&=~DECNEG;                   /* clear the sign */
3591  res->bits|=sign;                      /* set from rhs */
3592  return res;
3593  } /* decNumberCopySign */
3594
3595/* ------------------------------------------------------------------ */
3596/* decNumberGetBCD -- get the coefficient in BCD8                     */
3597/*   dn is the source decNumber                                       */
3598/*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
3599/*     most-significant at offset 0                                   */
3600/*   returns bcd                                                      */
3601/*                                                                    */
3602/* bcd must have at least dn->digits bytes.  No error is possible; if */
3603/* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
3604/* ------------------------------------------------------------------ */
3605uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
3606  uByte *ub=bcd+dn->digits-1;      /* -> lsd */
3607  const Unit *up=dn->lsu;          /* Unit pointer, -> lsu */
3608
3609  #if DECDPUN==1                   /* trivial simple copy */
3610    for (; ub>=bcd; ub--, up++) *ub=*up;
3611  #else                            /* chopping needed */
3612    uInt u=*up;                    /* work */
3613    uInt cut=DECDPUN;              /* downcounter through unit */
3614    for (; ub>=bcd; ub--) {
3615      *ub=(uByte)(u%10);           /* [*6554 trick inhibits, here] */
3616      u=u/10;
3617      cut--;
3618      if (cut>0) continue;         /* more in this unit */
3619      up++;
3620      u=*up;
3621      cut=DECDPUN;
3622      }
3623  #endif
3624  return bcd;
3625  } /* decNumberGetBCD */
3626
3627/* ------------------------------------------------------------------ */
3628/* decNumberSetBCD -- set (replace) the coefficient from BCD8         */
3629/*   dn is the target decNumber                                       */
3630/*   bcd is the uInt array that will source n BCD bytes, most-        */
3631/*     significant at offset 0                                        */
3632/*   n is the number of digits in the source BCD array (bcd)          */
3633/*   returns dn                                                       */
3634/*                                                                    */
3635/* dn must have space for at least n digits.  No error is possible;   */
3636/* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
3637/* and bcd[0] zero.                                                   */
3638/* ------------------------------------------------------------------ */
3639decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3640  Unit *up = dn->lsu + D2U(n) - 1;      /* -> msu [target pointer] */
3641  const uByte *ub=bcd;                  /* -> source msd */
3642
3643  #if DECDPUN==1                        /* trivial simple copy */
3644    for (; ub<bcd+n; ub++, up--) *up=*ub;
3645  #else                                 /* some assembly needed */
3646    /* calculate how many digits in msu, and hence first cut */
3647    Int cut=MSUDIGITS(n);               /* [faster than remainder] */
3648    for (;up>=dn->lsu; up--) {          /* each Unit from msu */
3649      *up=0;                            /* will take <=DECDPUN digits */
3650      for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3651      cut=DECDPUN;                      /* next Unit has all digits */
3652      }
3653  #endif
3654  dn->digits=n;                         /* set digit count */
3655  return dn;
3656  } /* decNumberSetBCD */
3657
3658/* ------------------------------------------------------------------ */
3659/* decNumberIsNormal -- test normality of a decNumber                 */
3660/*   dn is the decNumber to test                                      */
3661/*   set is the context to use for Emin                               */
3662/*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise              */
3663/* ------------------------------------------------------------------ */
3664Int decNumberIsNormal(const decNumber *dn, decContext *set) {
3665  Int ae;                               /* adjusted exponent */
3666  #if DECCHECK
3667  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3668  #endif
3669
3670  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3671  if (decNumberIsZero(dn)) return 0;    /* not non-zero */
3672
3673  ae=dn->exponent+dn->digits-1;         /* adjusted exponent */
3674  if (ae<set->emin) return 0;           /* is subnormal */
3675  return 1;
3676  } /* decNumberIsNormal */
3677
3678/* ------------------------------------------------------------------ */
3679/* decNumberIsSubnormal -- test subnormality of a decNumber           */
3680/*   dn is the decNumber to test                                      */
3681/*   set is the context to use for Emin                               */
3682/*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
3683/* ------------------------------------------------------------------ */
3684Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3685  Int ae;                               /* adjusted exponent */
3686  #if DECCHECK
3687  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3688  #endif
3689
3690  if (decNumberIsSpecial(dn)) return 0; /* not finite */
3691  if (decNumberIsZero(dn)) return 0;    /* not non-zero */
3692
3693  ae=dn->exponent+dn->digits-1;         /* adjusted exponent */
3694  if (ae<set->emin) return 1;           /* is subnormal */
3695  return 0;
3696  } /* decNumberIsSubnormal */
3697
3698/* ------------------------------------------------------------------ */
3699/* decNumberTrim -- remove insignificant zeros                        */
3700/*                                                                    */
3701/*   dn is the number to trim                                         */
3702/*   returns dn                                                       */
3703/*                                                                    */
3704/* All fields are updated as required.  This is a utility operation,  */
3705/* so special values are unchanged and no error is possible.          */
3706/* ------------------------------------------------------------------ */
3707decNumber * decNumberTrim(decNumber *dn) {
3708  Int  dropped;                    /* work */
3709  decContext set;                  /* .. */
3710  #if DECCHECK
3711  if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3712  #endif
3713  decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
3714  return decTrim(dn, &set, 0, &dropped);
3715  } /* decNumberTrim */
3716
3717/* ------------------------------------------------------------------ */
3718/* decNumberVersion -- return the name and version of this module     */
3719/*                                                                    */
3720/* No error is possible.                                              */
3721/* ------------------------------------------------------------------ */
3722const char * decNumberVersion(void) {
3723  return DECVERSION;
3724  } /* decNumberVersion */
3725
3726/* ------------------------------------------------------------------ */
3727/* decNumberZero -- set a number to 0                                 */
3728/*                                                                    */
3729/*   dn is the number to set, with space for one digit                */
3730/*   returns dn                                                       */
3731/*                                                                    */
3732/* No error is possible.                                              */
3733/* ------------------------------------------------------------------ */
3734/* Memset is not used as it is much slower in some environments. */
3735decNumber * decNumberZero(decNumber *dn) {
3736
3737  #if DECCHECK
3738  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3739  #endif
3740
3741  dn->bits=0;
3742  dn->exponent=0;
3743  dn->digits=1;
3744  dn->lsu[0]=0;
3745  return dn;
3746  } /* decNumberZero */
3747
3748/* ================================================================== */
3749/* Local routines                                                     */
3750/* ================================================================== */
3751
3752/* ------------------------------------------------------------------ */
3753/* decToString -- lay out a number into a string                      */
3754/*                                                                    */
3755/*   dn     is the number to lay out                                  */
3756/*   string is where to lay out the number                            */
3757/*   eng    is 1 if Engineering, 0 if Scientific                      */
3758/*                                                                    */
3759/* string must be at least dn->digits+14 characters long              */
3760/* No error is possible.                                              */
3761/*                                                                    */
3762/* Note that this routine can generate a -0 or 0.000.  These are      */
3763/* never generated in subset to-number or arithmetic, but can occur   */
3764/* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).              */
3765/* ------------------------------------------------------------------ */
3766/* If DECCHECK is enabled the string "?" is returned if a number is */
3767/* invalid. */
3768static void decToString(const decNumber *dn, char *string, Flag eng) {
3769  Int exp=dn->exponent;       /* local copy */
3770  Int e;                      /* E-part value */
3771  Int pre;                    /* digits before the '.' */
3772  Int cut;                    /* for counting digits in a Unit */
3773  char *c=string;             /* work [output pointer] */
3774  const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
3775  uInt u, pow;                /* work */
3776
3777  #if DECCHECK
3778  if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3779    strcpy(string, "?");
3780    return;}
3781  #endif
3782
3783  if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
3784    *c='-';
3785    c++;
3786    }
3787  if (dn->bits&DECSPECIAL) {       /* Is a special value */
3788    if (decNumberIsInfinite(dn)) {
3789      strcpy(c,   "Inf");
3790      strcpy(c+3, "inity");
3791      return;}
3792    /* a NaN */
3793    if (dn->bits&DECSNAN) {        /* signalling NaN */
3794      *c='s';
3795      c++;
3796      }
3797    strcpy(c, "NaN");
3798    c+=3;                          /* step past */
3799    /* if not a clean non-zero coefficient, that's all there is in a */
3800    /* NaN string */
3801    if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3802    /* [drop through to add integer] */
3803    }
3804
3805  /* calculate how many digits in msu, and hence first cut */
3806  cut=MSUDIGITS(dn->digits);       /* [faster than remainder] */
3807  cut--;                           /* power of ten for digit */
3808
3809  if (exp==0) {                    /* simple integer [common fastpath] */
3810    for (;up>=dn->lsu; up--) {     /* each Unit from msu */
3811      u=*up;                       /* contains DECDPUN digits to lay out */
3812      for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3813      cut=DECDPUN-1;               /* next Unit has all digits */
3814      }
3815    *c='\0';                       /* terminate the string */
3816    return;}
3817
3818  /* non-0 exponent -- assume plain form */
3819  pre=dn->digits+exp;              /* digits before '.' */
3820  e=0;                             /* no E */
3821  if ((exp>0) || (pre<-5)) {       /* need exponential form */
3822    e=exp+dn->digits-1;            /* calculate E value */
3823    pre=1;                         /* assume one digit before '.' */
3824    if (eng && (e!=0)) {           /* engineering: may need to adjust */
3825      Int adj;                     /* adjustment */
3826      /* The C remainder operator is undefined for negative numbers, so */
3827      /* a positive remainder calculation must be used here */
3828      if (e<0) {
3829        adj=(-e)%3;
3830        if (adj!=0) adj=3-adj;
3831        }
3832       else { /* e>0 */
3833        adj=e%3;
3834        }
3835      e=e-adj;
3836      /* if dealing with zero still produce an exponent which is a */
3837      /* multiple of three, as expected, but there will only be the */
3838      /* one zero before the E, still.  Otherwise note the padding. */
3839      if (!ISZERO(dn)) pre+=adj;
3840       else {  /* is zero */
3841        if (adj!=0) {              /* 0.00Esnn needed */
3842          e=e+3;
3843          pre=-(2-adj);
3844          }
3845        } /* zero */
3846      } /* eng */
3847    } /* need exponent */
3848
3849  /* lay out the digits of the coefficient, adding 0s and . as needed */
3850  u=*up;
3851  if (pre>0) {                     /* xxx.xxx or xx00 (engineering) form */
3852    Int n=pre;
3853    for (; pre>0; pre--, c++, cut--) {
3854      if (cut<0) {                 /* need new Unit */
3855        if (up==dn->lsu) break;    /* out of input digits (pre>digits) */
3856        up--;
3857        cut=DECDPUN-1;
3858        u=*up;
3859        }
3860      TODIGIT(u, cut, c, pow);
3861      }
3862    if (n<dn->digits) {            /* more to come, after '.' */
3863      *c='.'; c++;
3864      for (;; c++, cut--) {
3865        if (cut<0) {               /* need new Unit */
3866          if (up==dn->lsu) break;  /* out of input digits */
3867          up--;
3868          cut=DECDPUN-1;
3869          u=*up;
3870          }
3871        TODIGIT(u, cut, c, pow);
3872        }
3873      }
3874     else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
3875    }
3876   else {                          /* 0.xxx or 0.000xxx form */
3877    *c='0'; c++;
3878    *c='.'; c++;
3879    for (; pre<0; pre++, c++) *c='0';   /* add any 0's after '.' */
3880    for (; ; c++, cut--) {
3881      if (cut<0) {                 /* need new Unit */
3882        if (up==dn->lsu) break;    /* out of input digits */
3883        up--;
3884        cut=DECDPUN-1;
3885        u=*up;
3886        }
3887      TODIGIT(u, cut, c, pow);
3888      }
3889    }
3890
3891  /* Finally add the E-part, if needed.  It will never be 0, has a
3892     base maximum and minimum of +999999999 through -999999999, but
3893     could range down to -1999999998 for anormal numbers */
3894  if (e!=0) {
3895    Flag had=0;               /* 1=had non-zero */
3896    *c='E'; c++;
3897    *c='+'; c++;              /* assume positive */
3898    u=e;                      /* .. */
3899    if (e<0) {
3900      *(c-1)='-';             /* oops, need - */
3901      u=-e;                   /* uInt, please */
3902      }
3903    /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3904    for (cut=9; cut>=0; cut--) {
3905      TODIGIT(u, cut, c, pow);
3906      if (*c=='0' && !had) continue;    /* skip leading zeros */
3907      had=1;                            /* had non-0 */
3908      c++;                              /* step for next */
3909      } /* cut */
3910    }
3911  *c='\0';          /* terminate the string (all paths) */
3912  return;
3913  } /* decToString */
3914
3915/* ------------------------------------------------------------------ */
3916/* decAddOp -- add/subtract operation                                 */
3917/*                                                                    */
3918/*   This computes C = A + B                                          */
3919/*                                                                    */
3920/*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
3921/*   lhs is A                                                         */
3922/*   rhs is B                                                         */
3923/*   set is the context                                               */
3924/*   negate is DECNEG if rhs should be negated, or 0 otherwise        */
3925/*   status accumulates status for the caller                         */
3926/*                                                                    */
3927/* C must have space for set->digits digits.                          */
3928/* Inexact in status must be 0 for correct Exact zero sign in result  */
3929/* ------------------------------------------------------------------ */
3930/* If possible, the coefficient is calculated directly into C.        */
3931/* However, if:                                                       */
3932/*   -- a digits+1 calculation is needed because the numbers are      */
3933/*      unaligned and span more than set->digits digits               */
3934/*   -- a carry to digits+1 digits looks possible                     */
3935/*   -- C is the same as A or B, and the result would destructively   */
3936/*      overlap the A or B coefficient                                */
3937/* then the result must be calculated into a temporary buffer.  In    */
3938/* this case a local (stack) buffer is used if possible, and only if  */
3939/* too long for that does malloc become the final resort.             */
3940/*                                                                    */
3941/* Misalignment is handled as follows:                                */
3942/*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
3943/*   BPad: Apply the padding by a combination of shifting (whole      */
3944/*         units) and multiplication (part units).                    */
3945/*                                                                    */
3946/* Addition, especially x=x+1, is speed-critical.                     */
3947/* The static buffer is larger than might be expected to allow for    */
3948/* calls from higher-level functions (notably exp).                   */
3949/* ------------------------------------------------------------------ */
3950static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3951                            const decNumber *rhs, decContext *set,
3952                            uByte negate, uInt *status) {
3953  #if DECSUBSET
3954  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
3955  decNumber *allocrhs=NULL;        /* .., rhs */
3956  #endif
3957  Int   rhsshift;                  /* working shift (in Units) */
3958  Int   maxdigits;                 /* longest logical length */
3959  Int   mult;                      /* multiplier */
3960  Int   residue;                   /* rounding accumulator */
3961  uByte bits;                      /* result bits */
3962  Flag  diffsign;                  /* non-0 if arguments have different sign */
3963  Unit  *acc;                      /* accumulator for result */
3964  Unit  accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
3965                                   /* allocations when called from */
3966                                   /* other operations, notable exp] */
3967  Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated */
3968  Int   reqdigits=set->digits;     /* local copy; requested DIGITS */
3969  Int   padding;                   /* work */
3970
3971  #if DECCHECK
3972  if (decCheckOperands(res, lhs, rhs, set)) return res;
3973  #endif
3974
3975  do {                             /* protect allocated storage */
3976    #if DECSUBSET
3977    if (!set->extended) {
3978      /* reduce operands and set lostDigits status, as needed */
3979      if (lhs->digits>reqdigits) {
3980        alloclhs=decRoundOperand(lhs, set, status);
3981        if (alloclhs==NULL) break;
3982        lhs=alloclhs;
3983        }
3984      if (rhs->digits>reqdigits) {
3985        allocrhs=decRoundOperand(rhs, set, status);
3986        if (allocrhs==NULL) break;
3987        rhs=allocrhs;
3988        }
3989      }
3990    #endif
3991    /* [following code does not require input rounding] */
3992
3993    /* note whether signs differ [used all paths] */
3994    diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3995
3996    /* handle infinities and NaNs */
3997    if (SPECIALARGS) {                  /* a special bit set */
3998      if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
3999        decNaNs(res, lhs, rhs, set, status);
4000       else { /* one or two infinities */
4001        if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
4002          /* two infinities with different signs is invalid */
4003          if (decNumberIsInfinite(rhs) && diffsign) {
4004            *status|=DEC_Invalid_operation;
4005            break;
4006            }
4007          bits=lhs->bits & DECNEG;      /* get sign from LHS */
4008          }
4009         else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
4010        bits|=DECINF;
4011        decNumberZero(res);
4012        res->bits=bits;                 /* set +/- infinity */
4013        } /* an infinity */
4014      break;
4015      }
4016
4017    /* Quick exit for add 0s; return the non-0, modified as need be */
4018    if (ISZERO(lhs)) {
4019      Int adjust;                       /* work */
4020      Int lexp=lhs->exponent;           /* save in case LHS==RES */
4021      bits=lhs->bits;                   /* .. */
4022      residue=0;                        /* clear accumulator */
4023      decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
4024      res->bits^=negate;                /* flip if rhs was negated */
4025      #if DECSUBSET
4026      if (set->extended) {              /* exponents on zeros count */
4027      #endif
4028        /* exponent will be the lower of the two */
4029        adjust=lexp-res->exponent;      /* adjustment needed [if -ve] */
4030        if (ISZERO(res)) {              /* both 0: special IEEE 854 rules */
4031          if (adjust<0) res->exponent=lexp;  /* set exponent */
4032          /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
4033          if (diffsign) {
4034            if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
4035             else res->bits=DECNEG;     /* preserve 0 sign */
4036            }
4037          }
4038         else { /* non-0 res */
4039          if (adjust<0) {     /* 0-padding needed */
4040            if ((res->digits-adjust)>set->digits) {
4041              adjust=res->digits-set->digits;     /* to fit exactly */
4042              *status|=DEC_Rounded;               /* [but exact] */
4043              }
4044            res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
4045            res->exponent+=adjust;                /* set the exponent. */
4046            }
4047          } /* non-0 res */
4048      #if DECSUBSET
4049        } /* extended */
4050      #endif
4051      decFinish(res, set, &residue, status);      /* clean and finalize */
4052      break;}
4053
4054    if (ISZERO(rhs)) {                  /* [lhs is non-zero] */
4055      Int adjust;                       /* work */
4056      Int rexp=rhs->exponent;           /* save in case RHS==RES */
4057      bits=rhs->bits;                   /* be clean */
4058      residue=0;                        /* clear accumulator */
4059      decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
4060      #if DECSUBSET
4061      if (set->extended) {              /* exponents on zeros count */
4062      #endif
4063        /* exponent will be the lower of the two */
4064        /* [0-0 case handled above] */
4065        adjust=rexp-res->exponent;      /* adjustment needed [if -ve] */
4066        if (adjust<0) {     /* 0-padding needed */
4067          if ((res->digits-adjust)>set->digits) {
4068            adjust=res->digits-set->digits;     /* to fit exactly */
4069            *status|=DEC_Rounded;               /* [but exact] */
4070            }
4071          res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
4072          res->exponent+=adjust;                /* set the exponent. */
4073          }
4074      #if DECSUBSET
4075        } /* extended */
4076      #endif
4077      decFinish(res, set, &residue, status);      /* clean and finalize */
4078      break;}
4079
4080    /* [NB: both fastpath and mainpath code below assume these cases */
4081    /* (notably 0-0) have already been handled] */
4082
4083    /* calculate the padding needed to align the operands */
4084    padding=rhs->exponent-lhs->exponent;
4085
4086    /* Fastpath cases where the numbers are aligned and normal, the RHS */
4087    /* is all in one unit, no operand rounding is needed, and no carry, */
4088    /* lengthening, or borrow is needed */
4089    if (padding==0
4090        && rhs->digits<=DECDPUN
4091        && rhs->exponent>=set->emin     /* [some normals drop through] */
4092        && rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
4093        && rhs->digits<=reqdigits
4094        && lhs->digits<=reqdigits) {
4095      Int partial=*lhs->lsu;
4096      if (!diffsign) {                  /* adding */
4097        partial+=*rhs->lsu;
4098        if ((partial<=DECDPUNMAX)       /* result fits in unit */
4099         && (lhs->digits>=DECDPUN ||    /* .. and no digits-count change */
4100             partial<(Int)powers[lhs->digits])) { /* .. */
4101          if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4102          *res->lsu=(Unit)partial;      /* [copy could have overwritten RHS] */
4103          break;
4104          }
4105        /* else drop out for careful add */
4106        }
4107       else {                           /* signs differ */
4108        partial-=*rhs->lsu;
4109        if (partial>0) { /* no borrow needed, and non-0 result */
4110          if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4111          *res->lsu=(Unit)partial;
4112          /* this could have reduced digits [but result>0] */
4113          res->digits=decGetDigits(res->lsu, D2U(res->digits));
4114          break;
4115          }
4116        /* else drop out for careful subtract */
4117        }
4118      }
4119
4120    /* Now align (pad) the lhs or rhs so they can be added or */
4121    /* subtracted, as necessary.  If one number is much larger than */
4122    /* the other (that is, if in plain form there is a least one */
4123    /* digit between the lowest digit of one and the highest of the */
4124    /* other) padding with up to DIGITS-1 trailing zeros may be */
4125    /* needed; then apply rounding (as exotic rounding modes may be */
4126    /* affected by the residue). */
4127    rhsshift=0;               /* rhs shift to left (padding) in Units */
4128    bits=lhs->bits;           /* assume sign is that of LHS */
4129    mult=1;                   /* likely multiplier */
4130
4131    /* [if padding==0 the operands are aligned; no padding is needed] */
4132    if (padding!=0) {
4133      /* some padding needed; always pad the RHS, as any required */
4134      /* padding can then be effected by a simple combination of */
4135      /* shifts and a multiply */
4136      Flag swapped=0;
4137      if (padding<0) {                  /* LHS needs the padding */
4138        const decNumber *t;
4139        padding=-padding;               /* will be +ve */
4140        bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
4141        t=lhs; lhs=rhs; rhs=t;
4142        swapped=1;
4143        }
4144
4145      /* If, after pad, rhs would be longer than lhs by digits+1 or */
4146      /* more then lhs cannot affect the answer, except as a residue, */
4147      /* so only need to pad up to a length of DIGITS+1. */
4148      if (rhs->digits+padding > lhs->digits+reqdigits+1) {
4149        /* The RHS is sufficient */
4150        /* for residue use the relative sign indication... */
4151        Int shift=reqdigits-rhs->digits;     /* left shift needed */
4152        residue=1;                           /* residue for rounding */
4153        if (diffsign) residue=-residue;      /* signs differ */
4154        /* copy, shortening if necessary */
4155        decCopyFit(res, rhs, set, &residue, status);
4156        /* if it was already shorter, then need to pad with zeros */
4157        if (shift>0) {
4158          res->digits=decShiftToMost(res->lsu, res->digits, shift);
4159          res->exponent-=shift;              /* adjust the exponent. */
4160          }
4161        /* flip the result sign if unswapped and rhs was negated */
4162        if (!swapped) res->bits^=negate;
4163        decFinish(res, set, &residue, status);    /* done */
4164        break;}
4165
4166      /* LHS digits may affect result */
4167      rhsshift=D2U(padding+1)-1;        /* this much by Unit shift .. */
4168      mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
4169      } /* padding needed */
4170
4171    if (diffsign) mult=-mult;           /* signs differ */
4172
4173    /* determine the longer operand */
4174    maxdigits=rhs->digits+padding;      /* virtual length of RHS */
4175    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4176
4177    /* Decide on the result buffer to use; if possible place directly */
4178    /* into result. */
4179    acc=res->lsu;                       /* assume add direct to result */
4180    /* If destructive overlap, or the number is too long, or a carry or */
4181    /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4182    /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4183    if ((maxdigits>=reqdigits)          /* is, or could be, too large */
4184     || (res==rhs && rhsshift>0)) {     /* destructive overlap */
4185      /* buffer needed, choose it; units for maxdigits digits will be */
4186      /* needed, +1 Unit for carry or borrow */
4187      Int need=D2U(maxdigits)+1;
4188      acc=accbuff;                      /* assume use local buffer */
4189      if (need*sizeof(Unit)>sizeof(accbuff)) {
4190        /* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4191        allocacc=(Unit *)malloc(need*sizeof(Unit));
4192        if (allocacc==NULL) {           /* hopeless -- abandon */
4193          *status|=DEC_Insufficient_storage;
4194          break;}
4195        acc=allocacc;
4196        }
4197      }
4198
4199    res->bits=(uByte)(bits&DECNEG);     /* it's now safe to overwrite.. */
4200    res->exponent=lhs->exponent;        /* .. operands (even if aliased) */
4201
4202    #if DECTRACE
4203      decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4204      decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4205      printf("  :h: %ld %ld\n", rhsshift, mult);
4206    #endif
4207
4208    /* add [A+B*m] or subtract [A+B*(-m)] */
4209    res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4210                              rhs->lsu, D2U(rhs->digits),
4211                              rhsshift, acc, mult)
4212               *DECDPUN;           /* [units -> digits] */
4213    if (res->digits<0) {           /* borrowed... */
4214      res->digits=-res->digits;
4215      res->bits^=DECNEG;           /* flip the sign */
4216      }
4217    #if DECTRACE
4218      decDumpAr('+', acc, D2U(res->digits));
4219    #endif
4220
4221    /* If a buffer was used the result must be copied back, possibly */
4222    /* shortening.  (If no buffer was used then the result must have */
4223    /* fit, so can't need rounding and residue must be 0.) */
4224    residue=0;                     /* clear accumulator */
4225    if (acc!=res->lsu) {
4226      #if DECSUBSET
4227      if (set->extended) {         /* round from first significant digit */
4228      #endif
4229        /* remove leading zeros that were added due to rounding up to */
4230        /* integral Units -- before the test for rounding. */
4231        if (res->digits>reqdigits)
4232          res->digits=decGetDigits(acc, D2U(res->digits));
4233        decSetCoeff(res, set, acc, res->digits, &residue, status);
4234      #if DECSUBSET
4235        }
4236       else { /* subset arithmetic rounds from original significant digit */
4237        /* May have an underestimate.  This only occurs when both */
4238        /* numbers fit in DECDPUN digits and are padding with a */
4239        /* negative multiple (-10, -100...) and the top digit(s) become */
4240        /* 0.  (This only matters when using X3.274 rules where the */
4241        /* leading zero could be included in the rounding.) */
4242        if (res->digits<maxdigits) {
4243          *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
4244          res->digits=maxdigits;
4245          }
4246         else {
4247          /* remove leading zeros that added due to rounding up to */
4248          /* integral Units (but only those in excess of the original */
4249          /* maxdigits length, unless extended) before test for rounding. */
4250          if (res->digits>reqdigits) {
4251            res->digits=decGetDigits(acc, D2U(res->digits));
4252            if (res->digits<maxdigits) res->digits=maxdigits;
4253            }
4254          }
4255        decSetCoeff(res, set, acc, res->digits, &residue, status);
4256        /* Now apply rounding if needed before removing leading zeros. */
4257        /* This is safe because subnormals are not a possibility */
4258        if (residue!=0) {
4259          decApplyRound(res, set, residue, status);
4260          residue=0;                 /* did what needed to be done */
4261          }
4262        } /* subset */
4263      #endif
4264      } /* used buffer */
4265
4266    /* strip leading zeros [these were left on in case of subset subtract] */
4267    res->digits=decGetDigits(res->lsu, D2U(res->digits));
4268
4269    /* apply checks and rounding */
4270    decFinish(res, set, &residue, status);
4271
4272    /* "When the sum of two operands with opposite signs is exactly */
4273    /* zero, the sign of that sum shall be '+' in all rounding modes */
4274    /* except round toward -Infinity, in which mode that sign shall be */
4275    /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
4276    if (ISZERO(res) && diffsign
4277     #if DECSUBSET
4278     && set->extended
4279     #endif
4280     && (*status&DEC_Inexact)==0) {
4281      if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
4282                                  else res->bits&=~DECNEG;  /* sign + */
4283      }
4284    } while(0);                              /* end protected */
4285
4286  if (allocacc!=NULL) free(allocacc);        /* drop any storage used */
4287  #if DECSUBSET
4288  if (allocrhs!=NULL) free(allocrhs);        /* .. */
4289  if (alloclhs!=NULL) free(alloclhs);        /* .. */
4290  #endif
4291  return res;
4292  } /* decAddOp */
4293
4294/* ------------------------------------------------------------------ */
4295/* decDivideOp -- division operation                                  */
4296/*                                                                    */
4297/*  This routine performs the calculations for all four division      */
4298/*  operators (divide, divideInteger, remainder, remainderNear).      */
4299/*                                                                    */
4300/*  C=A op B                                                          */
4301/*                                                                    */
4302/*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
4303/*   lhs is A                                                         */
4304/*   rhs is B                                                         */
4305/*   set is the context                                               */
4306/*   op  is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
4307/*   status is the usual accumulator                                  */
4308/*                                                                    */
4309/* C must have space for set->digits digits.                          */
4310/*                                                                    */
4311/* ------------------------------------------------------------------ */
4312/*   The underlying algorithm of this routine is the same as in the   */
4313/*   1981 S/370 implementation, that is, non-restoring long division  */
4314/*   with bi-unit (rather than bi-digit) estimation for each unit     */
4315/*   multiplier.  In this pseudocode overview, complications for the  */
4316/*   Remainder operators and division residues for exact rounding are */
4317/*   omitted for clarity.                                             */
4318/*                                                                    */
4319/*     Prepare operands and handle special values                     */
4320/*     Test for x/0 and then 0/x                                      */
4321/*     Exp =Exp1 - Exp2                                               */
4322/*     Exp =Exp +len(var1) -len(var2)                                 */
4323/*     Sign=Sign1 * Sign2                                             */
4324/*     Pad accumulator (Var1) to double-length with 0's (pad1)        */
4325/*     Pad Var2 to same length as Var1                                */
4326/*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
4327/*     have=0                                                         */
4328/*     Do until (have=digits+1 OR residue=0)                          */
4329/*       if exp<0 then if integer divide/residue then leave           */
4330/*       this_unit=0                                                  */
4331/*       Do forever                                                   */
4332/*          compare numbers                                           */
4333/*          if <0 then leave inner_loop                               */
4334/*          if =0 then (* quick exit without subtract *) do           */
4335/*             this_unit=this_unit+1; output this_unit                */
4336/*             leave outer_loop; end                                  */
4337/*          Compare lengths of numbers (mantissae):                   */
4338/*          If same then tops2=msu2pair -- {units 1&2 of var2}        */
4339/*                  else tops2=msu2plus -- {0, unit 1 of var2}        */
4340/*          tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4341/*          mult=tops1/tops2  -- Good and safe guess at divisor       */
4342/*          if mult=0 then mult=1                                     */
4343/*          this_unit=this_unit+mult                                  */
4344/*          subtract                                                  */
4345/*          end inner_loop                                            */
4346/*        if have\=0 | this_unit\=0 then do                           */
4347/*          output this_unit                                          */
4348/*          have=have+1; end                                          */
4349/*        var2=var2/10                                                */
4350/*        exp=exp-1                                                   */
4351/*        end outer_loop                                              */
4352/*     exp=exp+1   -- set the proper exponent                         */
4353/*     if have=0 then generate answer=0                               */
4354/*     Return (Result is defined by Var1)                             */
4355/*                                                                    */
4356/* ------------------------------------------------------------------ */
4357/* Two working buffers are needed during the division; one (digits+   */
4358/* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
4359/* long subtractions.  These are acc and var1 respectively.           */
4360/* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4361/* The static buffers may be larger than might be expected to allow   */
4362/* for calls from higher-level functions (notably exp).               */
4363/* ------------------------------------------------------------------ */
4364static decNumber * decDivideOp(decNumber *res,
4365                               const decNumber *lhs, const decNumber *rhs,
4366                               decContext *set, Flag op, uInt *status) {
4367  #if DECSUBSET
4368  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
4369  decNumber *allocrhs=NULL;        /* .., rhs */
4370  #endif
4371  Unit  accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
4372  Unit  *acc=accbuff;              /* -> accumulator array for result */
4373  Unit  *allocacc=NULL;            /* -> allocated buffer, iff allocated */
4374  Unit  *accnext;                  /* -> where next digit will go */
4375  Int   acclength;                 /* length of acc needed [Units] */
4376  Int   accunits;                  /* count of units accumulated */
4377  Int   accdigits;                 /* count of digits accumulated */
4378
4379  Unit  varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
4380  Unit  *var1=varbuff;             /* -> var1 array for long subtraction */
4381  Unit  *varalloc=NULL;            /* -> allocated buffer, iff used */
4382  Unit  *msu1;                     /* -> msu of var1 */
4383
4384  const Unit *var2;                /* -> var2 array */
4385  const Unit *msu2;                /* -> msu of var2 */
4386  Int   msu2plus;                  /* msu2 plus one [does not vary] */
4387  eInt  msu2pair;                  /* msu2 pair plus one [does not vary] */
4388
4389  Int   var1units, var2units;      /* actual lengths */
4390  Int   var2ulen;                  /* logical length (units) */
4391  Int   var1initpad=0;             /* var1 initial padding (digits) */
4392  Int   maxdigits;                 /* longest LHS or required acc length */
4393  Int   mult;                      /* multiplier for subtraction */
4394  Unit  thisunit;                  /* current unit being accumulated */
4395  Int   residue;                   /* for rounding */
4396  Int   reqdigits=set->digits;     /* requested DIGITS */
4397  Int   exponent;                  /* working exponent */
4398  Int   maxexponent=0;             /* DIVIDE maximum exponent if unrounded */
4399  uByte bits;                      /* working sign */
4400  Unit  *target;                   /* work */
4401  const Unit *source;              /* .. */
4402  uLong const *pow;                /* .. */
4403  Int   shift, cut;                /* .. */
4404  #if DECSUBSET
4405  Int   dropped;                   /* work */
4406  #endif
4407
4408  #if DECCHECK
4409  if (decCheckOperands(res, lhs, rhs, set)) return res;
4410  #endif
4411
4412  do {                             /* protect allocated storage */
4413    #if DECSUBSET
4414    if (!set->extended) {
4415      /* reduce operands and set lostDigits status, as needed */
4416      if (lhs->digits>reqdigits) {
4417        alloclhs=decRoundOperand(lhs, set, status);
4418        if (alloclhs==NULL) break;
4419        lhs=alloclhs;
4420        }
4421      if (rhs->digits>reqdigits) {
4422        allocrhs=decRoundOperand(rhs, set, status);
4423        if (allocrhs==NULL) break;
4424        rhs=allocrhs;
4425        }
4426      }
4427    #endif
4428    /* [following code does not require input rounding] */
4429
4430    bits=(lhs->bits^rhs->bits)&DECNEG;  /* assumed sign for divisions */
4431
4432    /* handle infinities and NaNs */
4433    if (SPECIALARGS) {                  /* a special bit set */
4434      if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4435        decNaNs(res, lhs, rhs, set, status);
4436        break;
4437        }
4438      /* one or two infinities */
4439      if (decNumberIsInfinite(lhs)) {   /* LHS (dividend) is infinite */
4440        if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
4441            op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
4442          *status|=DEC_Invalid_operation;
4443          break;
4444          }
4445        /* [Note that infinity/0 raises no exceptions] */
4446        decNumberZero(res);
4447        res->bits=bits|DECINF;          /* set +/- infinity */
4448        break;
4449        }
4450       else {                           /* RHS (divisor) is infinite */
4451        residue=0;
4452        if (op&(REMAINDER|REMNEAR)) {
4453          /* result is [finished clone of] lhs */
4454          decCopyFit(res, lhs, set, &residue, status);
4455          }
4456         else {  /* a division */
4457          decNumberZero(res);
4458          res->bits=bits;               /* set +/- zero */
4459          /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
4460          /* is a 0 with infinitely negative exponent, clamped to minimum */
4461          if (op&DIVIDE) {
4462            res->exponent=set->emin-set->digits+1;
4463            *status|=DEC_Clamped;
4464            }
4465          }
4466        decFinish(res, set, &residue, status);
4467        break;
4468        }
4469      }
4470
4471    /* handle 0 rhs (x/0) */
4472    if (ISZERO(rhs)) {                  /* x/0 is always exceptional */
4473      if (ISZERO(lhs)) {
4474        decNumberZero(res);             /* [after lhs test] */
4475        *status|=DEC_Division_undefined;/* 0/0 will become NaN */
4476        }
4477       else {
4478        decNumberZero(res);
4479        if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4480         else {
4481          *status|=DEC_Division_by_zero; /* x/0 */
4482          res->bits=bits|DECINF;         /* .. is +/- Infinity */
4483          }
4484        }
4485      break;}
4486
4487    /* handle 0 lhs (0/x) */
4488    if (ISZERO(lhs)) {                  /* 0/x [x!=0] */
4489      #if DECSUBSET
4490      if (!set->extended) decNumberZero(res);
4491       else {
4492      #endif
4493        if (op&DIVIDE) {
4494          residue=0;
4495          exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
4496          decNumberCopy(res, lhs);      /* [zeros always fit] */
4497          res->bits=bits;               /* sign as computed */
4498          res->exponent=exponent;       /* exponent, too */
4499          decFinalize(res, set, &residue, status);   /* check exponent */
4500          }
4501         else if (op&DIVIDEINT) {
4502          decNumberZero(res);           /* integer 0 */
4503          res->bits=bits;               /* sign as computed */
4504          }
4505         else {                         /* a remainder */
4506          exponent=rhs->exponent;       /* [save in case overwrite] */
4507          decNumberCopy(res, lhs);      /* [zeros always fit] */
4508          if (exponent<res->exponent) res->exponent=exponent; /* use lower */
4509          }
4510      #if DECSUBSET
4511        }
4512      #endif
4513      break;}
4514
4515    /* Precalculate exponent.  This starts off adjusted (and hence fits */
4516    /* in 31 bits) and becomes the usual unadjusted exponent as the */
4517    /* division proceeds.  The order of evaluation is important, here, */
4518    /* to avoid wrap. */
4519    exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4520
4521    /* If the working exponent is -ve, then some quick exits are */
4522    /* possible because the quotient is known to be <1 */
4523    /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4524    if (exponent<0 && !(op==DIVIDE)) {
4525      if (op&DIVIDEINT) {
4526        decNumberZero(res);                  /* integer part is 0 */
4527        #if DECSUBSET
4528        if (set->extended)
4529        #endif
4530          res->bits=bits;                    /* set +/- zero */
4531        break;}
4532      /* fastpath remainders so long as the lhs has the smaller */
4533      /* (or equal) exponent */
4534      if (lhs->exponent<=rhs->exponent) {
4535        if (op&REMAINDER || exponent<-1) {
4536          /* It is REMAINDER or safe REMNEAR; result is [finished */
4537          /* clone of] lhs  (r = x - 0*y) */
4538          residue=0;
4539          decCopyFit(res, lhs, set, &residue, status);
4540          decFinish(res, set, &residue, status);
4541          break;
4542          }
4543        /* [unsafe REMNEAR drops through] */
4544        }
4545      } /* fastpaths */
4546
4547    /* Long (slow) division is needed; roll up the sleeves... */
4548
4549    /* The accumulator will hold the quotient of the division. */
4550    /* If it needs to be too long for stack storage, then allocate. */
4551    acclength=D2U(reqdigits+DECDPUN);   /* in Units */
4552    if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4553      /* printf("malloc dvacc %ld units\n", acclength); */
4554      allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4555      if (allocacc==NULL) {             /* hopeless -- abandon */
4556        *status|=DEC_Insufficient_storage;
4557        break;}
4558      acc=allocacc;                     /* use the allocated space */
4559      }
4560
4561    /* var1 is the padded LHS ready for subtractions. */
4562    /* If it needs to be too long for stack storage, then allocate. */
4563    /* The maximum units needed for var1 (long subtraction) is: */
4564    /* Enough for */
4565    /*     (rhs->digits+reqdigits-1) -- to allow full slide to right */
4566    /* or  (lhs->digits)             -- to allow for long lhs */
4567    /* whichever is larger */
4568    /*   +1                -- for rounding of slide to right */
4569    /*   +1                -- for leading 0s */
4570    /*   +1                -- for pre-adjust if a remainder or DIVIDEINT */
4571    /* [Note: unused units do not participate in decUnitAddSub data] */
4572    maxdigits=rhs->digits+reqdigits-1;
4573    if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4574    var1units=D2U(maxdigits)+2;
4575    /* allocate a guard unit above msu1 for REMAINDERNEAR */
4576    if (!(op&DIVIDE)) var1units++;
4577    if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4578      /* printf("malloc dvvar %ld units\n", var1units+1); */
4579      varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4580      if (varalloc==NULL) {             /* hopeless -- abandon */
4581        *status|=DEC_Insufficient_storage;
4582        break;}
4583      var1=varalloc;                    /* use the allocated space */
4584      }
4585
4586    /* Extend the lhs and rhs to full long subtraction length.  The lhs */
4587    /* is truly extended into the var1 buffer, with 0 padding, so a */
4588    /* subtract in place is always possible.  The rhs (var2) has */
4589    /* virtual padding (implemented by decUnitAddSub). */
4590    /* One guard unit was allocated above msu1 for rem=rem+rem in */
4591    /* REMAINDERNEAR. */
4592    msu1=var1+var1units-1;              /* msu of var1 */
4593    source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
4594    for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4595    for (; target>=var1; target--) *target=0;
4596
4597    /* rhs (var2) is left-aligned with var1 at the start */
4598    var2ulen=var1units;                 /* rhs logical length (units) */
4599    var2units=D2U(rhs->digits);         /* rhs actual length (units) */
4600    var2=rhs->lsu;                      /* -> rhs array */
4601    msu2=var2+var2units-1;              /* -> msu of var2 [never changes] */
4602    /* now set up the variables which will be used for estimating the */
4603    /* multiplication factor.  If these variables are not exact, add */
4604    /* 1 to make sure that the multiplier is never overestimated. */
4605    msu2plus=*msu2;                     /* it's value .. */
4606    if (var2units>1) msu2plus++;        /* .. +1 if any more */
4607    msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
4608    if (var2units>1) {                  /* .. [else treat 2nd as 0] */
4609      msu2pair+=*(msu2-1);              /* .. */
4610      if (var2units>2) msu2pair++;      /* .. +1 if any more */
4611      }
4612
4613    /* The calculation is working in units, which may have leading zeros, */
4614    /* but the exponent was calculated on the assumption that they are */
4615    /* both left-aligned.  Adjust the exponent to compensate: add the */
4616    /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4617    /* [This is actually done by counting the digits and negating, as */
4618    /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4619    for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4620    for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4621
4622    /* Now, if doing an integer divide or remainder, ensure that */
4623    /* the result will be Unit-aligned.  To do this, shift the var1 */
4624    /* accumulator towards least if need be.  (It's much easier to */
4625    /* do this now than to reassemble the residue afterwards, if */
4626    /* doing a remainder.)  Also ensure the exponent is not negative. */
4627    if (!(op&DIVIDE)) {
4628      Unit *u;                          /* work */
4629      /* save the initial 'false' padding of var1, in digits */
4630      var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4631      /* Determine the shift to do. */
4632      if (exponent<0) cut=-exponent;
4633       else cut=DECDPUN-exponent%DECDPUN;
4634      decShiftToLeast(var1, var1units, cut);
4635      exponent+=cut;                    /* maintain numerical value */
4636      var1initpad-=cut;                 /* .. and reduce padding */
4637      /* clean any most-significant units which were just emptied */
4638      for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4639      } /* align */
4640     else { /* is DIVIDE */
4641      maxexponent=lhs->exponent-rhs->exponent;    /* save */
4642      /* optimization: if the first iteration will just produce 0, */
4643      /* preadjust to skip it [valid for DIVIDE only] */
4644      if (*msu1<*msu2) {
4645        var2ulen--;                     /* shift down */
4646        exponent-=DECDPUN;              /* update the exponent */
4647        }
4648      }
4649
4650    /* ---- start the long-division loops ------------------------------ */
4651    accunits=0;                         /* no units accumulated yet */
4652    accdigits=0;                        /* .. or digits */
4653    accnext=acc+acclength-1;            /* -> msu of acc [NB: allows digits+1] */
4654    for (;;) {                          /* outer forever loop */
4655      thisunit=0;                       /* current unit assumed 0 */
4656      /* find the next unit */
4657      for (;;) {                        /* inner forever loop */
4658        /* strip leading zero units [from either pre-adjust or from */
4659        /* subtract last time around].  Leave at least one unit. */
4660        for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4661
4662        if (var1units<var2ulen) break;       /* var1 too low for subtract */
4663        if (var1units==var2ulen) {           /* unit-by-unit compare needed */
4664          /* compare the two numbers, from msu */
4665          const Unit *pv1, *pv2;
4666          Unit v2;                           /* units to compare */
4667          pv2=msu2;                          /* -> msu */
4668          for (pv1=msu1; ; pv1--, pv2--) {
4669            /* v1=*pv1 -- always OK */
4670            v2=0;                            /* assume in padding */
4671            if (pv2>=var2) v2=*pv2;          /* in range */
4672            if (*pv1!=v2) break;             /* no longer the same */
4673            if (pv1==var1) break;            /* done; leave pv1 as is */
4674            }
4675          /* here when all inspected or a difference seen */
4676          if (*pv1<v2) break;                /* var1 too low to subtract */
4677          if (*pv1==v2) {                    /* var1 == var2 */
4678            /* reach here if var1 and var2 are identical; subtraction */
4679            /* would increase digit by one, and the residue will be 0 so */
4680            /* the calculation is done; leave the loop with residue=0. */
4681            thisunit++;                      /* as though subtracted */
4682            *var1=0;                         /* set var1 to 0 */
4683            var1units=1;                     /* .. */
4684            break;  /* from inner */
4685            } /* var1 == var2 */
4686          /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
4687          /* Estimate the multiplier (there's always a msu1-1)... */
4688          /* Bring in two units of var2 to provide a good estimate. */
4689          mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4690          } /* lengths the same */
4691         else { /* var1units > var2ulen, so subtraction is safe */
4692          /* The var2 msu is one unit towards the lsu of the var1 msu, */
4693          /* so only one unit for var2 can be used. */
4694          mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4695          }
4696        if (mult==0) mult=1;                 /* must always be at least 1 */
4697        /* subtraction needed; var1 is > var2 */
4698        thisunit=(Unit)(thisunit+mult);      /* accumulate */
4699        /* subtract var1-var2, into var1; only the overlap needs */
4700        /* processing, as this is an in-place calculation */
4701        shift=var2ulen-var2units;
4702        #if DECTRACE
4703          decDumpAr('1', &var1[shift], var1units-shift);
4704          decDumpAr('2', var2, var2units);
4705          printf("m=%ld\n", -mult);
4706        #endif
4707        decUnitAddSub(&var1[shift], var1units-shift,
4708                      var2, var2units, 0,
4709                      &var1[shift], -mult);
4710        #if DECTRACE
4711          decDumpAr('#', &var1[shift], var1units-shift);
4712        #endif
4713        /* var1 now probably has leading zeros; these are removed at the */
4714        /* top of the inner loop. */
4715        } /* inner loop */
4716
4717      /* The next unit has been calculated in full; unless it's a */
4718      /* leading zero, add to acc */
4719      if (accunits!=0 || thisunit!=0) {      /* is first or non-zero */
4720        *accnext=thisunit;                   /* store in accumulator */
4721        /* account exactly for the new digits */
4722        if (accunits==0) {
4723          accdigits++;                       /* at least one */
4724          for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4725          }
4726         else accdigits+=DECDPUN;
4727        accunits++;                          /* update count */
4728        accnext--;                           /* ready for next */
4729        if (accdigits>reqdigits) break;      /* have enough digits */
4730        }
4731
4732      /* if the residue is zero, the operation is done (unless divide */
4733      /* or divideInteger and still not enough digits yet) */
4734      if (*var1==0 && var1units==1) {        /* residue is 0 */
4735        if (op&(REMAINDER|REMNEAR)) break;
4736        if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4737        /* [drop through if divideInteger] */
4738        }
4739      /* also done enough if calculating remainder or integer */
4740      /* divide and just did the last ('units') unit */
4741      if (exponent==0 && !(op&DIVIDE)) break;
4742
4743      /* to get here, var1 is less than var2, so divide var2 by the per- */
4744      /* Unit power of ten and go for the next digit */
4745      var2ulen--;                            /* shift down */
4746      exponent-=DECDPUN;                     /* update the exponent */
4747      } /* outer loop */
4748
4749    /* ---- division is complete --------------------------------------- */
4750    /* here: acc      has at least reqdigits+1 of good results (or fewer */
4751    /*                if early stop), starting at accnext+1 (its lsu) */
4752    /*       var1     has any residue at the stopping point */
4753    /*       accunits is the number of digits collected in acc */
4754    if (accunits==0) {             /* acc is 0 */
4755      accunits=1;                  /* show have a unit .. */
4756      accdigits=1;                 /* .. */
4757      *accnext=0;                  /* .. whose value is 0 */
4758      }
4759     else accnext++;               /* back to last placed */
4760    /* accnext now -> lowest unit of result */
4761
4762    residue=0;                     /* assume no residue */
4763    if (op&DIVIDE) {
4764      /* record the presence of any residue, for rounding */
4765      if (*var1!=0 || var1units>1) residue=1;
4766       else { /* no residue */
4767        /* Had an exact division; clean up spurious trailing 0s. */
4768        /* There will be at most DECDPUN-1, from the final multiply, */
4769        /* and then only if the result is non-0 (and even) and the */
4770        /* exponent is 'loose'. */
4771        #if DECDPUN>1
4772        Unit lsu=*accnext;
4773        if (!(lsu&0x01) && (lsu!=0)) {
4774          /* count the trailing zeros */
4775          Int drop=0;
4776          for (;; drop++) {    /* [will terminate because lsu!=0] */
4777            if (exponent>=maxexponent) break;     /* don't chop real 0s */
4778            #if DECDPUN<=4
4779              if ((lsu-QUOT10(lsu, drop+1)
4780                  *powers[drop+1])!=0) break;     /* found non-0 digit */
4781            #else
4782              if (lsu%powers[drop+1]!=0) break;   /* found non-0 digit */
4783            #endif
4784            exponent++;
4785            }
4786          if (drop>0) {
4787            accunits=decShiftToLeast(accnext, accunits, drop);
4788            accdigits=decGetDigits(accnext, accunits);
4789            accunits=D2U(accdigits);
4790            /* [exponent was adjusted in the loop] */
4791            }
4792          } /* neither odd nor 0 */
4793        #endif
4794        } /* exact divide */
4795      } /* divide */
4796     else /* op!=DIVIDE */ {
4797      /* check for coefficient overflow */
4798      if (accdigits+exponent>reqdigits) {
4799        *status|=DEC_Division_impossible;
4800        break;
4801        }
4802      if (op & (REMAINDER|REMNEAR)) {
4803        /* [Here, the exponent will be 0, because var1 was adjusted */
4804        /* appropriately.] */
4805        Int postshift;                       /* work */
4806        Flag wasodd=0;                       /* integer was odd */
4807        Unit *quotlsu;                       /* for save */
4808        Int  quotdigits;                     /* .. */
4809
4810        bits=lhs->bits;                      /* remainder sign is always as lhs */
4811
4812        /* Fastpath when residue is truly 0 is worthwhile [and */
4813        /* simplifies the code below] */
4814        if (*var1==0 && var1units==1) {      /* residue is 0 */
4815          Int exp=lhs->exponent;             /* save min(exponents) */
4816          if (rhs->exponent<exp) exp=rhs->exponent;
4817          decNumberZero(res);                /* 0 coefficient */
4818          #if DECSUBSET
4819          if (set->extended)
4820          #endif
4821          res->exponent=exp;                 /* .. with proper exponent */
4822          res->bits=(uByte)(bits&DECNEG);          /* [cleaned] */
4823          decFinish(res, set, &residue, status);   /* might clamp */
4824          break;
4825          }
4826        /* note if the quotient was odd */
4827        if (*accnext & 0x01) wasodd=1;       /* acc is odd */
4828        quotlsu=accnext;                     /* save in case need to reinspect */
4829        quotdigits=accdigits;                /* .. */
4830
4831        /* treat the residue, in var1, as the value to return, via acc */
4832        /* calculate the unused zero digits.  This is the smaller of: */
4833        /*   var1 initial padding (saved above) */
4834        /*   var2 residual padding, which happens to be given by: */
4835        postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4836        /* [the 'exponent' term accounts for the shifts during divide] */
4837        if (var1initpad<postshift) postshift=var1initpad;
4838
4839        /* shift var1 the requested amount, and adjust its digits */
4840        var1units=decShiftToLeast(var1, var1units, postshift);
4841        accnext=var1;
4842        accdigits=decGetDigits(var1, var1units);
4843        accunits=D2U(accdigits);
4844
4845        exponent=lhs->exponent;         /* exponent is smaller of lhs & rhs */
4846        if (rhs->exponent<exponent) exponent=rhs->exponent;
4847
4848        /* Now correct the result if doing remainderNear; if it */
4849        /* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4850        /* the integer was odd then the result should be rem-rhs. */
4851        if (op&REMNEAR) {
4852          Int compare, tarunits;        /* work */
4853          Unit *up;                     /* .. */
4854          /* calculate remainder*2 into the var1 buffer (which has */
4855          /* 'headroom' of an extra unit and hence enough space) */
4856          /* [a dedicated 'double' loop would be faster, here] */
4857          tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4858                                 0, accnext, 1);
4859          /* decDumpAr('r', accnext, tarunits); */
4860
4861          /* Here, accnext (var1) holds tarunits Units with twice the */
4862          /* remainder's coefficient, which must now be compared to the */
4863          /* RHS.  The remainder's exponent may be smaller than the RHS's. */
4864          compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4865                                 rhs->exponent-exponent);
4866          if (compare==BADINT) {             /* deep trouble */
4867            *status|=DEC_Insufficient_storage;
4868            break;}
4869
4870          /* now restore the remainder by dividing by two; the lsu */
4871          /* is known to be even. */
4872          for (up=accnext; up<accnext+tarunits; up++) {
4873            Int half;              /* half to add to lower unit */
4874            half=*up & 0x01;
4875            *up/=2;                /* [shift] */
4876            if (!half) continue;
4877            *(up-1)+=DIV_ROUND_UP(DECDPUNMAX, 2);
4878            }
4879          /* [accunits still describes the original remainder length] */
4880
4881          if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
4882            Int exp, expunits, exprem;       /* work */
4883            /* This is effectively causing round-up of the quotient, */
4884            /* so if it was the rare case where it was full and all */
4885            /* nines, it would overflow and hence division-impossible */
4886            /* should be raised */
4887            Flag allnines=0;                 /* 1 if quotient all nines */
4888            if (quotdigits==reqdigits) {     /* could be borderline */
4889              for (up=quotlsu; ; up++) {
4890                if (quotdigits>DECDPUN) {
4891                  if (*up!=DECDPUNMAX) break;/* non-nines */
4892                  }
4893                 else {                      /* this is the last Unit */
4894                  if (*up==powers[quotdigits]-1) allnines=1;
4895                  break;
4896                  }
4897                quotdigits-=DECDPUN;         /* checked those digits */
4898                } /* up */
4899              } /* borderline check */
4900            if (allnines) {
4901              *status|=DEC_Division_impossible;
4902              break;}
4903
4904            /* rem-rhs is needed; the sign will invert.  Again, var1 */
4905            /* can safely be used for the working Units array. */
4906            exp=rhs->exponent-exponent;      /* RHS padding needed */
4907            /* Calculate units and remainder from exponent. */
4908            expunits=exp/DECDPUN;
4909            exprem=exp%DECDPUN;
4910            /* subtract [A+B*(-m)]; the result will always be negative */
4911            accunits=-decUnitAddSub(accnext, accunits,
4912                                    rhs->lsu, D2U(rhs->digits),
4913                                    expunits, accnext, -(Int)powers[exprem]);
4914            accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
4915            accunits=D2U(accdigits);    /* and recalculate the units for copy */
4916            /* [exponent is as for original remainder] */
4917            bits^=DECNEG;               /* flip the sign */
4918            }
4919          } /* REMNEAR */
4920        } /* REMAINDER or REMNEAR */
4921      } /* not DIVIDE */
4922
4923    /* Set exponent and bits */
4924    res->exponent=exponent;
4925    res->bits=(uByte)(bits&DECNEG);          /* [cleaned] */
4926
4927    /* Now the coefficient. */
4928    decSetCoeff(res, set, accnext, accdigits, &residue, status);
4929
4930    decFinish(res, set, &residue, status);   /* final cleanup */
4931
4932    #if DECSUBSET
4933    /* If a divide then strip trailing zeros if subset [after round] */
4934    if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
4935    #endif
4936    } while(0);                              /* end protected */
4937
4938  if (varalloc!=NULL) free(varalloc);   /* drop any storage used */
4939  if (allocacc!=NULL) free(allocacc);   /* .. */
4940  #if DECSUBSET
4941  if (allocrhs!=NULL) free(allocrhs);   /* .. */
4942  if (alloclhs!=NULL) free(alloclhs);   /* .. */
4943  #endif
4944  return res;
4945  } /* decDivideOp */
4946
4947/* ------------------------------------------------------------------ */
4948/* decMultiplyOp -- multiplication operation                          */
4949/*                                                                    */
4950/*  This routine performs the multiplication C=A x B.                 */
4951/*                                                                    */
4952/*   res is C, the result.  C may be A and/or B (e.g., X=X*X)         */
4953/*   lhs is A                                                         */
4954/*   rhs is B                                                         */
4955/*   set is the context                                               */
4956/*   status is the usual accumulator                                  */
4957/*                                                                    */
4958/* C must have space for set->digits digits.                          */
4959/*                                                                    */
4960/* ------------------------------------------------------------------ */
4961/* 'Classic' multiplication is used rather than Karatsuba, as the     */
4962/* latter would give only a minor improvement for the short numbers   */
4963/* expected to be handled most (and uses much more memory).           */
4964/*                                                                    */
4965/* There are two major paths here: the general-purpose ('old code')   */
4966/* path which handles all DECDPUN values, and a fastpath version      */
4967/* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
4968/* than two calls to decUnitAddSub would be made.                     */
4969/*                                                                    */
4970/* The fastpath version lumps units together into 8-digit or 9-digit  */
4971/* chunks, and also uses a lazy carry strategy to minimise expensive  */
4972/* 64-bit divisions.  The chunks are then broken apart again into     */
4973/* units for continuing processing.  Despite this overhead, the       */
4974/* fastpath can speed up some 16-digit operations by 10x (and much    */
4975/* more for higher-precision calculations).                           */
4976/*                                                                    */
4977/* A buffer always has to be used for the accumulator; in the         */
4978/* fastpath, buffers are also always needed for the chunked copies of */
4979/* of the operand coefficients.                                       */
4980/* Static buffers are larger than needed just for multiply, to allow  */
4981/* for calls from other operations (notably exp).                     */
4982/* ------------------------------------------------------------------ */
4983#define FASTMUL (DECUSE64 && DECDPUN<5)
4984static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4985                                 const decNumber *rhs, decContext *set,
4986                                 uInt *status) {
4987  Int    accunits;                 /* Units of accumulator in use */
4988  Int    exponent;                 /* work */
4989  Int    residue=0;                /* rounding residue */
4990  uByte  bits;                     /* result sign */
4991  Unit  *acc;                      /* -> accumulator Unit array */
4992  Int    needbytes;                /* size calculator */
4993  void  *allocacc=NULL;            /* -> allocated accumulator, iff allocated */
4994  Unit  accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4995                                   /* *4 for calls from other operations) */
4996  const Unit *mer, *mermsup;       /* work */
4997  Int   madlength;                 /* Units in multiplicand */
4998  Int   shift;                     /* Units to shift multiplicand by */
4999
5000  #if FASTMUL
5001    /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
5002    /* (DECDPUN is 2 or 4) then work in base 10**8 */
5003    #if DECDPUN & 1                /* odd */
5004      #define FASTBASE 1000000000  /* base */
5005      #define FASTDIGS          9  /* digits in base */
5006      #define FASTLAZY         18  /* carry resolution point [1->18] */
5007    #else
5008      #define FASTBASE  100000000
5009      #define FASTDIGS          8
5010      #define FASTLAZY       1844  /* carry resolution point [1->1844] */
5011    #endif
5012    /* three buffers are used, two for chunked copies of the operands */
5013    /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
5014    /* lazy carry evaluation */
5015    uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
5016    uInt  *zlhi=zlhibuff;                 /* -> lhs array */
5017    uInt  *alloclhi=NULL;                 /* -> allocated buffer, iff allocated */
5018    uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
5019    uInt  *zrhi=zrhibuff;                 /* -> rhs array */
5020    uInt  *allocrhi=NULL;                 /* -> allocated buffer, iff allocated */
5021    uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
5022    /* [allocacc is shared for both paths, as only one will run] */
5023    uLong *zacc=zaccbuff;          /* -> accumulator array for exact result */
5024    #if DECDPUN==1
5025    Int    zoff;                   /* accumulator offset */
5026    #endif
5027    uInt  *lip, *rip;              /* item pointers */
5028    uInt  *lmsi, *rmsi;            /* most significant items */
5029    Int    ilhs, irhs, iacc;       /* item counts in the arrays */
5030    Int    lazy;                   /* lazy carry counter */
5031    uLong  lcarry;                 /* uLong carry */
5032    uInt   carry;                  /* carry (NB not uLong) */
5033    Int    count;                  /* work */
5034    const  Unit *cup;              /* .. */
5035    Unit  *up;                     /* .. */
5036    uLong *lp;                     /* .. */
5037    Int    p;                      /* .. */
5038  #endif
5039
5040  #if DECSUBSET
5041    decNumber *alloclhs=NULL;      /* -> allocated buffer, iff allocated */
5042    decNumber *allocrhs=NULL;      /* -> allocated buffer, iff allocated */
5043  #endif
5044
5045  #if DECCHECK
5046  if (decCheckOperands(res, lhs, rhs, set)) return res;
5047  #endif
5048
5049  /* precalculate result sign */
5050  bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
5051
5052  /* handle infinities and NaNs */
5053  if (SPECIALARGS) {               /* a special bit set */
5054    if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
5055      decNaNs(res, lhs, rhs, set, status);
5056      return res;}
5057    /* one or two infinities; Infinity * 0 is invalid */
5058    if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
5059      ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
5060      *status|=DEC_Invalid_operation;
5061      return res;}
5062    decNumberZero(res);
5063    res->bits=bits|DECINF;         /* infinity */
5064    return res;}
5065
5066  /* For best speed, as in DMSRCN [the original Rexx numerics */
5067  /* module], use the shorter number as the multiplier (rhs) and */
5068  /* the longer as the multiplicand (lhs) to minimise the number of */
5069  /* adds (partial products) */
5070  if (lhs->digits<rhs->digits) {   /* swap... */
5071    const decNumber *hold=lhs;
5072    lhs=rhs;
5073    rhs=hold;
5074    }
5075
5076  do {                             /* protect allocated storage */
5077    #if DECSUBSET
5078    if (!set->extended) {
5079      /* reduce operands and set lostDigits status, as needed */
5080      if (lhs->digits>set->digits) {
5081        alloclhs=decRoundOperand(lhs, set, status);
5082        if (alloclhs==NULL) break;
5083        lhs=alloclhs;
5084        }
5085      if (rhs->digits>set->digits) {
5086        allocrhs=decRoundOperand(rhs, set, status);
5087        if (allocrhs==NULL) break;
5088        rhs=allocrhs;
5089        }
5090      }
5091    #endif
5092    /* [following code does not require input rounding] */
5093
5094    #if FASTMUL                    /* fastpath can be used */
5095    /* use the fast path if there are enough digits in the shorter */
5096    /* operand to make the setup and takedown worthwhile */
5097    #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls */
5098    if (rhs->digits>NEEDTWO) {     /* use fastpath... */
5099      /* calculate the number of elements in each array */
5100      ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
5101      irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
5102      iacc=ilhs+irhs;
5103
5104      /* allocate buffers if required, as usual */
5105      needbytes=ilhs*sizeof(uInt);
5106      if (needbytes>(Int)sizeof(zlhibuff)) {
5107        alloclhi=(uInt *)malloc(needbytes);
5108        zlhi=alloclhi;}
5109      needbytes=irhs*sizeof(uInt);
5110      if (needbytes>(Int)sizeof(zrhibuff)) {
5111        allocrhi=(uInt *)malloc(needbytes);
5112        zrhi=allocrhi;}
5113
5114      /* Allocating the accumulator space needs a special case when */
5115      /* DECDPUN=1 because when converting the accumulator to Units */
5116      /* after the multiplication each 8-byte item becomes 9 1-byte */
5117      /* units.  Therefore iacc extra bytes are needed at the front */
5118      /* (rounded up to a multiple of 8 bytes), and the uLong */
5119      /* accumulator starts offset the appropriate number of units */
5120      /* to the right to avoid overwrite during the unchunking. */
5121      needbytes=iacc*sizeof(uLong);
5122      #if DECDPUN==1
5123      zoff=(iacc+7)/8;        /* items to offset by */
5124      needbytes+=zoff*8;
5125      #endif
5126      if (needbytes>(Int)sizeof(zaccbuff)) {
5127        allocacc=(uLong *)malloc(needbytes);
5128        zacc=(uLong *)allocacc;}
5129      if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
5130        *status|=DEC_Insufficient_storage;
5131        break;}
5132
5133      acc=(Unit *)zacc;       /* -> target Unit array */
5134      #if DECDPUN==1
5135      zacc+=zoff;             /* start uLong accumulator to right */
5136      #endif
5137
5138      /* assemble the chunked copies of the left and right sides */
5139      for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
5140        for (p=0, *lip=0; p<FASTDIGS && count>0;
5141             p+=DECDPUN, cup++, count-=DECDPUN)
5142          *lip+=*cup*powers[p];
5143      lmsi=lip-1;     /* save -> msi */
5144      for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
5145        for (p=0, *rip=0; p<FASTDIGS && count>0;
5146             p+=DECDPUN, cup++, count-=DECDPUN)
5147          *rip+=*cup*powers[p];
5148      rmsi=rip-1;     /* save -> msi */
5149
5150      /* zero the accumulator */
5151      for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
5152
5153      /* Start the multiplication */
5154      /* Resolving carries can dominate the cost of accumulating the */
5155      /* partial products, so this is only done when necessary. */
5156      /* Each uLong item in the accumulator can hold values up to */
5157      /* 2**64-1, and each partial product can be as large as */
5158      /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
5159      /* itself 18.4 times in a uLong without overflowing, so during */
5160      /* the main calculation resolution is carried out every 18th */
5161      /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
5162      /* partial products can be added to themselves 1844.6 times in */
5163      /* a uLong without overflowing, so intermediate carry */
5164      /* resolution occurs only every 14752 digits.  Hence for common */
5165      /* short numbers usually only the one final carry resolution */
5166      /* occurs. */
5167      /* (The count is set via FASTLAZY to simplify experiments to */
5168      /* measure the value of this approach: a 35% improvement on a */
5169      /* [34x34] multiply.) */
5170      lazy=FASTLAZY;                         /* carry delay count */
5171      for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
5172        lp=zacc+(rip-zrhi);                  /* where to add the lhs */
5173        for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
5174          *lp+=(uLong)(*lip)*(*rip);         /* [this should in-line] */
5175          } /* lip loop */
5176        lazy--;
5177        if (lazy>0 && rip!=rmsi) continue;
5178        lazy=FASTLAZY;                       /* reset delay count */
5179        /* spin up the accumulator resolving overflows */
5180        for (lp=zacc; lp<zacc+iacc; lp++) {
5181          if (*lp<FASTBASE) continue;        /* it fits */
5182          lcarry=*lp/FASTBASE;               /* top part [slow divide] */
5183          /* lcarry can exceed 2**32-1, so check again; this check */
5184          /* and occasional extra divide (slow) is well worth it, as */
5185          /* it allows FASTLAZY to be increased to 18 rather than 4 */
5186          /* in the FASTDIGS=9 case */
5187          if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
5188           else { /* two-place carry [fairly rare] */
5189            uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
5190            *(lp+2)+=carry2;                        /* add to item+2 */
5191            *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
5192            carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
5193            }
5194          *(lp+1)+=carry;                    /* add to item above [inline] */
5195          *lp-=((uLong)FASTBASE*carry);      /* [inline] */
5196          } /* carry resolution */
5197        } /* rip loop */
5198
5199      /* The multiplication is complete; time to convert back into */
5200      /* units.  This can be done in-place in the accumulator and in */
5201      /* 32-bit operations, because carries were resolved after the */
5202      /* final add.  This needs N-1 divides and multiplies for */
5203      /* each item in the accumulator (which will become up to N */
5204      /* units, where 2<=N<=9). */
5205      for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5206        uInt item=(uInt)*lp;                 /* decapitate to uInt */
5207        for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5208          uInt part=item/(DECDPUNMAX+1);
5209          *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5210          item=part;
5211          } /* p */
5212        *up=(Unit)item; up++;                /* [final needs no division] */
5213        } /* lp */
5214      accunits=up-acc;                       /* count of units */
5215      }
5216     else { /* here to use units directly, without chunking ['old code'] */
5217    #endif
5218
5219      /* if accumulator will be too long for local storage, then allocate */
5220      acc=accbuff;                 /* -> assume buffer for accumulator */
5221      needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5222      if (needbytes>(Int)sizeof(accbuff)) {
5223        allocacc=(Unit *)malloc(needbytes);
5224        if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5225        acc=(Unit *)allocacc;                /* use the allocated space */
5226        }
5227
5228      /* Now the main long multiplication loop */
5229      /* Unlike the equivalent in the IBM Java implementation, there */
5230      /* is no advantage in calculating from msu to lsu.  So, do it */
5231      /* by the book, as it were. */
5232      /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5233      accunits=1;                  /* accumulator starts at '0' */
5234      *acc=0;                      /* .. (lsu=0) */
5235      shift=0;                     /* no multiplicand shift at first */
5236      madlength=D2U(lhs->digits);  /* this won't change */
5237      mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
5238
5239      for (mer=rhs->lsu; mer<mermsup; mer++) {
5240        /* Here, *mer is the next Unit in the multiplier to use */
5241        /* If non-zero [optimization] add it... */
5242        if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5243                                            lhs->lsu, madlength, 0,
5244                                            &acc[shift], *mer)
5245                                            + shift;
5246         else { /* extend acc with a 0; it will be used shortly */
5247          *(acc+accunits)=0;       /* [this avoids length of <=0 later] */
5248          accunits++;
5249          }
5250        /* multiply multiplicand by 10**DECDPUN for next Unit to left */
5251        shift++;                   /* add this for 'logical length' */
5252        } /* n */
5253    #if FASTMUL
5254      } /* unchunked units */
5255    #endif
5256    /* common end-path */
5257    #if DECTRACE
5258      decDumpAr('*', acc, accunits);         /* Show exact result */
5259    #endif
5260
5261    /* acc now contains the exact result of the multiplication, */
5262    /* possibly with a leading zero unit; build the decNumber from */
5263    /* it, noting if any residue */
5264    res->bits=bits;                          /* set sign */
5265    res->digits=decGetDigits(acc, accunits); /* count digits exactly */
5266
5267    /* There can be a 31-bit wrap in calculating the exponent. */
5268    /* This can only happen if both input exponents are negative and */
5269    /* both their magnitudes are large.  If there was a wrap, set a */
5270    /* safe very negative exponent, from which decFinalize() will */
5271    /* raise a hard underflow shortly. */
5272    exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
5273    if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5274      exponent=-2*DECNUMMAXE;                /* force underflow */
5275    res->exponent=exponent;                  /* OK to overwrite now */
5276
5277
5278    /* Set the coefficient.  If any rounding, residue records */
5279    decSetCoeff(res, set, acc, res->digits, &residue, status);
5280    decFinish(res, set, &residue, status);   /* final cleanup */
5281    } while(0);                         /* end protected */
5282
5283  if (allocacc!=NULL) free(allocacc);   /* drop any storage used */
5284  #if DECSUBSET
5285  if (allocrhs!=NULL) free(allocrhs);   /* .. */
5286  if (alloclhs!=NULL) free(alloclhs);   /* .. */
5287  #endif
5288  #if FASTMUL
5289  if (allocrhi!=NULL) free(allocrhi);   /* .. */
5290  if (alloclhi!=NULL) free(alloclhi);   /* .. */
5291  #endif
5292  return res;
5293  } /* decMultiplyOp */
5294
5295/* ------------------------------------------------------------------ */
5296/* decExpOp -- effect exponentiation                                  */
5297/*                                                                    */
5298/*   This computes C = exp(A)                                         */
5299/*                                                                    */
5300/*   res is C, the result.  C may be A                                */
5301/*   rhs is A                                                         */
5302/*   set is the context; note that rounding mode has no effect        */
5303/*                                                                    */
5304/* C must have space for set->digits digits. status is updated but    */
5305/* not set.                                                           */
5306/*                                                                    */
5307/* Restrictions:                                                      */
5308/*                                                                    */
5309/*   digits, emax, and -emin in the context must be less than         */
5310/*   2*DEC_MAX_MATH (1999998), and the rhs must be within these       */
5311/*   bounds or a zero.  This is an internal routine, so these         */
5312/*   restrictions are contractual and not enforced.                   */
5313/*                                                                    */
5314/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5315/* almost always be correctly rounded, but may be up to 1 ulp in      */
5316/* error in rare cases.                                               */
5317/*                                                                    */
5318/* Finite results will always be full precision and Inexact, except   */
5319/* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
5320/* ------------------------------------------------------------------ */
5321/* This approach used here is similar to the algorithm described in   */
5322/*                                                                    */
5323/*   Variable Precision Exponential Function, T. E. Hull and          */
5324/*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5325/*   pp79-91, ACM, June 1986.                                         */
5326/*                                                                    */
5327/* with the main difference being that the iterations in the series   */
5328/* evaluation are terminated dynamically (which does not require the  */
5329/* extra variable-precision variables which are expensive in this     */
5330/* context).                                                          */
5331/*                                                                    */
5332/* The error analysis in Hull & Abrham's paper applies except for the */
5333/* round-off error accumulation during the series evaluation.  This   */
5334/* code does not precalculate the number of iterations and so cannot  */
5335/* use Horner's scheme.  Instead, the accumulation is done at double- */
5336/* precision, which ensures that the additions of the terms are exact */
5337/* and do not accumulate round-off (and any round-off errors in the   */
5338/* terms themselves move 'to the right' faster than they can          */
5339/* accumulate).  This code also extends the calculation by allowing,  */
5340/* in the spirit of other decNumber operators, the input to be more   */
5341/* precise than the result (the precision used is based on the more   */
5342/* precise of the input or requested result).                         */
5343/*                                                                    */
5344/* Implementation notes:                                              */
5345/*                                                                    */
5346/* 1. This is separated out as decExpOp so it can be called from      */
5347/*    other Mathematical functions (notably Ln) with a wider range    */
5348/*    than normal.  In particular, it can handle the slightly wider   */
5349/*    (double) range needed by Ln (which has to be able to calculate  */
5350/*    exp(-x) where x can be the tiniest number (Ntiny).              */
5351/*                                                                    */
5352/* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop         */
5353/*    iterations by approximately a third with additional (although    */
5354/*    diminishing) returns as the range is reduced to even smaller    */
5355/*    fractions.  However, h (the power of 10 used to correct the     */
5356/*    result at the end, see below) must be kept <=8 as otherwise     */
5357/*    the final result cannot be computed.  Hence the leverage is a   */
5358/*    sliding value (8-h), where potentially the range is reduced     */
5359/*    more for smaller values.                                        */
5360/*                                                                    */
5361/*    The leverage that can be applied in this way is severely        */
5362/*    limited by the cost of the raise-to-the power at the end,       */
5363/*    which dominates when the number of iterations is small (less    */
5364/*    than ten) or when rhs is short.  As an example, the adjustment  */
5365/*    x**10,000,000 needs 31 multiplications, all but one full-width. */
5366/*                                                                    */
5367/* 3. The restrictions (especially precision) could be raised with    */
5368/*    care, but the full decNumber range seems very hard within the   */
5369/*    32-bit limits.                                                  */
5370/*                                                                    */
5371/* 4. The working precisions for the static buffers are twice the     */
5372/*    obvious size to allow for calls from decNumberPower.            */
5373/* ------------------------------------------------------------------ */
5374static decNumber *decExpOp(decNumber *res, const decNumber *rhs,
5375                           decContext *set, uInt *status) {
5376  uInt ignore=0;                   /* working status */
5377  Int h;                           /* adjusted exponent for 0.xxxx */
5378  Int p;                           /* working precision */
5379  Int residue;                     /* rounding residue */
5380  uInt needbytes;                  /* for space calculations */
5381  const decNumber *x=rhs;          /* (may point to safe copy later) */
5382  decContext aset, tset, dset;     /* working contexts */
5383  Int comp;                        /* work */
5384
5385  /* the argument is often copied to normalize it, so (unusually) it */
5386  /* is treated like other buffers, using DECBUFFER, +1 in case */
5387  /* DECBUFFER is 0 */
5388  decNumber bufr[D2N(DECBUFFER*2+1)];
5389  decNumber *allocrhs=NULL;        /* non-NULL if rhs buffer allocated */
5390
5391  /* the working precision will be no more than set->digits+8+1 */
5392  /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5393  /* is 0 (and twice that for the accumulator) */
5394
5395  /* buffer for t, term (working precision plus) */
5396  decNumber buft[D2N(DECBUFFER*2+9+1)];
5397  decNumber *allocbuft=NULL;       /* -> allocated buft, iff allocated */
5398  decNumber *t=buft;               /* term */
5399  /* buffer for a, accumulator (working precision * 2), at least 9 */
5400  decNumber bufa[D2N(DECBUFFER*4+18+1)];
5401  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
5402  decNumber *a=bufa;               /* accumulator */
5403  /* decNumber for the divisor term; this needs at most 9 digits */
5404  /* and so can be fixed size [16 so can use standard context] */
5405  decNumber bufd[D2N(16)];
5406  decNumber *d=bufd;               /* divisor */
5407  decNumber numone;                /* constant 1 */
5408
5409  #if DECCHECK
5410  Int iterations=0;                /* for later sanity check */
5411  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5412  #endif
5413
5414  do {                                  /* protect allocated storage */
5415    if (SPECIALARG) {                   /* handle infinities and NaNs */
5416      if (decNumberIsInfinite(rhs)) {   /* an infinity */
5417        if (decNumberIsNegative(rhs))   /* -Infinity -> +0 */
5418          decNumberZero(res);
5419         else decNumberCopy(res, rhs);  /* +Infinity -> self */
5420        }
5421       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5422      break;}
5423
5424    if (ISZERO(rhs)) {                  /* zeros -> exact 1 */
5425      decNumberZero(res);               /* make clean 1 */
5426      *res->lsu=1;                      /* .. */
5427      break;}                           /* [no status to set] */
5428
5429    /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5430    /* positive and negative tiny cases which will result in inexact */
5431    /* 1.  This also allows the later add-accumulate to always be */
5432    /* exact (because its length will never be more than twice the */
5433    /* working precision). */
5434    /* The comparator (tiny) needs just one digit, so use the */
5435    /* decNumber d for it (reused as the divisor, etc., below); its */
5436    /* exponent is such that if x is positive it will have */
5437    /* set->digits-1 zeros between the decimal point and the digit, */
5438    /* which is 4, and if x is negative one more zero there as the */
5439    /* more precise result will be of the form 0.9999999 rather than */
5440    /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
5441    /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
5442    /* this then the result will be 1.000000 */
5443    decNumberZero(d);                   /* clean */
5444    *d->lsu=4;                          /* set 4 .. */
5445    d->exponent=-set->digits;           /* * 10**(-d) */
5446    if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
5447    comp=decCompare(d, rhs, 1);         /* signless compare */
5448    if (comp==BADINT) {
5449      *status|=DEC_Insufficient_storage;
5450      break;}
5451    if (comp>=0) {                      /* rhs < d */
5452      Int shift=set->digits-1;
5453      decNumberZero(res);               /* set 1 */
5454      *res->lsu=1;                      /* .. */
5455      res->digits=decShiftToMost(res->lsu, 1, shift);
5456      res->exponent=-shift;                  /* make 1.0000... */
5457      *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
5458      break;} /* tiny */
5459
5460    /* set up the context to be used for calculating a, as this is */
5461    /* used on both paths below */
5462    decContextDefault(&aset, DEC_INIT_DECIMAL64);
5463    /* accumulator bounds are as requested (could underflow) */
5464    aset.emax=set->emax;                /* usual bounds */
5465    aset.emin=set->emin;                /* .. */
5466    aset.clamp=0;                       /* and no concrete format */
5467
5468    /* calculate the adjusted (Hull & Abrham) exponent (where the */
5469    /* decimal point is just to the left of the coefficient msd) */
5470    h=rhs->exponent+rhs->digits;
5471    /* if h>8 then 10**h cannot be calculated safely; however, when */
5472    /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5473    /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5474    /* overflow (or underflow to 0) is guaranteed -- so this case can */
5475    /* be handled by simply forcing the appropriate excess */
5476    if (h>8) {                          /* overflow/underflow */
5477      /* set up here so Power call below will over or underflow to */
5478      /* zero; set accumulator to either 2 or 0.02 */
5479      /* [stack buffer for a is always big enough for this] */
5480      decNumberZero(a);
5481      *a->lsu=2;                        /* not 1 but < exp(1) */
5482      if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
5483      h=8;                              /* clamp so 10**h computable */
5484      p=9;                              /* set a working precision */
5485      }
5486     else {                             /* h<=8 */
5487      Int maxlever=(rhs->digits>8?1:0);
5488      /* [could/should increase this for precisions >40 or so, too] */
5489
5490      /* if h is 8, cannot normalize to a lower upper limit because */
5491      /* the final result will not be computable (see notes above), */
5492      /* but leverage can be applied whenever h is less than 8. */
5493      /* Apply as much as possible, up to a MAXLEVER digits, which */
5494      /* sets the tradeoff against the cost of the later a**(10**h). */
5495      /* As h is increased, the working precision below also */
5496      /* increases to compensate for the "constant digits at the */
5497      /* front" effect. */
5498      Int lever=MINI(8-h, maxlever);    /* leverage attainable */
5499      Int use=-rhs->digits-lever;       /* exponent to use for RHS */
5500      h+=lever;                         /* apply leverage selected */
5501      if (h<0) {                        /* clamp */
5502        use+=h;                         /* [may end up subnormal] */
5503        h=0;
5504        }
5505      /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5506      if (rhs->exponent!=use) {
5507        decNumber *newrhs=bufr;         /* assume will fit on stack */
5508        needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5509        if (needbytes>sizeof(bufr)) {   /* need malloc space */
5510          allocrhs=(decNumber *)malloc(needbytes);
5511          if (allocrhs==NULL) {         /* hopeless -- abandon */
5512            *status|=DEC_Insufficient_storage;
5513            break;}
5514          newrhs=allocrhs;              /* use the allocated space */
5515          }
5516        decNumberCopy(newrhs, rhs);     /* copy to safe space */
5517        newrhs->exponent=use;           /* normalize; now <1 */
5518        x=newrhs;                       /* ready for use */
5519        /* decNumberShow(x); */
5520        }
5521
5522      /* Now use the usual power series to evaluate exp(x).  The */
5523      /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5524      /* third term by setting the term variable t=x, the accumulator */
5525      /* a=1, and the divisor d=2. */
5526
5527      /* First determine the working precision.  From Hull & Abrham */
5528      /* this is set->digits+h+2.  However, if x is 'over-precise' we */
5529      /* need to allow for all its digits to potentially participate */
5530      /* (consider an x where all the excess digits are 9s) so in */
5531      /* this case use x->digits+h+2 */
5532      p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
5533
5534      /* a and t are variable precision, and depend on p, so space */
5535      /* must be allocated for them if necessary */
5536
5537      /* the accumulator needs to be able to hold 2p digits so that */
5538      /* the additions on the second and subsequent iterations are */
5539      /* sufficiently exact. */
5540      needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5541      if (needbytes>sizeof(bufa)) {     /* need malloc space */
5542        allocbufa=(decNumber *)malloc(needbytes);
5543        if (allocbufa==NULL) {          /* hopeless -- abandon */
5544          *status|=DEC_Insufficient_storage;
5545          break;}
5546        a=allocbufa;                    /* use the allocated space */
5547        }
5548      /* the term needs to be able to hold p digits (which is */
5549      /* guaranteed to be larger than x->digits, so the initial copy */
5550      /* is safe); it may also be used for the raise-to-power */
5551      /* calculation below, which needs an extra two digits */
5552      needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5553      if (needbytes>sizeof(buft)) {     /* need malloc space */
5554        allocbuft=(decNumber *)malloc(needbytes);
5555        if (allocbuft==NULL) {          /* hopeless -- abandon */
5556          *status|=DEC_Insufficient_storage;
5557          break;}
5558        t=allocbuft;                    /* use the allocated space */
5559        }
5560
5561      decNumberCopy(t, x);              /* term=x */
5562      decNumberZero(a); *a->lsu=1;      /* accumulator=1 */
5563      decNumberZero(d); *d->lsu=2;      /* divisor=2 */
5564      decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
5565
5566      /* set up the contexts for calculating a, t, and d */
5567      decContextDefault(&tset, DEC_INIT_DECIMAL64);
5568      dset=tset;
5569      /* accumulator bounds are set above, set precision now */
5570      aset.digits=p*2;                  /* double */
5571      /* term bounds avoid any underflow or overflow */
5572      tset.digits=p;
5573      tset.emin=DEC_MIN_EMIN;           /* [emax is plenty] */
5574      /* [dset.digits=16, etc., are sufficient] */
5575
5576      /* finally ready to roll */
5577      for (;;) {
5578        #if DECCHECK
5579        iterations++;
5580        #endif
5581        /* only the status from the accumulation is interesting */
5582        /* [but it should remain unchanged after first add] */
5583        decAddOp(a, a, t, &aset, 0, status);           /* a=a+t */
5584        decMultiplyOp(t, t, x, &tset, &ignore);        /* t=t*x */
5585        decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
5586        /* the iteration ends when the term cannot affect the result, */
5587        /* if rounded to p digits, which is when its value is smaller */
5588        /* than the accumulator by p+1 digits.  There must also be */
5589        /* full precision in a. */
5590        if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5591            && (a->digits>=p)) break;
5592        decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
5593        } /* iterate */
5594
5595      #if DECCHECK
5596      /* just a sanity check; comment out test to show always */
5597      if (iterations>p+3)
5598        printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5599               iterations, *status, p, x->digits);
5600      #endif
5601      } /* h<=8 */
5602
5603    /* apply postconditioning: a=a**(10**h) -- this is calculated */
5604    /* at a slightly higher precision than Hull & Abrham suggest */
5605    if (h>0) {
5606      Int seenbit=0;               /* set once a 1-bit is seen */
5607      Int i;                       /* counter */
5608      Int n=powers[h];             /* always positive */
5609      aset.digits=p+2;             /* sufficient precision */
5610      /* avoid the overhead and many extra digits of decNumberPower */
5611      /* as all that is needed is the short 'multipliers' loop; here */
5612      /* accumulate the answer into t */
5613      decNumberZero(t); *t->lsu=1; /* acc=1 */
5614      for (i=1;;i++){              /* for each bit [top bit ignored] */
5615        /* abandon if have had overflow or terminal underflow */
5616        if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
5617          if (*status&DEC_Overflow || ISZERO(t)) break;}
5618        n=n<<1;                    /* move next bit to testable position */
5619        if (n<0) {                 /* top bit is set */
5620          seenbit=1;               /* OK, have a significant bit */
5621          decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
5622          }
5623        if (i==31) break;          /* that was the last bit */
5624        if (!seenbit) continue;    /* no need to square 1 */
5625        decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
5626        } /*i*/ /* 32 bits */
5627      /* decNumberShow(t); */
5628      a=t;                         /* and carry on using t instead of a */
5629      }
5630
5631    /* Copy and round the result to res */
5632    residue=1;                          /* indicate dirt to right .. */
5633    if (ISZERO(a)) residue=0;           /* .. unless underflowed to 0 */
5634    aset.digits=set->digits;            /* [use default rounding] */
5635    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5636    decFinish(res, set, &residue, status);       /* cleanup/set flags */
5637    } while(0);                         /* end protected */
5638
5639  if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used */
5640  if (allocbufa!=NULL) free(allocbufa); /* .. */
5641  if (allocbuft!=NULL) free(allocbuft); /* .. */
5642  /* [status is handled by caller] */
5643  return res;
5644  } /* decExpOp */
5645
5646/* ------------------------------------------------------------------ */
5647/* Initial-estimate natural logarithm table                           */
5648/*                                                                    */
5649/*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
5650/*           The result is a 4-digit encode of the coefficient (c=the */
5651/*           top 14 bits encoding 0-9999) and a 2-digit encode of the */
5652/*           exponent (e=the bottom 2 bits encoding 0-3)              */
5653/*                                                                    */
5654/*           The resulting value is given by:                         */
5655/*                                                                    */
5656/*             v = -c * 10**(-e-3)                                    */
5657/*                                                                    */
5658/*           where e and c are extracted from entry k = LNnn[x-10]    */
5659/*           where x is truncated (NB) into the range 10 through 99,  */
5660/*           and then c = k>>2 and e = k&3.                           */
5661/* ------------------------------------------------------------------ */
5662static const uShort LNnn[90] = {
5663  9016,  8652,  8316,  8008,  7724,  7456,  7208,
5664  6972,  6748,  6540,  6340,  6148,  5968,  5792,  5628,  5464,  5312,
5665  5164,  5020,  4884,  4748,  4620,  4496,  4376,  4256,  4144,  4032,
5666 39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5667 29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5668 22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5669 15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5670 10197,  9685,  9177,  8677,  8185,  7697,  7213,  6737,  6269,  5801,
5671  5341,  4889,  4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5672 10130,  6046, 20055};
5673
5674/* ------------------------------------------------------------------ */
5675/* decLnOp -- effect natural logarithm                                */
5676/*                                                                    */
5677/*   This computes C = ln(A)                                          */
5678/*                                                                    */
5679/*   res is C, the result.  C may be A                                */
5680/*   rhs is A                                                         */
5681/*   set is the context; note that rounding mode has no effect        */
5682/*                                                                    */
5683/* C must have space for set->digits digits.                          */
5684/*                                                                    */
5685/* Notable cases:                                                     */
5686/*   A<0 -> Invalid                                                   */
5687/*   A=0 -> -Infinity (Exact)                                         */
5688/*   A=+Infinity -> +Infinity (Exact)                                 */
5689/*   A=1 exactly -> 0 (Exact)                                         */
5690/*                                                                    */
5691/* Restrictions (as for Exp):                                         */
5692/*                                                                    */
5693/*   digits, emax, and -emin in the context must be less than         */
5694/*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
5695/*   bounds or a zero.  This is an internal routine, so these         */
5696/*   restrictions are contractual and not enforced.                   */
5697/*                                                                    */
5698/* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5699/* almost always be correctly rounded, but may be up to 1 ulp in      */
5700/* error in rare cases.                                               */
5701/* ------------------------------------------------------------------ */
5702/* The result is calculated using Newton's method, with each          */
5703/* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
5704/* Epperson 1989.                                                     */
5705/*                                                                    */
5706/* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5707/* This has to be calculated at the sum of the precision of x and the */
5708/* working precision.                                                 */
5709/*                                                                    */
5710/* Implementation notes:                                              */
5711/*                                                                    */
5712/* 1. This is separated out as decLnOp so it can be called from       */
5713/*    other Mathematical functions (e.g., Log 10) with a wider range  */
5714/*    than normal.  In particular, it can handle the slightly wider   */
5715/*    (+9+2) range needed by a power function.                        */
5716/*                                                                    */
5717/* 2. The speed of this function is about 10x slower than exp, as     */
5718/*    it typically needs 4-6 iterations for short numbers, and the    */
5719/*    extra precision needed adds a squaring effect, twice.           */
5720/*                                                                    */
5721/* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
5722/*    as these are common requests.  ln(10) is used by log10(x).      */
5723/*                                                                    */
5724/* 4. An iteration might be saved by widening the LNnn table, and     */
5725/*    would certainly save at least one if it were made ten times     */
5726/*    bigger, too (for truncated fractions 0.100 through 0.999).      */
5727/*    However, for most practical evaluations, at least four or five  */
5728/*    iterations will be needed -- so this would only speed up by      */
5729/*    20-25% and that probably does not justify increasing the table  */
5730/*    size.                                                           */
5731/*                                                                    */
5732/* 5. The static buffers are larger than might be expected to allow   */
5733/*    for calls from decNumberPower.                                  */
5734/* ------------------------------------------------------------------ */
5735static decNumber *decLnOp(decNumber *res, const decNumber *rhs,
5736                          decContext *set, uInt *status) {
5737  uInt ignore=0;                   /* working status accumulator */
5738  uInt needbytes;                  /* for space calculations */
5739  Int residue;                     /* rounding residue */
5740  Int r;                           /* rhs=f*10**r [see below] */
5741  Int p;                           /* working precision */
5742  Int pp;                          /* precision for iteration */
5743  Int t;                           /* work */
5744
5745  /* buffers for a (accumulator, typically precision+2) and b */
5746  /* (adjustment calculator, same size) */
5747  decNumber bufa[D2N(DECBUFFER+12)];
5748  decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated */
5749  decNumber *a=bufa;               /* accumulator/work */
5750  decNumber bufb[D2N(DECBUFFER*2+2)];
5751  decNumber *allocbufb=NULL;       /* -> allocated bufa, iff allocated */
5752  decNumber *b=bufb;               /* adjustment/work */
5753
5754  decNumber  numone;               /* constant 1 */
5755  decNumber  cmp;                  /* work */
5756  decContext aset, bset;           /* working contexts */
5757
5758  #if DECCHECK
5759  Int iterations=0;                /* for later sanity check */
5760  if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5761  #endif
5762
5763  do {                                  /* protect allocated storage */
5764    if (SPECIALARG) {                   /* handle infinities and NaNs */
5765      if (decNumberIsInfinite(rhs)) {   /* an infinity */
5766        if (decNumberIsNegative(rhs))   /* -Infinity -> error */
5767          *status|=DEC_Invalid_operation;
5768         else decNumberCopy(res, rhs);  /* +Infinity -> self */
5769        }
5770       else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5771      break;}
5772
5773    if (ISZERO(rhs)) {                  /* +/- zeros -> -Infinity */
5774      decNumberZero(res);               /* make clean */
5775      res->bits=DECINF|DECNEG;          /* set - infinity */
5776      break;}                           /* [no status to set] */
5777
5778    /* Non-zero negatives are bad... */
5779    if (decNumberIsNegative(rhs)) {     /* -x -> error */
5780      *status|=DEC_Invalid_operation;
5781      break;}
5782
5783    /* Here, rhs is positive, finite, and in range */
5784
5785    /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5786    if (rhs->exponent==0 && set->digits<=40) {
5787      #if DECDPUN==1
5788      if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5789      #else
5790      if (rhs->lsu[0]==10 && rhs->digits==2) {                  /* ln(10) */
5791      #endif
5792        aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5793        #define LN10 "2.302585092994045684017991454684364207601"
5794        decNumberFromString(res, LN10, &aset);
5795        *status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5796        break;}
5797      if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5798        aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5799        #define LN2 "0.6931471805599453094172321214581765680755"
5800        decNumberFromString(res, LN2, &aset);
5801        *status|=(DEC_Inexact | DEC_Rounded);
5802        break;}
5803      } /* integer and short */
5804
5805    /* Determine the working precision.  This is normally the */
5806    /* requested precision + 2, with a minimum of 9.  However, if */
5807    /* the rhs is 'over-precise' then allow for all its digits to */
5808    /* potentially participate (consider an rhs where all the excess */
5809    /* digits are 9s) so in this case use rhs->digits+2. */
5810    p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5811
5812    /* Allocate space for the accumulator and the high-precision */
5813    /* adjustment calculator, if necessary.  The accumulator must */
5814    /* be able to hold p digits, and the adjustment up to */
5815    /* rhs->digits+p digits.  They are also made big enough for 16 */
5816    /* digits so that they can be used for calculating the initial */
5817    /* estimate. */
5818    needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5819    if (needbytes>sizeof(bufa)) {     /* need malloc space */
5820      allocbufa=(decNumber *)malloc(needbytes);
5821      if (allocbufa==NULL) {          /* hopeless -- abandon */
5822        *status|=DEC_Insufficient_storage;
5823        break;}
5824      a=allocbufa;                    /* use the allocated space */
5825      }
5826    pp=p+rhs->digits;
5827    needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5828    if (needbytes>sizeof(bufb)) {     /* need malloc space */
5829      allocbufb=(decNumber *)malloc(needbytes);
5830      if (allocbufb==NULL) {          /* hopeless -- abandon */
5831        *status|=DEC_Insufficient_storage;
5832        break;}
5833      b=allocbufb;                    /* use the allocated space */
5834      }
5835
5836    /* Prepare an initial estimate in acc. Calculate this by */
5837    /* considering the coefficient of x to be a normalized fraction, */
5838    /* f, with the decimal point at far left and multiplied by */
5839    /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
5840    /*   ln(x) = ln(f) + ln(10)*r */
5841    /* Get the initial estimate for ln(f) from a small lookup */
5842    /* table (see above) indexed by the first two digits of f, */
5843    /* truncated. */
5844
5845    decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5846    r=rhs->exponent+rhs->digits;        /* 'normalised' exponent */
5847    decNumberFromInt32(a, r);           /* a=r */
5848    decNumberFromInt32(b, 2302585);     /* b=ln(10) (2.302585) */
5849    b->exponent=-6;                     /*  .. */
5850    decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
5851    /* now get top two digits of rhs into b by simple truncate and */
5852    /* force to integer */
5853    residue=0;                          /* (no residue) */
5854    aset.digits=2; aset.round=DEC_ROUND_DOWN;
5855    decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5856    b->exponent=0;                      /* make integer */
5857    t=decGetInt(b);                     /* [cannot fail] */
5858    if (t<10) t=X10(t);                 /* adjust single-digit b */
5859    t=LNnn[t-10];                       /* look up ln(b) */
5860    decNumberFromInt32(b, t>>2);        /* b=ln(b) coefficient */
5861    b->exponent=-(t&3)-3;               /* set exponent */
5862    b->bits=DECNEG;                     /* ln(0.10)->ln(0.99) always -ve */
5863    aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5864    decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5865    /* the initial estimate is now in a, with up to 4 digits correct. */
5866    /* When rhs is at or near Nmax the estimate will be low, so we */
5867    /* will approach it from below, avoiding overflow when calling exp. */
5868
5869    decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
5870
5871    /* accumulator bounds are as requested (could underflow, but */
5872    /* cannot overflow) */
5873    aset.emax=set->emax;
5874    aset.emin=set->emin;
5875    aset.clamp=0;                       /* no concrete format */
5876    /* set up a context to be used for the multiply and subtract */
5877    bset=aset;
5878    bset.emax=DEC_MAX_MATH*2;           /* use double bounds for the */
5879    bset.emin=-DEC_MAX_MATH*2;          /* adjustment calculation */
5880                                        /* [see decExpOp call below] */
5881    /* for each iteration double the number of digits to calculate, */
5882    /* up to a maximum of p */
5883    pp=9;                               /* initial precision */
5884    /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5885    /* 34+2, which is ideal for standard-sized numbers] */
5886    aset.digits=pp;                     /* working context */
5887    bset.digits=pp+rhs->digits;         /* wider context */
5888    for (;;) {                          /* iterate */
5889      #if DECCHECK
5890      iterations++;
5891      if (iterations>24) break;         /* consider 9 * 2**24 */
5892      #endif
5893      /* calculate the adjustment (exp(-a)*x-1) into b.  This is a */
5894      /* catastrophic subtraction but it really is the difference */
5895      /* from 1 that is of interest. */
5896      /* Use the internal entry point to Exp as it allows the double */
5897      /* range for calculating exp(-a) when a is the tiniest subnormal. */
5898      a->bits^=DECNEG;                  /* make -a */
5899      decExpOp(b, a, &bset, &ignore);   /* b=exp(-a) */
5900      a->bits^=DECNEG;                  /* restore sign of a */
5901      /* now multiply by rhs and subtract 1, at the wider precision */
5902      decMultiplyOp(b, b, rhs, &bset, &ignore);        /* b=b*rhs */
5903      decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5904
5905      /* the iteration ends when the adjustment cannot affect the */
5906      /* result by >=0.5 ulp (at the requested digits), which */
5907      /* is when its value is smaller than the accumulator by */
5908      /* set->digits+1 digits (or it is zero) -- this is a looser */
5909      /* requirement than for Exp because all that happens to the */
5910      /* accumulator after this is the final rounding (but note that */
5911      /* there must also be full precision in a, or a=0). */
5912
5913      if (decNumberIsZero(b) ||
5914          (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5915        if (a->digits==p) break;
5916        if (decNumberIsZero(a)) {
5917          decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5918          if (cmp.lsu[0]==0) a->exponent=0;            /* yes, exact 0 */
5919           else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
5920          break;
5921          }
5922        /* force padding if adjustment has gone to 0 before full length */
5923        if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5924        }
5925
5926      /* not done yet ... */
5927      decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
5928      if (pp==p) continue;                   /* precision is at maximum */
5929      /* lengthen the next calculation */
5930      pp=pp*2;                               /* double precision */
5931      if (pp>p) pp=p;                        /* clamp to maximum */
5932      aset.digits=pp;                        /* working context */
5933      bset.digits=pp+rhs->digits;            /* wider context */
5934      } /* Newton's iteration */
5935
5936    #if DECCHECK
5937    /* just a sanity check; remove the test to show always */
5938    if (iterations>24)
5939      printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5940            iterations, *status, p, rhs->digits);
5941    #endif
5942
5943    /* Copy and round the result to res */
5944    residue=1;                          /* indicate dirt to right */
5945    if (ISZERO(a)) residue=0;           /* .. unless underflowed to 0 */
5946    aset.digits=set->digits;            /* [use default rounding] */
5947    decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5948    decFinish(res, set, &residue, status);       /* cleanup/set flags */
5949    } while(0);                         /* end protected */
5950
5951  if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5952  if (allocbufb!=NULL) free(allocbufb); /* .. */
5953  /* [status is handled by caller] */
5954  return res;
5955  } /* decLnOp */
5956
5957/* ------------------------------------------------------------------ */
5958/* decQuantizeOp  -- force exponent to requested value                */
5959/*                                                                    */
5960/*   This computes C = op(A, B), where op adjusts the coefficient     */
5961/*   of C (by rounding or shifting) such that the exponent (-scale)   */
5962/*   of C has the value B or matches the exponent of B.               */
5963/*   The numerical value of C will equal A, except for the effects of */
5964/*   any rounding that occurred.                                      */
5965/*                                                                    */
5966/*   res is C, the result.  C may be A or B                           */
5967/*   lhs is A, the number to adjust                                   */
5968/*   rhs is B, the requested exponent                                 */
5969/*   set is the context                                               */
5970/*   quant is 1 for quantize or 0 for rescale                         */
5971/*   status is the status accumulator (this can be called without     */
5972/*          risk of control loss)                                     */
5973/*                                                                    */
5974/* C must have space for set->digits digits.                          */
5975/*                                                                    */
5976/* Unless there is an error or the result is infinite, the exponent   */
5977/* after the operation is guaranteed to be that requested.            */
5978/* ------------------------------------------------------------------ */
5979static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5980                                 const decNumber *rhs, decContext *set,
5981                                 Flag quant, uInt *status) {
5982  #if DECSUBSET
5983  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
5984  decNumber *allocrhs=NULL;        /* .., rhs */
5985  #endif
5986  const decNumber *inrhs=rhs;      /* save original rhs */
5987  Int   reqdigits=set->digits;     /* requested DIGITS */
5988  Int   reqexp;                    /* requested exponent [-scale] */
5989  Int   residue=0;                 /* rounding residue */
5990  Int   etiny=set->emin-(reqdigits-1);
5991
5992  #if DECCHECK
5993  if (decCheckOperands(res, lhs, rhs, set)) return res;
5994  #endif
5995
5996  do {                             /* protect allocated storage */
5997    #if DECSUBSET
5998    if (!set->extended) {
5999      /* reduce operands and set lostDigits status, as needed */
6000      if (lhs->digits>reqdigits) {
6001        alloclhs=decRoundOperand(lhs, set, status);
6002        if (alloclhs==NULL) break;
6003        lhs=alloclhs;
6004        }
6005      if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
6006        allocrhs=decRoundOperand(rhs, set, status);
6007        if (allocrhs==NULL) break;
6008        rhs=allocrhs;
6009        }
6010      }
6011    #endif
6012    /* [following code does not require input rounding] */
6013
6014    /* Handle special values */
6015    if (SPECIALARGS) {
6016      /* NaNs get usual processing */
6017      if (SPECIALARGS & (DECSNAN | DECNAN))
6018        decNaNs(res, lhs, rhs, set, status);
6019      /* one infinity but not both is bad */
6020      else if ((lhs->bits ^ rhs->bits) & DECINF)
6021        *status|=DEC_Invalid_operation;
6022      /* both infinity: return lhs */
6023      else decNumberCopy(res, lhs);          /* [nop if in place] */
6024      break;
6025      }
6026
6027    /* set requested exponent */
6028    if (quant) reqexp=inrhs->exponent;  /* quantize -- match exponents */
6029     else {                             /* rescale -- use value of rhs */
6030      /* Original rhs must be an integer that fits and is in range, */
6031      /* which could be from -1999999997 to +999999999, thanks to */
6032      /* subnormals */
6033      reqexp=decGetInt(inrhs);               /* [cannot fail] */
6034      }
6035
6036    #if DECSUBSET
6037    if (!set->extended) etiny=set->emin;     /* no subnormals */
6038    #endif
6039
6040    if (reqexp==BADINT                       /* bad (rescale only) or .. */
6041     || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
6042     || (reqexp<etiny)                       /* < lowest */
6043     || (reqexp>set->emax)) {                /* > emax */
6044      *status|=DEC_Invalid_operation;
6045      break;}
6046
6047    /* the RHS has been processed, so it can be overwritten now if necessary */
6048    if (ISZERO(lhs)) {                       /* zero coefficient unchanged */
6049      decNumberCopy(res, lhs);               /* [nop if in place] */
6050      res->exponent=reqexp;                  /* .. just set exponent */
6051      #if DECSUBSET
6052      if (!set->extended) res->bits=0;       /* subset specification; no -0 */
6053      #endif
6054      }
6055     else {                                  /* non-zero lhs */
6056      Int adjust=reqexp-lhs->exponent;       /* digit adjustment needed */
6057      /* if adjusted coefficient will definitely not fit, give up now */
6058      if ((lhs->digits-adjust)>reqdigits) {
6059        *status|=DEC_Invalid_operation;
6060        break;
6061        }
6062
6063      if (adjust>0) {                        /* increasing exponent */
6064        /* this will decrease the length of the coefficient by adjust */
6065        /* digits, and must round as it does so */
6066        decContext workset;                  /* work */
6067        workset=*set;                        /* clone rounding, etc. */
6068        workset.digits=lhs->digits-adjust;   /* set requested length */
6069        /* [note that the latter can be <1, here] */
6070        decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
6071        decApplyRound(res, &workset, residue, status);    /* .. and round */
6072        residue=0;                                        /* [used] */
6073        /* If just rounded a 999s case, exponent will be off by one; */
6074        /* adjust back (after checking space), if so. */
6075        if (res->exponent>reqexp) {
6076          /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
6077          /* set->digits==3 */
6078          if (res->digits==reqdigits) {      /* cannot shift by 1 */
6079            *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
6080            *status|=DEC_Invalid_operation;
6081            break;
6082            }
6083          res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
6084          res->exponent--;                   /* (re)adjust the exponent. */
6085          }
6086        #if DECSUBSET
6087        if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
6088        #endif
6089        } /* increase */
6090       else /* adjust<=0 */ {                /* decreasing or = exponent */
6091        /* this will increase the length of the coefficient by -adjust */
6092        /* digits, by adding zero or more trailing zeros; this is */
6093        /* already checked for fit, above */
6094        decNumberCopy(res, lhs);             /* [it will fit] */
6095        /* if padding needed (adjust<0), add it now... */
6096        if (adjust<0) {
6097          res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
6098          res->exponent+=adjust;             /* adjust the exponent */
6099          }
6100        } /* decrease */
6101      } /* non-zero */
6102
6103    /* Check for overflow [do not use Finalize in this case, as an */
6104    /* overflow here is a "don't fit" situation] */
6105    if (res->exponent>set->emax-res->digits+1) {  /* too big */
6106      *status|=DEC_Invalid_operation;
6107      break;
6108      }
6109     else {
6110      decFinalize(res, set, &residue, status);    /* set subnormal flags */
6111      *status&=~DEC_Underflow;          /* suppress Underflow [754r] */
6112      }
6113    } while(0);                         /* end protected */
6114
6115  #if DECSUBSET
6116  if (allocrhs!=NULL) free(allocrhs);   /* drop any storage used */
6117  if (alloclhs!=NULL) free(alloclhs);   /* .. */
6118  #endif
6119  return res;
6120  } /* decQuantizeOp */
6121
6122/* ------------------------------------------------------------------ */
6123/* decCompareOp -- compare, min, or max two Numbers                   */
6124/*                                                                    */
6125/*   This computes C = A ? B and carries out one of four operations:  */
6126/*     COMPARE    -- returns the signum (as a number) giving the      */
6127/*                   result of a comparison unless one or both        */
6128/*                   operands is a NaN (in which case a NaN results)  */
6129/*     COMPSIG    -- as COMPARE except that a quiet NaN raises        */
6130/*                   Invalid operation.                               */
6131/*     COMPMAX    -- returns the larger of the operands, using the    */
6132/*                   754r maxnum operation                            */
6133/*     COMPMAXMAG -- ditto, comparing absolute values                 */
6134/*     COMPMIN    -- the 754r minnum operation                        */
6135/*     COMPMINMAG -- ditto, comparing absolute values                 */
6136/*     COMTOTAL   -- returns the signum (as a number) giving the      */
6137/*                   result of a comparison using 754r total ordering */
6138/*                                                                    */
6139/*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
6140/*   lhs is A                                                         */
6141/*   rhs is B                                                         */
6142/*   set is the context                                               */
6143/*   op  is the operation flag                                        */
6144/*   status is the usual accumulator                                  */
6145/*                                                                    */
6146/* C must have space for one digit for COMPARE or set->digits for     */
6147/* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.                       */
6148/* ------------------------------------------------------------------ */
6149/* The emphasis here is on speed for common cases, and avoiding       */
6150/* coefficient comparison if possible.                                */
6151/* ------------------------------------------------------------------ */
6152static decNumber *decCompareOp(decNumber *res, const decNumber *lhs,
6153                               const decNumber *rhs, decContext *set,
6154                               Flag op, uInt *status) {
6155  #if DECSUBSET
6156  decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated */
6157  decNumber *allocrhs=NULL;        /* .., rhs */
6158  #endif
6159  Int   result=0;                  /* default result value */
6160  uByte merged;                    /* work */
6161
6162  #if DECCHECK
6163  if (decCheckOperands(res, lhs, rhs, set)) return res;
6164  #endif
6165
6166  do {                             /* protect allocated storage */
6167    #if DECSUBSET
6168    if (!set->extended) {
6169      /* reduce operands and set lostDigits status, as needed */
6170      if (lhs->digits>set->digits) {
6171        alloclhs=decRoundOperand(lhs, set, status);
6172        if (alloclhs==NULL) {result=BADINT; break;}
6173        lhs=alloclhs;
6174        }
6175      if (rhs->digits>set->digits) {
6176        allocrhs=decRoundOperand(rhs, set, status);
6177        if (allocrhs==NULL) {result=BADINT; break;}
6178        rhs=allocrhs;
6179        }
6180      }
6181    #endif
6182    /* [following code does not require input rounding] */
6183
6184    /* If total ordering then handle differing signs 'up front' */
6185    if (op==COMPTOTAL) {                /* total ordering */
6186      if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
6187        result=-1;
6188        break;
6189        }
6190      if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
6191        result=+1;
6192        break;
6193        }
6194      }
6195
6196    /* handle NaNs specially; let infinities drop through */
6197    /* This assumes sNaN (even just one) leads to NaN. */
6198    merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6199    if (merged) {                       /* a NaN bit set */
6200      if (op==COMPARE);                 /* result will be NaN */
6201       else if (op==COMPSIG)            /* treat qNaN as sNaN */
6202        *status|=DEC_Invalid_operation | DEC_sNaN;
6203       else if (op==COMPTOTAL) {        /* total ordering, always finite */
6204        /* signs are known to be the same; compute the ordering here */
6205        /* as if the signs are both positive, then invert for negatives */
6206        if (!decNumberIsNaN(lhs)) result=-1;
6207         else if (!decNumberIsNaN(rhs)) result=+1;
6208         /* here if both NaNs */
6209         else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6210         else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6211         else { /* both NaN or both sNaN */
6212          /* now it just depends on the payload */
6213          result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6214                                rhs->lsu, D2U(rhs->digits), 0);
6215          /* [Error not possible, as these are 'aligned'] */
6216          } /* both same NaNs */
6217        if (decNumberIsNegative(lhs)) result=-result;
6218        break;
6219        } /* total order */
6220
6221       else if (merged & DECSNAN);           /* sNaN -> qNaN */
6222       else { /* here if MIN or MAX and one or two quiet NaNs */
6223        /* min or max -- 754r rules ignore single NaN */
6224        if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6225          /* just one NaN; force choice to be the non-NaN operand */
6226          op=COMPMAX;
6227          if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6228                             else result=+1; /* pick lhs */
6229          break;
6230          }
6231        } /* max or min */
6232      op=COMPNAN;                            /* use special path */
6233      decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
6234      break;
6235      }
6236    /* have numbers */
6237    if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6238     else result=decCompare(lhs, rhs, 0);    /* sign matters */
6239    } while(0);                              /* end protected */
6240
6241  if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6242   else {
6243    if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6244      if (op==COMPTOTAL && result==0) {
6245        /* operands are numerically equal or same NaN (and same sign, */
6246        /* tested first); if identical, leave result 0 */
6247        if (lhs->exponent!=rhs->exponent) {
6248          if (lhs->exponent<rhs->exponent) result=-1;
6249           else result=+1;
6250          if (decNumberIsNegative(lhs)) result=-result;
6251          } /* lexp!=rexp */
6252        } /* total-order by exponent */
6253      decNumberZero(res);               /* [always a valid result] */
6254      if (result!=0) {                  /* must be -1 or +1 */
6255        *res->lsu=1;
6256        if (result<0) res->bits=DECNEG;
6257        }
6258      }
6259     else if (op==COMPNAN);             /* special, drop through */
6260     else {                             /* MAX or MIN, non-NaN result */
6261      Int residue=0;                    /* rounding accumulator */
6262      /* choose the operand for the result */
6263      const decNumber *choice;
6264      if (result==0) { /* operands are numerically equal */
6265        /* choose according to sign then exponent (see 754r) */
6266        uByte slhs=(lhs->bits & DECNEG);
6267        uByte srhs=(rhs->bits & DECNEG);
6268        #if DECSUBSET
6269        if (!set->extended) {           /* subset: force left-hand */
6270          op=COMPMAX;
6271          result=+1;
6272          }
6273        else
6274        #endif
6275        if (slhs!=srhs) {          /* signs differ */
6276          if (slhs) result=-1;     /* rhs is max */
6277               else result=+1;     /* lhs is max */
6278          }
6279         else if (slhs && srhs) {  /* both negative */
6280          if (lhs->exponent<rhs->exponent) result=+1;
6281                                      else result=-1;
6282          /* [if equal, use lhs, technically identical] */
6283          }
6284         else {                    /* both positive */
6285          if (lhs->exponent>rhs->exponent) result=+1;
6286                                      else result=-1;
6287          /* [ditto] */
6288          }
6289        } /* numerically equal */
6290      /* here result will be non-0; reverse if looking for MIN */
6291      if (op==COMPMIN || op==COMPMINMAG) result=-result;
6292      choice=(result>0 ? lhs : rhs);    /* choose */
6293      /* copy chosen to result, rounding if need be */
6294      decCopyFit(res, choice, set, &residue, status);
6295      decFinish(res, set, &residue, status);
6296      }
6297    }
6298  #if DECSUBSET
6299  if (allocrhs!=NULL) free(allocrhs);   /* free any storage used */
6300  if (alloclhs!=NULL) free(alloclhs);   /* .. */
6301  #endif
6302  return res;
6303  } /* decCompareOp */
6304
6305/* ------------------------------------------------------------------ */
6306/* decCompare -- compare two decNumbers by numerical value            */
6307/*                                                                    */
6308/*  This routine compares A ? B without altering them.                */
6309/*                                                                    */
6310/*  Arg1 is A, a decNumber which is not a NaN                         */
6311/*  Arg2 is B, a decNumber which is not a NaN                         */
6312/*  Arg3 is 1 for a sign-independent compare, 0 otherwise             */
6313/*                                                                    */
6314/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6315/*  (the only possible failure is an allocation error)                */
6316/* ------------------------------------------------------------------ */
6317static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6318                      Flag abs) {
6319  Int   result;                    /* result value */
6320  Int   sigr;                      /* rhs signum */
6321  Int   compare;                   /* work */
6322
6323  result=1;                                  /* assume signum(lhs) */
6324  if (ISZERO(lhs)) result=0;
6325  if (abs) {
6326    if (ISZERO(rhs)) return result;          /* LHS wins or both 0 */
6327    /* RHS is non-zero */
6328    if (result==0) return -1;                /* LHS is 0; RHS wins */
6329    /* [here, both non-zero, result=1] */
6330    }
6331   else {                                    /* signs matter */
6332    if (result && decNumberIsNegative(lhs)) result=-1;
6333    sigr=1;                                  /* compute signum(rhs) */
6334    if (ISZERO(rhs)) sigr=0;
6335     else if (decNumberIsNegative(rhs)) sigr=-1;
6336    if (result > sigr) return +1;            /* L > R, return 1 */
6337    if (result < sigr) return -1;            /* L < R, return -1 */
6338    if (result==0) return 0;                   /* both 0 */
6339    }
6340
6341  /* signums are the same; both are non-zero */
6342  if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
6343    if (decNumberIsInfinite(rhs)) {
6344      if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6345       else result=-result;                  /* only rhs infinite */
6346      }
6347    return result;
6348    }
6349  /* must compare the coefficients, allowing for exponents */
6350  if (lhs->exponent>rhs->exponent) {         /* LHS exponent larger */
6351    /* swap sides, and sign */
6352    const decNumber *temp=lhs;
6353    lhs=rhs;
6354    rhs=temp;
6355    result=-result;
6356    }
6357  compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6358                         rhs->lsu, D2U(rhs->digits),
6359                         rhs->exponent-lhs->exponent);
6360  if (compare!=BADINT) compare*=result;      /* comparison succeeded */
6361  return compare;
6362  } /* decCompare */
6363
6364/* ------------------------------------------------------------------ */
6365/* decUnitCompare -- compare two >=0 integers in Unit arrays          */
6366/*                                                                    */
6367/*  This routine compares A ? B*10**E where A and B are unit arrays   */
6368/*  A is a plain integer                                              */
6369/*  B has an exponent of E (which must be non-negative)               */
6370/*                                                                    */
6371/*  Arg1 is A first Unit (lsu)                                        */
6372/*  Arg2 is A length in Units                                         */
6373/*  Arg3 is B first Unit (lsu)                                        */
6374/*  Arg4 is B length in Units                                         */
6375/*  Arg5 is E (0 if the units are aligned)                            */
6376/*                                                                    */
6377/*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6378/*  (the only possible failure is an allocation error, which can      */
6379/*  only occur if E!=0)                                               */
6380/* ------------------------------------------------------------------ */
6381static Int decUnitCompare(const Unit *a, Int alength,
6382                          const Unit *b, Int blength, Int exp) {
6383  Unit  *acc;                      /* accumulator for result */
6384  Unit  accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6385  Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated */
6386  Int   accunits, need;            /* units in use or needed for acc */
6387  const Unit *l, *r, *u;           /* work */
6388  Int   expunits, exprem, result;  /* .. */
6389
6390  if (exp==0) {                    /* aligned; fastpath */
6391    if (alength>blength) return 1;
6392    if (alength<blength) return -1;
6393    /* same number of units in both -- need unit-by-unit compare */
6394    l=a+alength-1;
6395    r=b+alength-1;
6396    for (;l>=a; l--, r--) {
6397      if (*l>*r) return 1;
6398      if (*l<*r) return -1;
6399      }
6400    return 0;                      /* all units match */
6401    } /* aligned */
6402
6403  /* Unaligned.  If one is >1 unit longer than the other, padded */
6404  /* approximately, then can return easily */
6405  if (alength>blength+(Int)D2U(exp)) return 1;
6406  if (alength+1<blength+(Int)D2U(exp)) return -1;
6407
6408  /* Need to do a real subtract.  For this, a result buffer is needed */
6409  /* even though only the sign is of interest.  Its length needs */
6410  /* to be the larger of alength and padded blength, +2 */
6411  need=blength+D2U(exp);                /* maximum real length of B */
6412  if (need<alength) need=alength;
6413  need+=2;
6414  acc=accbuff;                          /* assume use local buffer */
6415  if (need*sizeof(Unit)>sizeof(accbuff)) {
6416    allocacc=(Unit *)malloc(need*sizeof(Unit));
6417    if (allocacc==NULL) return BADINT;  /* hopeless -- abandon */
6418    acc=allocacc;
6419    }
6420  /* Calculate units and remainder from exponent. */
6421  expunits=exp/DECDPUN;
6422  exprem=exp%DECDPUN;
6423  /* subtract [A+B*(-m)] */
6424  accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6425                         -(Int)powers[exprem]);
6426  /* [UnitAddSub result may have leading zeros, even on zero] */
6427  if (accunits<0) result=-1;            /* negative result */
6428   else {                               /* non-negative result */
6429    /* check units of the result before freeing any storage */
6430    for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6431    result=(*u==0 ? 0 : +1);
6432    }
6433  /* clean up and return the result */
6434  if (allocacc!=NULL) free(allocacc);   /* drop any storage used */
6435  return result;
6436  } /* decUnitCompare */
6437
6438/* ------------------------------------------------------------------ */
6439/* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
6440/*                                                                    */
6441/*  This routine performs the calculation:                            */
6442/*                                                                    */
6443/*  C=A+(B*M)                                                         */
6444/*                                                                    */
6445/*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.          */
6446/*                                                                    */
6447/*  A may be shorter or longer than B.                                */
6448/*                                                                    */
6449/*  Leading zeros are not removed after a calculation.  The result is */
6450/*  either the same length as the longer of A and B (adding any       */
6451/*  shift), or one Unit longer than that (if a Unit carry occurred).  */
6452/*                                                                    */
6453/*  A and B content are not altered unless C is also A or B.          */
6454/*  C may be the same array as A or B, but only if no zero padding is */
6455/*  requested (that is, C may be B only if bshift==0).                */
6456/*  C is filled from the lsu; only those units necessary to complete  */
6457/*  the calculation are referenced.                                   */
6458/*                                                                    */
6459/*  Arg1 is A first Unit (lsu)                                        */
6460/*  Arg2 is A length in Units                                         */
6461/*  Arg3 is B first Unit (lsu)                                        */
6462/*  Arg4 is B length in Units                                         */
6463/*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
6464/*  Arg6 is C first Unit (lsu)                                        */
6465/*  Arg7 is M, the multiplier                                         */
6466/*                                                                    */
6467/*  returns the count of Units written to C, which will be non-zero   */
6468/*  and negated if the result is negative.  That is, the sign of the  */
6469/*  returned Int is the sign of the result (positive for zero) and    */
6470/*  the absolute value of the Int is the count of Units.              */
6471/*                                                                    */
6472/*  It is the caller's responsibility to make sure that C size is     */
6473/*  safe, allowing space if necessary for a one-Unit carry.           */
6474/*                                                                    */
6475/*  This routine is severely performance-critical; *any* change here  */
6476/*  must be measured (timed) to assure no performance degradation.    */
6477/*  In particular, trickery here tends to be counter-productive, as   */
6478/*  increased complexity of code hurts register optimizations on      */
6479/*  register-poor architectures.  Avoiding divisions is nearly        */
6480/*  always a Good Idea, however.                                      */
6481/*                                                                    */
6482/* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
6483/* (IBM Warwick, UK) for some of the ideas used in this routine.      */
6484/* ------------------------------------------------------------------ */
6485static Int decUnitAddSub(const Unit *a, Int alength,
6486                         const Unit *b, Int blength, Int bshift,
6487                         Unit *c, Int m) {
6488  const Unit *alsu=a;              /* A lsu [need to remember it] */
6489  Unit *clsu=c;                    /* C ditto */
6490  Unit *minC;                      /* low water mark for C */
6491  Unit *maxC;                      /* high water mark for C */
6492  eInt carry=0;                    /* carry integer (could be Long) */
6493  Int  add;                        /* work */
6494  #if DECDPUN<=4                   /* myriadal, millenary, etc. */
6495  Int  est;                        /* estimated quotient */
6496  #endif
6497
6498  #if DECTRACE
6499  if (alength<1 || blength<1)
6500    printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6501  #endif
6502
6503  maxC=c+alength;                  /* A is usually the longer */
6504  minC=c+blength;                  /* .. and B the shorter */
6505  if (bshift!=0) {                 /* B is shifted; low As copy across */
6506    minC+=bshift;
6507    /* if in place [common], skip copy unless there's a gap [rare] */
6508    if (a==c && bshift<=alength) {
6509      c+=bshift;
6510      a+=bshift;
6511      }
6512     else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
6513      if (a<alsu+alength) *c=*a;
6514       else *c=0;
6515      }
6516    }
6517  if (minC>maxC) { /* swap */
6518    Unit *hold=minC;
6519    minC=maxC;
6520    maxC=hold;
6521    }
6522
6523  /* For speed, do the addition as two loops; the first where both A */
6524  /* and B contribute, and the second (if necessary) where only one or */
6525  /* other of the numbers contribute. */
6526  /* Carry handling is the same (i.e., duplicated) in each case. */
6527  for (; c<minC; c++) {
6528    carry+=*a;
6529    a++;
6530    carry+=((eInt)*b)*m;                /* [special-casing m=1/-1 */
6531    b++;                                /* here is not a win] */
6532    /* here carry is new Unit of digits; it could be +ve or -ve */
6533    if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX */
6534      *c=(Unit)carry;
6535      carry=0;
6536      continue;
6537      }
6538    #if DECDPUN==4                           /* use divide-by-multiply */
6539      if (carry>=0) {
6540        est=(((ueInt)carry>>11)*53687)>>18;
6541        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6542        carry=est;                           /* likely quotient [89%] */
6543        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6544        carry++;
6545        *c-=DECDPUNMAX+1;
6546        continue;
6547        }
6548      /* negative case */
6549      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6550      est=(((ueInt)carry>>11)*53687)>>18;
6551      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6552      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6553      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6554      carry++;
6555      *c-=DECDPUNMAX+1;
6556    #elif DECDPUN==3
6557      if (carry>=0) {
6558        est=(((ueInt)carry>>3)*16777)>>21;
6559        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6560        carry=est;                           /* likely quotient [99%] */
6561        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6562        carry++;
6563        *c-=DECDPUNMAX+1;
6564        continue;
6565        }
6566      /* negative case */
6567      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6568      est=(((ueInt)carry>>3)*16777)>>21;
6569      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6570      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6571      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6572      carry++;
6573      *c-=DECDPUNMAX+1;
6574    #elif DECDPUN<=2
6575      /* Can use QUOT10 as carry <= 4 digits */
6576      if (carry>=0) {
6577        est=QUOT10(carry, DECDPUN);
6578        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6579        carry=est;                           /* quotient */
6580        continue;
6581        }
6582      /* negative case */
6583      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6584      est=QUOT10(carry, DECDPUN);
6585      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6586      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6587    #else
6588      /* remainder operator is undefined if negative, so must test */
6589      if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
6590        *c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
6591        carry=1;
6592        continue;
6593        }
6594      if (carry>=0) {
6595        *c=(Unit)(carry%(DECDPUNMAX+1));
6596        carry=carry/(DECDPUNMAX+1);
6597        continue;
6598        }
6599      /* negative case */
6600      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6601      *c=(Unit)(carry%(DECDPUNMAX+1));
6602      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6603    #endif
6604    } /* c */
6605
6606  /* now may have one or other to complete */
6607  /* [pretest to avoid loop setup/shutdown] */
6608  if (c<maxC) for (; c<maxC; c++) {
6609    if (a<alsu+alength) {               /* still in A */
6610      carry+=*a;
6611      a++;
6612      }
6613     else {                             /* inside B */
6614      carry+=((eInt)*b)*m;
6615      b++;
6616      }
6617    /* here carry is new Unit of digits; it could be +ve or -ve and */
6618    /* magnitude up to DECDPUNMAX squared */
6619    if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX */
6620      *c=(Unit)carry;
6621      carry=0;
6622      continue;
6623      }
6624    /* result for this unit is negative or >DECDPUNMAX */
6625    #if DECDPUN==4                           /* use divide-by-multiply */
6626      if (carry>=0) {
6627        est=(((ueInt)carry>>11)*53687)>>18;
6628        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6629        carry=est;                           /* likely quotient [79.7%] */
6630        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6631        carry++;
6632        *c-=DECDPUNMAX+1;
6633        continue;
6634        }
6635      /* negative case */
6636      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6637      est=(((ueInt)carry>>11)*53687)>>18;
6638      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6639      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6640      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6641      carry++;
6642      *c-=DECDPUNMAX+1;
6643    #elif DECDPUN==3
6644      if (carry>=0) {
6645        est=(((ueInt)carry>>3)*16777)>>21;
6646        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6647        carry=est;                           /* likely quotient [99%] */
6648        if (*c<DECDPUNMAX+1) continue;       /* estimate was correct */
6649        carry++;
6650        *c-=DECDPUNMAX+1;
6651        continue;
6652        }
6653      /* negative case */
6654      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6655      est=(((ueInt)carry>>3)*16777)>>21;
6656      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6657      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6658      if (*c<DECDPUNMAX+1) continue;         /* was OK */
6659      carry++;
6660      *c-=DECDPUNMAX+1;
6661    #elif DECDPUN<=2
6662      if (carry>=0) {
6663        est=QUOT10(carry, DECDPUN);
6664        *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6665        carry=est;                           /* quotient */
6666        continue;
6667        }
6668      /* negative case */
6669      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6670      est=QUOT10(carry, DECDPUN);
6671      *c=(Unit)(carry-est*(DECDPUNMAX+1));
6672      carry=est-(DECDPUNMAX+1);              /* correctly negative */
6673    #else
6674      if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
6675        *c=(Unit)(carry-(DECDPUNMAX+1));
6676        carry=1;
6677        continue;
6678        }
6679      /* remainder operator is undefined if negative, so must test */
6680      if (carry>=0) {
6681        *c=(Unit)(carry%(DECDPUNMAX+1));
6682        carry=carry/(DECDPUNMAX+1);
6683        continue;
6684        }
6685      /* negative case */
6686      carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6687      *c=(Unit)(carry%(DECDPUNMAX+1));
6688      carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6689    #endif
6690    } /* c */
6691
6692  /* OK, all A and B processed; might still have carry or borrow */
6693  /* return number of Units in the result, negated if a borrow */
6694  if (carry==0) return c-clsu;     /* no carry, so no more to do */
6695  if (carry>0) {                   /* positive carry */
6696    *c=(Unit)carry;                /* place as new unit */
6697    c++;                           /* .. */
6698    return c-clsu;
6699    }
6700  /* -ve carry: it's a borrow; complement needed */
6701  add=1;                           /* temporary carry... */
6702  for (c=clsu; c<maxC; c++) {
6703    add=DECDPUNMAX+add-*c;
6704    if (add<=DECDPUNMAX) {
6705      *c=(Unit)add;
6706      add=0;
6707      }
6708     else {
6709      *c=0;
6710      add=1;
6711      }
6712    }
6713  /* add an extra unit iff it would be non-zero */
6714  #if DECTRACE
6715    printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6716  #endif
6717  if ((add-carry-1)!=0) {
6718    *c=(Unit)(add-carry-1);
6719    c++;                      /* interesting, include it */
6720    }
6721  return clsu-c;              /* -ve result indicates borrowed */
6722  } /* decUnitAddSub */
6723
6724/* ------------------------------------------------------------------ */
6725/* decTrim -- trim trailing zeros or normalize                        */
6726/*                                                                    */
6727/*   dn is the number to trim or normalize                            */
6728/*   set is the context to use to check for clamp                     */
6729/*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
6730/*   dropped returns the number of discarded trailing zeros           */
6731/*   returns dn                                                       */
6732/*                                                                    */
6733/* If clamp is set in the context then the number of zeros trimmed    */
6734/* may be limited if the exponent is high.                            */
6735/* All fields are updated as required.  This is a utility operation,  */
6736/* so special values are unchanged and no error is possible.          */
6737/* ------------------------------------------------------------------ */
6738static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6739                           Int *dropped) {
6740  Int   d, exp;                    /* work */
6741  uInt  cut;                       /* .. */
6742  Unit  *up;                       /* -> current Unit */
6743
6744  #if DECCHECK
6745  if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6746  #endif
6747
6748  *dropped=0;                           /* assume no zeros dropped */
6749  if ((dn->bits & DECSPECIAL)           /* fast exit if special .. */
6750    || (*dn->lsu & 0x01)) return dn;    /* .. or odd */
6751  if (ISZERO(dn)) {                     /* .. or 0 */
6752    dn->exponent=0;                     /* (sign is preserved) */
6753    return dn;
6754    }
6755
6756  /* have a finite number which is even */
6757  exp=dn->exponent;
6758  cut=1;                           /* digit (1-DECDPUN) in Unit */
6759  up=dn->lsu;                      /* -> current Unit */
6760  for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6761    /* slice by powers */
6762    #if DECDPUN<=4
6763      uInt quot=QUOT10(*up, cut);
6764      if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
6765    #else
6766      if (*up%powers[cut]!=0) break;         /* found non-0 digit */
6767    #endif
6768    /* have a trailing 0 */
6769    if (!all) {                    /* trimming */
6770      /* [if exp>0 then all trailing 0s are significant for trim] */
6771      if (exp<=0) {                /* if digit might be significant */
6772        if (exp==0) break;         /* then quit */
6773        exp++;                     /* next digit might be significant */
6774        }
6775      }
6776    cut++;                         /* next power */
6777    if (cut>DECDPUN) {             /* need new Unit */
6778      up++;
6779      cut=1;
6780      }
6781    } /* d */
6782  if (d==0) return dn;             /* none to drop */
6783
6784  /* may need to limit drop if clamping */
6785  if (set->clamp) {
6786    Int maxd=set->emax-set->digits+1-dn->exponent;
6787    if (maxd<=0) return dn;        /* nothing possible */
6788    if (d>maxd) d=maxd;
6789    }
6790
6791  /* effect the drop */
6792  decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6793  dn->exponent+=d;                 /* maintain numerical value */
6794  dn->digits-=d;                   /* new length */
6795  *dropped=d;                      /* report the count */
6796  return dn;
6797  } /* decTrim */
6798
6799/* ------------------------------------------------------------------ */
6800/* decReverse -- reverse a Unit array in place                        */
6801/*                                                                    */
6802/*   ulo    is the start of the array                                 */
6803/*   uhi    is the end of the array (highest Unit to include)         */
6804/*                                                                    */
6805/* The units ulo through uhi are reversed in place (if the number     */
6806/* of units is odd, the middle one is untouched).  Note that the      */
6807/* digit(s) in each unit are unaffected.                              */
6808/* ------------------------------------------------------------------ */
6809static void decReverse(Unit *ulo, Unit *uhi) {
6810  Unit temp;
6811  for (; ulo<uhi; ulo++, uhi--) {
6812    temp=*ulo;
6813    *ulo=*uhi;
6814    *uhi=temp;
6815    }
6816  return;
6817  } /* decReverse */
6818
6819/* ------------------------------------------------------------------ */
6820/* decShiftToMost -- shift digits in array towards most significant   */
6821/*                                                                    */
6822/*   uar    is the array                                              */
6823/*   digits is the count of digits in use in the array                */
6824/*   shift  is the number of zeros to pad with (least significant);   */
6825/*     it must be zero or positive                                    */
6826/*                                                                    */
6827/*   returns the new length of the integer in the array, in digits    */
6828/*                                                                    */
6829/* No overflow is permitted (that is, the uar array must be known to  */
6830/* be large enough to hold the result, after shifting).               */
6831/* ------------------------------------------------------------------ */
6832static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6833  Unit  *target, *source, *first;  /* work */
6834  Int   cut;                       /* odd 0's to add */
6835  uInt  next;                      /* work */
6836
6837  if (shift==0) return digits;     /* [fastpath] nothing to do */
6838  if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
6839    *uar=(Unit)(*uar*powers[shift]);
6840    return digits+shift;
6841    }
6842
6843  next=0;                          /* all paths */
6844  source=uar+D2U(digits)-1;        /* where msu comes from */
6845  target=source+D2U(shift);        /* where upper part of first cut goes */
6846  cut=DECDPUN-MSUDIGITS(shift);    /* where to slice */
6847  if (cut==0) {                    /* unit-boundary case */
6848    for (; source>=uar; source--, target--) *target=*source;
6849    }
6850   else {
6851    first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6852    for (; source>=uar; source--, target--) {
6853      /* split the source Unit and accumulate remainder for next */
6854      #if DECDPUN<=4
6855        uInt quot=QUOT10(*source, cut);
6856        uInt rem=*source-quot*powers[cut];
6857        next+=quot;
6858      #else
6859        uInt rem=*source%powers[cut];
6860        next+=*source/powers[cut];
6861      #endif
6862      if (target<=first) *target=(Unit)next;   /* write to target iff valid */
6863      next=rem*powers[DECDPUN-cut];            /* save remainder for next Unit */
6864      }
6865    } /* shift-move */
6866
6867  /* propagate any partial unit to one below and clear the rest */
6868  for (; target>=uar; target--) {
6869    *target=(Unit)next;
6870    next=0;
6871    }
6872  return digits+shift;
6873  } /* decShiftToMost */
6874
6875/* ------------------------------------------------------------------ */
6876/* decShiftToLeast -- shift digits in array towards least significant */
6877/*                                                                    */
6878/*   uar   is the array                                               */
6879/*   units is length of the array, in units                           */
6880/*   shift is the number of digits to remove from the lsu end; it     */
6881/*     must be zero or positive and <= than units*DECDPUN.            */
6882/*                                                                    */
6883/*   returns the new length of the integer in the array, in units     */
6884/*                                                                    */
6885/* Removed digits are discarded (lost).  Units not required to hold   */
6886/* the final result are unchanged.                                    */
6887/* ------------------------------------------------------------------ */
6888static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6889  Unit  *target, *up;              /* work */
6890  Int   cut, count;                /* work */
6891  Int   quot, rem;                 /* for division */
6892
6893  if (shift==0) return units;      /* [fastpath] nothing to do */
6894  if (shift==units*DECDPUN) {      /* [fastpath] little to do */
6895    *uar=0;                        /* all digits cleared gives zero */
6896    return 1;                      /* leaves just the one */
6897    }
6898
6899  target=uar;                      /* both paths */
6900  cut=MSUDIGITS(shift);
6901  if (cut==DECDPUN) {              /* unit-boundary case; easy */
6902    up=uar+D2U(shift);
6903    for (; up<uar+units; target++, up++) *target=*up;
6904    return target-uar;
6905    }
6906
6907  /* messier */
6908  up=uar+D2U(shift-cut);           /* source; correct to whole Units */
6909  count=units*DECDPUN-shift;       /* the maximum new length */
6910  #if DECDPUN<=4
6911    quot=QUOT10(*up, cut);
6912  #else
6913    quot=*up/powers[cut];
6914  #endif
6915  for (; ; target++) {
6916    *target=(Unit)quot;
6917    count-=(DECDPUN-cut);
6918    if (count<=0) break;
6919    up++;
6920    quot=*up;
6921    #if DECDPUN<=4
6922      quot=QUOT10(quot, cut);
6923      rem=*up-quot*powers[cut];
6924    #else
6925      rem=quot%powers[cut];
6926      quot=quot/powers[cut];
6927    #endif
6928    *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6929    count-=cut;
6930    if (count<=0) break;
6931    }
6932  return target-uar+1;
6933  } /* decShiftToLeast */
6934
6935#if DECSUBSET
6936/* ------------------------------------------------------------------ */
6937/* decRoundOperand -- round an operand  [used for subset only]        */
6938/*                                                                    */
6939/*   dn is the number to round (dn->digits is > set->digits)          */
6940/*   set is the relevant context                                      */
6941/*   status is the status accumulator                                 */
6942/*                                                                    */
6943/*   returns an allocated decNumber with the rounded result.          */
6944/*                                                                    */
6945/* lostDigits and other status may be set by this.                    */
6946/*                                                                    */
6947/* Since the input is an operand, it must not be modified.            */
6948/* Instead, return an allocated decNumber, rounded as required.       */
6949/* It is the caller's responsibility to free the allocated storage.   */
6950/*                                                                    */
6951/* If no storage is available then the result cannot be used, so NULL */
6952/* is returned.                                                       */
6953/* ------------------------------------------------------------------ */
6954static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6955                                  uInt *status) {
6956  decNumber *res;                       /* result structure */
6957  uInt newstatus=0;                     /* status from round */
6958  Int  residue=0;                       /* rounding accumulator */
6959
6960  /* Allocate storage for the returned decNumber, big enough for the */
6961  /* length specified by the context */
6962  res=(decNumber *)malloc(sizeof(decNumber)
6963                          +(D2U(set->digits)-1)*sizeof(Unit));
6964  if (res==NULL) {
6965    *status|=DEC_Insufficient_storage;
6966    return NULL;
6967    }
6968  decCopyFit(res, dn, set, &residue, &newstatus);
6969  decApplyRound(res, set, residue, &newstatus);
6970
6971  /* If that set Inexact then "lost digits" is raised... */
6972  if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6973  *status|=newstatus;
6974  return res;
6975  } /* decRoundOperand */
6976#endif
6977
6978/* ------------------------------------------------------------------ */
6979/* decCopyFit -- copy a number, truncating the coefficient if needed  */
6980/*                                                                    */
6981/*   dest is the target decNumber                                     */
6982/*   src  is the source decNumber                                     */
6983/*   set is the context [used for length (digits) and rounding mode]  */
6984/*   residue is the residue accumulator                               */
6985/*   status contains the current status to be updated                 */
6986/*                                                                    */
6987/* (dest==src is allowed and will be a no-op if fits)                 */
6988/* All fields are updated as required.                                */
6989/* ------------------------------------------------------------------ */
6990static void decCopyFit(decNumber *dest, const decNumber *src,
6991                       decContext *set, Int *residue, uInt *status) {
6992  dest->bits=src->bits;
6993  dest->exponent=src->exponent;
6994  decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6995  } /* decCopyFit */
6996
6997/* ------------------------------------------------------------------ */
6998/* decSetCoeff -- set the coefficient of a number                     */
6999/*                                                                    */
7000/*   dn    is the number whose coefficient array is to be set.        */
7001/*         It must have space for set->digits digits                  */
7002/*   set   is the context [for size]                                  */
7003/*   lsu   -> lsu of the source coefficient [may be dn->lsu]          */
7004/*   len   is digits in the source coefficient [may be dn->digits]    */
7005/*   residue is the residue accumulator.  This has values as in       */
7006/*         decApplyRound, and will be unchanged unless the            */
7007/*         target size is less than len.  In this case, the           */
7008/*         coefficient is truncated and the residue is updated to     */
7009/*         reflect the previous residue and the dropped digits.       */
7010/*   status is the status accumulator, as usual                       */
7011/*                                                                    */
7012/* The coefficient may already be in the number, or it can be an      */
7013/* external intermediate array.  If it is in the number, lsu must ==  */
7014/* dn->lsu and len must == dn->digits.                                */
7015/*                                                                    */
7016/* Note that the coefficient length (len) may be < set->digits, and   */
7017/* in this case this merely copies the coefficient (or is a no-op     */
7018/* if dn->lsu==lsu).                                                  */
7019/*                                                                    */
7020/* Note also that (only internally, from decQuantizeOp and            */
7021/* decSetSubnormal) the value of set->digits may be less than one,    */
7022/* indicating a round to left.  This routine handles that case        */
7023/* correctly; caller ensures space.                                   */
7024/*                                                                    */
7025/* dn->digits, dn->lsu (and as required), and dn->exponent are        */
7026/* updated as necessary.   dn->bits (sign) is unchanged.              */
7027/*                                                                    */
7028/* DEC_Rounded status is set if any digits are discarded.             */
7029/* DEC_Inexact status is set if any non-zero digits are discarded, or */
7030/*                       incoming residue was non-0 (implies rounded) */
7031/* ------------------------------------------------------------------ */
7032/* mapping array: maps 0-9 to canonical residues, so that a residue */
7033/* can be adjusted in the range [-1, +1] and achieve correct rounding */
7034/*                             0  1  2  3  4  5  6  7  8  9 */
7035static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
7036static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
7037                        Int len, Int *residue, uInt *status) {
7038  Int   discard;              /* number of digits to discard */
7039  uInt  cut;                  /* cut point in Unit */
7040  const Unit *up;             /* work */
7041  Unit  *target;              /* .. */
7042  Int   count;                /* .. */
7043  #if DECDPUN<=4
7044  uInt  temp;                 /* .. */
7045  #endif
7046
7047  discard=len-set->digits;    /* digits to discard */
7048  if (discard<=0) {           /* no digits are being discarded */
7049    if (dn->lsu!=lsu) {       /* copy needed */
7050      /* copy the coefficient array to the result number; no shift needed */
7051      count=len;              /* avoids D2U */
7052      up=lsu;
7053      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7054        *target=*up;
7055      dn->digits=len;         /* set the new length */
7056      }
7057    /* dn->exponent and residue are unchanged, record any inexactitude */
7058    if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
7059    return;
7060    }
7061
7062  /* some digits must be discarded ... */
7063  dn->exponent+=discard;      /* maintain numerical value */
7064  *status|=DEC_Rounded;       /* accumulate Rounded status */
7065  if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
7066
7067  if (discard>len) {          /* everything, +1, is being discarded */
7068    /* guard digit is 0 */
7069    /* residue is all the number [NB could be all 0s] */
7070    if (*residue<=0) {        /* not already positive */
7071      count=len;              /* avoids D2U */
7072      for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
7073        *residue=1;
7074        break;                /* no need to check any others */
7075        }
7076      }
7077    if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7078    *dn->lsu=0;               /* coefficient will now be 0 */
7079    dn->digits=1;             /* .. */
7080    return;
7081    } /* total discard */
7082
7083  /* partial discard [most common case] */
7084  /* here, at least the first (most significant) discarded digit exists */
7085
7086  /* spin up the number, noting residue during the spin, until get to */
7087  /* the Unit with the first discarded digit.  When reach it, extract */
7088  /* it and remember its position */
7089  count=0;
7090  for (up=lsu;; up++) {
7091    count+=DECDPUN;
7092    if (count>=discard) break; /* full ones all checked */
7093    if (*up!=0) *residue=1;
7094    } /* up */
7095
7096  /* here up -> Unit with first discarded digit */
7097  cut=discard-(count-DECDPUN)-1;
7098  if (cut==DECDPUN-1) {       /* unit-boundary case (fast) */
7099    Unit half=(Unit)powers[DECDPUN]>>1;
7100    /* set residue directly */
7101    if (*up>=half) {
7102      if (*up>half) *residue=7;
7103      else *residue+=5;       /* add sticky bit */
7104      }
7105     else { /* <half */
7106      if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
7107      }
7108    if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
7109      *dn->lsu=0;             /* .. result is 0 */
7110      dn->digits=1;           /* .. */
7111      }
7112     else {                   /* shift to least */
7113      count=set->digits;      /* now digits to end up with */
7114      dn->digits=count;       /* set the new length */
7115      up++;                   /* move to next */
7116      /* on unit boundary, so shift-down copy loop is simple */
7117      for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7118        *target=*up;
7119      }
7120    } /* unit-boundary case */
7121
7122   else { /* discard digit is in low digit(s), and not top digit */
7123    uInt  discard1;                /* first discarded digit */
7124    uInt  quot, rem;               /* for divisions */
7125    if (cut==0) quot=*up;          /* is at bottom of unit */
7126     else /* cut>0 */ {            /* it's not at bottom of unit */
7127      #if DECDPUN<=4
7128        quot=QUOT10(*up, cut);
7129        rem=*up-quot*powers[cut];
7130      #else
7131        rem=*up%powers[cut];
7132        quot=*up/powers[cut];
7133      #endif
7134      if (rem!=0) *residue=1;
7135      }
7136    /* discard digit is now at bottom of quot */
7137    #if DECDPUN<=4
7138      temp=(quot*6554)>>16;        /* fast /10 */
7139      /* Vowels algorithm here not a win (9 instructions) */
7140      discard1=quot-X10(temp);
7141      quot=temp;
7142    #else
7143      discard1=quot%10;
7144      quot=quot/10;
7145    #endif
7146    /* here, discard1 is the guard digit, and residue is everything */
7147    /* else [use mapping array to accumulate residue safely] */
7148    *residue+=resmap[discard1];
7149    cut++;                         /* update cut */
7150    /* here: up -> Unit of the array with bottom digit */
7151    /*       cut is the division point for each Unit */
7152    /*       quot holds the uncut high-order digits for the current unit */
7153    if (set->digits<=0) {          /* special for Quantize/Subnormal :-( */
7154      *dn->lsu=0;                  /* .. result is 0 */
7155      dn->digits=1;                /* .. */
7156      }
7157     else {                        /* shift to least needed */
7158      count=set->digits;           /* now digits to end up with */
7159      dn->digits=count;            /* set the new length */
7160      /* shift-copy the coefficient array to the result number */
7161      for (target=dn->lsu; ; target++) {
7162        *target=(Unit)quot;
7163        count-=(DECDPUN-cut);
7164        if (count<=0) break;
7165        up++;
7166        quot=*up;
7167        #if DECDPUN<=4
7168          quot=QUOT10(quot, cut);
7169          rem=*up-quot*powers[cut];
7170        #else
7171          rem=quot%powers[cut];
7172          quot=quot/powers[cut];
7173        #endif
7174        *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7175        count-=cut;
7176        if (count<=0) break;
7177        } /* shift-copy loop */
7178      } /* shift to least */
7179    } /* not unit boundary */
7180
7181  if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7182  return;
7183  } /* decSetCoeff */
7184
7185/* ------------------------------------------------------------------ */
7186/* decApplyRound -- apply pending rounding to a number                */
7187/*                                                                    */
7188/*   dn    is the number, with space for set->digits digits           */
7189/*   set   is the context [for size and rounding mode]                */
7190/*   residue indicates pending rounding, being any accumulated        */
7191/*         guard and sticky information.  It may be:                  */
7192/*         6-9: rounding digit is >5                                  */
7193/*         5:   rounding digit is exactly half-way                    */
7194/*         1-4: rounding digit is <5 and >0                           */
7195/*         0:   the coefficient is exact                              */
7196/*        -1:   as 1, but the hidden digits are subtractive, that     */
7197/*              is, of the opposite sign to dn.  In this case the     */
7198/*              coefficient must be non-0.  This case occurs when     */
7199/*              subtracting a small number (which can be reduced to   */
7200/*              a sticky bit); see decAddOp.                          */
7201/*   status is the status accumulator, as usual                       */
7202/*                                                                    */
7203/* This routine applies rounding while keeping the length of the      */
7204/* coefficient constant.  The exponent and status are unchanged       */
7205/* except if:                                                         */
7206/*                                                                    */
7207/*   -- the coefficient was increased and is all nines (in which      */
7208/*      case Overflow could occur, and is handled directly here so    */
7209/*      the caller does not need to re-test for overflow)             */
7210/*                                                                    */
7211/*   -- the coefficient was decreased and becomes all nines (in which */
7212/*      case Underflow could occur, and is also handled directly).    */
7213/*                                                                    */
7214/* All fields in dn are updated as required.                          */
7215/*                                                                    */
7216/* ------------------------------------------------------------------ */
7217static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7218                          uInt *status) {
7219  Int  bump;                  /* 1 if coefficient needs to be incremented */
7220                              /* -1 if coefficient needs to be decremented */
7221
7222  if (residue==0) return;     /* nothing to apply */
7223
7224  bump=0;                     /* assume a smooth ride */
7225
7226  /* now decide whether, and how, to round, depending on mode */
7227  switch (set->round) {
7228    case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
7229      /* This is the same as DEC_ROUND_DOWN unless there is a */
7230      /* positive residue and the lsd of dn is 0 or 5, in which case */
7231      /* it is bumped; when residue is <0, the number is therefore */
7232      /* bumped down unless the final digit was 1 or 6 (in which */
7233      /* case it is bumped down and then up -- a no-op) */
7234      Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
7235      if (residue<0 && lsd5!=1) bump=-1;
7236       else if (residue>0 && lsd5==0) bump=1;
7237      /* [bump==1 could be applied directly; use common path for clarity] */
7238      break;} /* r-05 */
7239
7240    case DEC_ROUND_DOWN: {
7241      /* no change, except if negative residue */
7242      if (residue<0) bump=-1;
7243      break;} /* r-d */
7244
7245    case DEC_ROUND_HALF_DOWN: {
7246      if (residue>5) bump=1;
7247      break;} /* r-h-d */
7248
7249    case DEC_ROUND_HALF_EVEN: {
7250      if (residue>5) bump=1;            /* >0.5 goes up */
7251       else if (residue==5) {           /* exactly 0.5000... */
7252        /* 0.5 goes up iff [new] lsd is odd */
7253        if (*dn->lsu & 0x01) bump=1;
7254        }
7255      break;} /* r-h-e */
7256
7257    case DEC_ROUND_HALF_UP: {
7258      if (residue>=5) bump=1;
7259      break;} /* r-h-u */
7260
7261    case DEC_ROUND_UP: {
7262      if (residue>0) bump=1;
7263      break;} /* r-u */
7264
7265    case DEC_ROUND_CEILING: {
7266      /* same as _UP for positive numbers, and as _DOWN for negatives */
7267      /* [negative residue cannot occur on 0] */
7268      if (decNumberIsNegative(dn)) {
7269        if (residue<0) bump=-1;
7270        }
7271       else {
7272        if (residue>0) bump=1;
7273        }
7274      break;} /* r-c */
7275
7276    case DEC_ROUND_FLOOR: {
7277      /* same as _UP for negative numbers, and as _DOWN for positive */
7278      /* [negative residue cannot occur on 0] */
7279      if (!decNumberIsNegative(dn)) {
7280        if (residue<0) bump=-1;
7281        }
7282       else {
7283        if (residue>0) bump=1;
7284        }
7285      break;} /* r-f */
7286
7287    default: {      /* e.g., DEC_ROUND_MAX */
7288      *status|=DEC_Invalid_context;
7289      #if DECTRACE || (DECCHECK && DECVERB)
7290      printf("Unknown rounding mode: %d\n", set->round);
7291      #endif
7292      break;}
7293    } /* switch */
7294
7295  /* now bump the number, up or down, if need be */
7296  if (bump==0) return;                       /* no action required */
7297
7298  /* Simply use decUnitAddSub unless bumping up and the number is */
7299  /* all nines.  In this special case set to 100... explicitly */
7300  /* and adjust the exponent by one (as otherwise could overflow */
7301  /* the array) */
7302  /* Similarly handle all-nines result if bumping down. */
7303  if (bump>0) {
7304    Unit *up;                                /* work */
7305    uInt count=dn->digits;                   /* digits to be checked */
7306    for (up=dn->lsu; ; up++) {
7307      if (count<=DECDPUN) {
7308        /* this is the last Unit (the msu) */
7309        if (*up!=powers[count]-1) break;     /* not still 9s */
7310        /* here if it, too, is all nines */
7311        *up=(Unit)powers[count-1];           /* here 999 -> 100 etc. */
7312        for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7313        dn->exponent++;                      /* and bump exponent */
7314        /* [which, very rarely, could cause Overflow...] */
7315        if ((dn->exponent+dn->digits)>set->emax+1) {
7316          decSetOverflow(dn, set, status);
7317          }
7318        return;                              /* done */
7319        }
7320      /* a full unit to check, with more to come */
7321      if (*up!=DECDPUNMAX) break;            /* not still 9s */
7322      count-=DECDPUN;
7323      } /* up */
7324    } /* bump>0 */
7325   else {                                    /* -1 */
7326    /* here checking for a pre-bump of 1000... (leading 1, all */
7327    /* other digits zero) */
7328    Unit *up, *sup;                          /* work */
7329    uInt count=dn->digits;                   /* digits to be checked */
7330    for (up=dn->lsu; ; up++) {
7331      if (count<=DECDPUN) {
7332        /* this is the last Unit (the msu) */
7333        if (*up!=powers[count-1]) break;     /* not 100.. */
7334        /* here if have the 1000... case */
7335        sup=up;                              /* save msu pointer */
7336        *up=(Unit)powers[count]-1;           /* here 100 in msu -> 999 */
7337        /* others all to all-nines, too */
7338        for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7339        dn->exponent--;                      /* and bump exponent */
7340
7341        /* iff the number was at the subnormal boundary (exponent=etiny) */
7342        /* then the exponent is now out of range, so it will in fact get */
7343        /* clamped to etiny and the final 9 dropped. */
7344        /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7345        /*        dn->exponent, set->digits); */
7346        if (dn->exponent+1==set->emin-set->digits+1) {
7347          if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
7348           else {
7349            *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
7350            dn->digits--;
7351            }
7352          dn->exponent++;
7353          *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7354          }
7355        return;                              /* done */
7356        }
7357
7358      /* a full unit to check, with more to come */
7359      if (*up!=0) break;                     /* not still 0s */
7360      count-=DECDPUN;
7361      } /* up */
7362
7363    } /* bump<0 */
7364
7365  /* Actual bump needed.  Do it. */
7366  decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7367  } /* decApplyRound */
7368
7369#if DECSUBSET
7370/* ------------------------------------------------------------------ */
7371/* decFinish -- finish processing a number                            */
7372/*                                                                    */
7373/*   dn is the number                                                 */
7374/*   set is the context                                               */
7375/*   residue is the rounding accumulator (as in decApplyRound)        */
7376/*   status is the accumulator                                        */
7377/*                                                                    */
7378/* This finishes off the current number by:                           */
7379/*    1. If not extended:                                             */
7380/*       a. Converting a zero result to clean '0'                     */
7381/*       b. Reducing positive exponents to 0, if would fit in digits  */
7382/*    2. Checking for overflow and subnormals (always)                */
7383/* Note this is just Finalize when no subset arithmetic.              */
7384/* All fields are updated as required.                                */
7385/* ------------------------------------------------------------------ */
7386static void decFinish(decNumber *dn, decContext *set, Int *residue,
7387                      uInt *status) {
7388  if (!set->extended) {
7389    if ISZERO(dn) {                /* value is zero */
7390      dn->exponent=0;              /* clean exponent .. */
7391      dn->bits=0;                  /* .. and sign */
7392      return;                      /* no error possible */
7393      }
7394    if (dn->exponent>=0) {         /* non-negative exponent */
7395      /* >0; reduce to integer if possible */
7396      if (set->digits >= (dn->exponent+dn->digits)) {
7397        dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7398        dn->exponent=0;
7399        }
7400      }
7401    } /* !extended */
7402
7403  decFinalize(dn, set, residue, status);
7404  } /* decFinish */
7405#endif
7406
7407/* ------------------------------------------------------------------ */
7408/* decFinalize -- final check, clamp, and round of a number           */
7409/*                                                                    */
7410/*   dn is the number                                                 */
7411/*   set is the context                                               */
7412/*   residue is the rounding accumulator (as in decApplyRound)        */
7413/*   status is the status accumulator                                 */
7414/*                                                                    */
7415/* This finishes off the current number by checking for subnormal     */
7416/* results, applying any pending rounding, checking for overflow,     */
7417/* and applying any clamping.                                         */
7418/* Underflow and overflow conditions are raised as appropriate.       */
7419/* All fields are updated as required.                                */
7420/* ------------------------------------------------------------------ */
7421static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7422                        uInt *status) {
7423  Int shift;                            /* shift needed if clamping */
7424  Int tinyexp=set->emin-dn->digits+1;   /* precalculate subnormal boundary */
7425
7426  /* Must be careful, here, when checking the exponent as the */
7427  /* adjusted exponent could overflow 31 bits [because it may already */
7428  /* be up to twice the expected]. */
7429
7430  /* First test for subnormal.  This must be done before any final */
7431  /* round as the result could be rounded to Nmin or 0. */
7432  if (dn->exponent<=tinyexp) {          /* prefilter */
7433    Int comp;
7434    decNumber nmin;
7435    /* A very nasty case here is dn == Nmin and residue<0 */
7436    if (dn->exponent<tinyexp) {
7437      /* Go handle subnormals; this will apply round if needed. */
7438      decSetSubnormal(dn, set, residue, status);
7439      return;
7440      }
7441    /* Equals case: only subnormal if dn=Nmin and negative residue */
7442    decNumberZero(&nmin);
7443    nmin.lsu[0]=1;
7444    nmin.exponent=set->emin;
7445    comp=decCompare(dn, &nmin, 1);                /* (signless compare) */
7446    if (comp==BADINT) {                           /* oops */
7447      *status|=DEC_Insufficient_storage;          /* abandon... */
7448      return;
7449      }
7450    if (*residue<0 && comp==0) {                  /* neg residue and dn==Nmin */
7451      decApplyRound(dn, set, *residue, status);   /* might force down */
7452      decSetSubnormal(dn, set, residue, status);
7453      return;
7454      }
7455    }
7456
7457  /* now apply any pending round (this could raise overflow). */
7458  if (*residue!=0) decApplyRound(dn, set, *residue, status);
7459
7460  /* Check for overflow [redundant in the 'rare' case] or clamp */
7461  if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
7462
7463
7464  /* here when might have an overflow or clamp to do */
7465  if (dn->exponent>set->emax-dn->digits+1) {           /* too big */
7466    decSetOverflow(dn, set, status);
7467    return;
7468    }
7469  /* here when the result is normal but in clamp range */
7470  if (!set->clamp) return;
7471
7472  /* here when need to apply the IEEE exponent clamp (fold-down) */
7473  shift=dn->exponent-(set->emax-set->digits+1);
7474
7475  /* shift coefficient (if non-zero) */
7476  if (!ISZERO(dn)) {
7477    dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7478    }
7479  dn->exponent-=shift;   /* adjust the exponent to match */
7480  *status|=DEC_Clamped;  /* and record the dirty deed */
7481  return;
7482  } /* decFinalize */
7483
7484/* ------------------------------------------------------------------ */
7485/* decSetOverflow -- set number to proper overflow value              */
7486/*                                                                    */
7487/*   dn is the number (used for sign [only] and result)               */
7488/*   set is the context [used for the rounding mode, etc.]            */
7489/*   status contains the current status to be updated                 */
7490/*                                                                    */
7491/* This sets the sign of a number and sets its value to either        */
7492/* Infinity or the maximum finite value, depending on the sign of     */
7493/* dn and the rounding mode, following IEEE 854 rules.                */
7494/* ------------------------------------------------------------------ */
7495static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7496  Flag needmax=0;                  /* result is maximum finite value */
7497  uByte sign=dn->bits&DECNEG;      /* clean and save sign bit */
7498
7499  if (ISZERO(dn)) {                /* zero does not overflow magnitude */
7500    Int emax=set->emax;                      /* limit value */
7501    if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
7502    if (dn->exponent>emax) {                 /* clamp required */
7503      dn->exponent=emax;
7504      *status|=DEC_Clamped;
7505      }
7506    return;
7507    }
7508
7509  decNumberZero(dn);
7510  switch (set->round) {
7511    case DEC_ROUND_DOWN: {
7512      needmax=1;                   /* never Infinity */
7513      break;} /* r-d */
7514    case DEC_ROUND_05UP: {
7515      needmax=1;                   /* never Infinity */
7516      break;} /* r-05 */
7517    case DEC_ROUND_CEILING: {
7518      if (sign) needmax=1;         /* Infinity if non-negative */
7519      break;} /* r-c */
7520    case DEC_ROUND_FLOOR: {
7521      if (!sign) needmax=1;        /* Infinity if negative */
7522      break;} /* r-f */
7523    default: break;                /* Infinity in all other cases */
7524    }
7525  if (needmax) {
7526    decSetMaxValue(dn, set);
7527    dn->bits=sign;                 /* set sign */
7528    }
7529   else dn->bits=sign|DECINF;      /* Value is +/-Infinity */
7530  *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7531  } /* decSetOverflow */
7532
7533/* ------------------------------------------------------------------ */
7534/* decSetMaxValue -- set number to +Nmax (maximum normal value)       */
7535/*                                                                    */
7536/*   dn is the number to set                                          */
7537/*   set is the context [used for digits and emax]                    */
7538/*                                                                    */
7539/* This sets the number to the maximum positive value.                */
7540/* ------------------------------------------------------------------ */
7541static void decSetMaxValue(decNumber *dn, decContext *set) {
7542  Unit *up;                        /* work */
7543  Int count=set->digits;           /* nines to add */
7544  dn->digits=count;
7545  /* fill in all nines to set maximum value */
7546  for (up=dn->lsu; ; up++) {
7547    if (count>DECDPUN) *up=DECDPUNMAX;  /* unit full o'nines */
7548     else {                             /* this is the msu */
7549      *up=(Unit)(powers[count]-1);
7550      break;
7551      }
7552    count-=DECDPUN;                /* filled those digits */
7553    } /* up */
7554  dn->bits=0;                      /* + sign */
7555  dn->exponent=set->emax-set->digits+1;
7556  } /* decSetMaxValue */
7557
7558/* ------------------------------------------------------------------ */
7559/* decSetSubnormal -- process value whose exponent is <Emin           */
7560/*                                                                    */
7561/*   dn is the number (used as input as well as output; it may have   */
7562/*         an allowed subnormal value, which may need to be rounded)  */
7563/*   set is the context [used for the rounding mode]                  */
7564/*   residue is any pending residue                                   */
7565/*   status contains the current status to be updated                 */
7566/*                                                                    */
7567/* If subset mode, set result to zero and set Underflow flags.        */
7568/*                                                                    */
7569/* Value may be zero with a low exponent; this does not set Subnormal */
7570/* but the exponent will be clamped to Etiny.                         */
7571/*                                                                    */
7572/* Otherwise ensure exponent is not out of range, and round as        */
7573/* necessary.  Underflow is set if the result is Inexact.             */
7574/* ------------------------------------------------------------------ */
7575static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7576                            uInt *status) {
7577  decContext workset;         /* work */
7578  Int        etiny, adjust;   /* .. */
7579
7580  #if DECSUBSET
7581  /* simple set to zero and 'hard underflow' for subset */
7582  if (!set->extended) {
7583    decNumberZero(dn);
7584    /* always full overflow */
7585    *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7586    return;
7587    }
7588  #endif
7589
7590  /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7591  /* (Etiny) if needed */
7592  etiny=set->emin-(set->digits-1);      /* smallest allowed exponent */
7593
7594  if ISZERO(dn) {                       /* value is zero */
7595    /* residue can never be non-zero here */
7596    #if DECCHECK
7597      if (*residue!=0) {
7598        printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7599        *status|=DEC_Invalid_operation;
7600        }
7601    #endif
7602    if (dn->exponent<etiny) {           /* clamp required */
7603      dn->exponent=etiny;
7604      *status|=DEC_Clamped;
7605      }
7606    return;
7607    }
7608
7609  *status|=DEC_Subnormal;               /* have a non-zero subnormal */
7610  adjust=etiny-dn->exponent;            /* calculate digits to remove */
7611  if (adjust<=0) {                      /* not out of range; unrounded */
7612    /* residue can never be non-zero here, except in the Nmin-residue */
7613    /* case (which is a subnormal result), so can take fast-path here */
7614    /* it may already be inexact (from setting the coefficient) */
7615    if (*status&DEC_Inexact) *status|=DEC_Underflow;
7616    return;
7617    }
7618
7619  /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7620  /* [this code is similar to that in rescale] */
7621  workset=*set;                         /* clone rounding, etc. */
7622  workset.digits=dn->digits-adjust;     /* set requested length */
7623  workset.emin-=adjust;                 /* and adjust emin to match */
7624  /* [note that the latter can be <1, here, similar to Rescale case] */
7625  decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7626  decApplyRound(dn, &workset, *residue, status);
7627
7628  /* Use 754R/854 default rule: Underflow is set iff Inexact */
7629  /* [independent of whether trapped] */
7630  if (*status&DEC_Inexact) *status|=DEC_Underflow;
7631
7632  /* if rounded up a 999s case, exponent will be off by one; adjust */
7633  /* back if so [it will fit, because it was shortened earlier] */
7634  if (dn->exponent>etiny) {
7635    dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7636    dn->exponent--;                     /* (re)adjust the exponent. */
7637    }
7638
7639  /* if rounded to zero, it is by definition clamped... */
7640  if (ISZERO(dn)) *status|=DEC_Clamped;
7641  } /* decSetSubnormal */
7642
7643/* ------------------------------------------------------------------ */
7644/* decCheckMath - check entry conditions for a math function          */
7645/*                                                                    */
7646/*   This checks the context and the operand                          */
7647/*                                                                    */
7648/*   rhs is the operand to check                                      */
7649/*   set is the context to check                                      */
7650/*   status is unchanged if both are good                             */
7651/*                                                                    */
7652/* returns non-zero if status is changed, 0 otherwise                 */
7653/*                                                                    */
7654/* Restrictions enforced:                                             */
7655/*                                                                    */
7656/*   digits, emax, and -emin in the context must be less than         */
7657/*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
7658/*   non-zero.  Invalid_operation is set in the status if a           */
7659/*   restriction is violated.                                         */
7660/* ------------------------------------------------------------------ */
7661static uInt decCheckMath(const decNumber *rhs, decContext *set,
7662                         uInt *status) {
7663  uInt save=*status;                         /* record */
7664  if (set->digits>DEC_MAX_MATH
7665   || set->emax>DEC_MAX_MATH
7666   || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7667   else if ((rhs->digits>DEC_MAX_MATH
7668     || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7669     || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7670     && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7671  return (*status!=save);
7672  } /* decCheckMath */
7673
7674/* ------------------------------------------------------------------ */
7675/* decGetInt -- get integer from a number                             */
7676/*                                                                    */
7677/*   dn is the number [which will not be altered]                     */
7678/*                                                                    */
7679/*   returns one of:                                                  */
7680/*     BADINT if there is a non-zero fraction                         */
7681/*     the converted integer                                          */
7682/*     BIGEVEN if the integer is even and magnitude > 2*10**9         */
7683/*     BIGODD  if the integer is odd  and magnitude > 2*10**9         */
7684/*                                                                    */
7685/* This checks and gets a whole number from the input decNumber.      */
7686/* The sign can be determined from dn by the caller when BIGEVEN or   */
7687/* BIGODD is returned.                                                */
7688/* ------------------------------------------------------------------ */
7689static Int decGetInt(const decNumber *dn) {
7690  Int  theInt;                          /* result accumulator */
7691  const Unit *up;                       /* work */
7692  Int  got;                             /* digits (real or not) processed */
7693  Int  ilength=dn->digits+dn->exponent; /* integral length */
7694  Flag neg=decNumberIsNegative(dn);     /* 1 if -ve */
7695
7696  /* The number must be an integer that fits in 10 digits */
7697  /* Assert, here, that 10 is enough for any rescale Etiny */
7698  #if DEC_MAX_EMAX > 999999999
7699    #error GetInt may need updating [for Emax]
7700  #endif
7701  #if DEC_MIN_EMIN < -999999999
7702    #error GetInt may need updating [for Emin]
7703  #endif
7704  if (ISZERO(dn)) return 0;             /* zeros are OK, with any exponent */
7705
7706  up=dn->lsu;                           /* ready for lsu */
7707  theInt=0;                             /* ready to accumulate */
7708  if (dn->exponent>=0) {                /* relatively easy */
7709    /* no fractional part [usual]; allow for positive exponent */
7710    got=dn->exponent;
7711    }
7712   else { /* -ve exponent; some fractional part to check and discard */
7713    Int count=-dn->exponent;            /* digits to discard */
7714    /* spin up whole units until reach the Unit with the unit digit */
7715    for (; count>=DECDPUN; up++) {
7716      if (*up!=0) return BADINT;        /* non-zero Unit to discard */
7717      count-=DECDPUN;
7718      }
7719    if (count==0) got=0;                /* [a multiple of DECDPUN] */
7720     else {                             /* [not multiple of DECDPUN] */
7721      Int rem;                          /* work */
7722      /* slice off fraction digits and check for non-zero */
7723      #if DECDPUN<=4
7724        theInt=QUOT10(*up, count);
7725        rem=*up-theInt*powers[count];
7726      #else
7727        rem=*up%powers[count];          /* slice off discards */
7728        theInt=*up/powers[count];
7729      #endif
7730      if (rem!=0) return BADINT;        /* non-zero fraction */
7731      /* it looks good */
7732      got=DECDPUN-count;                /* number of digits so far */
7733      up++;                             /* ready for next */
7734      }
7735    }
7736  /* now it's known there's no fractional part */
7737
7738  /* tricky code now, to accumulate up to 9.3 digits */
7739  if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7740
7741  if (ilength<11) {
7742    Int save=theInt;
7743    /* collect any remaining unit(s) */
7744    for (; got<ilength; up++) {
7745      theInt+=*up*powers[got];
7746      got+=DECDPUN;
7747      }
7748    if (ilength==10) {                  /* need to check for wrap */
7749      if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7750         /* [that test also disallows the BADINT result case] */
7751       else if (neg && theInt>1999999997) ilength=11;
7752       else if (!neg && theInt>999999999) ilength=11;
7753      if (ilength==11) theInt=save;     /* restore correct low bit */
7754      }
7755    }
7756
7757  if (ilength>10) {                     /* too big */
7758    if (theInt&1) return BIGODD;        /* bottom bit 1 */
7759    return BIGEVEN;                     /* bottom bit 0 */
7760    }
7761
7762  if (neg) theInt=-theInt;              /* apply sign */
7763  return theInt;
7764  } /* decGetInt */
7765
7766/* ------------------------------------------------------------------ */
7767/* decDecap -- decapitate the coefficient of a number                 */
7768/*                                                                    */
7769/*   dn   is the number to be decapitated                             */
7770/*   drop is the number of digits to be removed from the left of dn;  */
7771/*     this must be <= dn->digits (if equal, the coefficient is       */
7772/*     set to 0)                                                      */
7773/*                                                                    */
7774/* Returns dn; dn->digits will be <= the initial digits less drop     */
7775/* (after removing drop digits there may be leading zero digits       */
7776/* which will also be removed).  Only dn->lsu and dn->digits change.  */
7777/* ------------------------------------------------------------------ */
7778static decNumber *decDecap(decNumber *dn, Int drop) {
7779  Unit *msu;                            /* -> target cut point */
7780  Int cut;                              /* work */
7781  if (drop>=dn->digits) {               /* losing the whole thing */
7782    #if DECCHECK
7783    if (drop>dn->digits)
7784      printf("decDecap called with drop>digits [%ld>%ld]\n",
7785             (LI)drop, (LI)dn->digits);
7786    #endif
7787    dn->lsu[0]=0;
7788    dn->digits=1;
7789    return dn;
7790    }
7791  msu=dn->lsu+D2U(dn->digits-drop)-1;   /* -> likely msu */
7792  cut=MSUDIGITS(dn->digits-drop);       /* digits to be in use in msu */
7793  if (cut!=DECDPUN) *msu%=powers[cut];  /* clear left digits */
7794  /* that may have left leading zero digits, so do a proper count... */
7795  dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7796  return dn;
7797  } /* decDecap */
7798
7799/* ------------------------------------------------------------------ */
7800/* decBiStr -- compare string with pairwise options                   */
7801/*                                                                    */
7802/*   targ is the string to compare                                    */
7803/*   str1 is one of the strings to compare against (length may be 0)  */
7804/*   str2 is the other; it must be the same length as str1            */
7805/*                                                                    */
7806/*   returns 1 if strings compare equal, (that is, it is the same     */
7807/*   length as str1 and str2, and each character of targ is in either */
7808/*   str1 or str2 in the corresponding position), or 0 otherwise      */
7809/*                                                                    */
7810/* This is used for generic caseless compare, including the awkward   */
7811/* case of the Turkish dotted and dotless Is.  Use as (for example):  */
7812/*   if (decBiStr(test, "mike", "MIKE")) ...                          */
7813/* ------------------------------------------------------------------ */
7814static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7815  for (;;targ++, str1++, str2++) {
7816    if (*targ!=*str1 && *targ!=*str2) return 0;
7817    /* *targ has a match in one (or both, if terminator) */
7818    if (*targ=='\0') break;
7819    } /* forever */
7820  return 1;
7821  } /* decBiStr */
7822
7823/* ------------------------------------------------------------------ */
7824/* decNaNs -- handle NaN operand or operands                          */
7825/*                                                                    */
7826/*   res     is the result number                                     */
7827/*   lhs     is the first operand                                     */
7828/*   rhs     is the second operand, or NULL if none                   */
7829/*   context is used to limit payload length                          */
7830/*   status  contains the current status                              */
7831/*   returns res in case convenient                                   */
7832/*                                                                    */
7833/* Called when one or both operands is a NaN, and propagates the      */
7834/* appropriate result to res.  When an sNaN is found, it is changed   */
7835/* to a qNaN and Invalid operation is set.                            */
7836/* ------------------------------------------------------------------ */
7837static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7838                           const decNumber *rhs, decContext *set,
7839                           uInt *status) {
7840  /* This decision tree ends up with LHS being the source pointer, */
7841  /* and status updated if need be */
7842  if (lhs->bits & DECSNAN)
7843    *status|=DEC_Invalid_operation | DEC_sNaN;
7844   else if (rhs==NULL);
7845   else if (rhs->bits & DECSNAN) {
7846    lhs=rhs;
7847    *status|=DEC_Invalid_operation | DEC_sNaN;
7848    }
7849   else if (lhs->bits & DECNAN);
7850   else lhs=rhs;
7851
7852  /* propagate the payload */
7853  if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
7854   else { /* too long */
7855    const Unit *ul;
7856    Unit *ur, *uresp1;
7857    /* copy safe number of units, then decapitate */
7858    res->bits=lhs->bits;                /* need sign etc. */
7859    uresp1=res->lsu+D2U(set->digits);
7860    for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7861    res->digits=D2U(set->digits)*DECDPUN;
7862    /* maybe still too long */
7863    if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7864    }
7865
7866  res->bits&=~DECSNAN;        /* convert any sNaN to NaN, while */
7867  res->bits|=DECNAN;          /* .. preserving sign */
7868  res->exponent=0;            /* clean exponent */
7869                              /* [coefficient was copied/decapitated] */
7870  return res;
7871  } /* decNaNs */
7872
7873/* ------------------------------------------------------------------ */
7874/* decStatus -- apply non-zero status                                 */
7875/*                                                                    */
7876/*   dn     is the number to set if error                             */
7877/*   status contains the current status (not yet in context)          */
7878/*   set    is the context                                            */
7879/*                                                                    */
7880/* If the status is an error status, the number is set to a NaN,      */
7881/* unless the error was an overflow, divide-by-zero, or underflow,    */
7882/* in which case the number will have already been set.               */
7883/*                                                                    */
7884/* The context status is then updated with the new status.  Note that */
7885/* this may raise a signal, so control may never return from this     */
7886/* routine (hence resources must be recovered before it is called).   */
7887/* ------------------------------------------------------------------ */
7888static void decStatus(decNumber *dn, uInt status, decContext *set) {
7889  if (status & DEC_NaNs) {              /* error status -> NaN */
7890    /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7891    if (status & DEC_sNaN) status&=~DEC_sNaN;
7892     else {
7893      decNumberZero(dn);                /* other error: clean throughout */
7894      dn->bits=DECNAN;                  /* and make a quiet NaN */
7895      }
7896    }
7897  decContextSetStatus(set, status);     /* [may not return] */
7898  return;
7899  } /* decStatus */
7900
7901/* ------------------------------------------------------------------ */
7902/* decGetDigits -- count digits in a Units array                      */
7903/*                                                                    */
7904/*   uar is the Unit array holding the number (this is often an       */
7905/*          accumulator of some sort)                                 */
7906/*   len is the length of the array in units [>=1]                    */
7907/*                                                                    */
7908/*   returns the number of (significant) digits in the array          */
7909/*                                                                    */
7910/* All leading zeros are excluded, except the last if the array has   */
7911/* only zero Units.                                                   */
7912/* ------------------------------------------------------------------ */
7913/* This may be called twice during some operations. */
7914static Int decGetDigits(Unit *uar, Int len) {
7915  Unit *up=uar+(len-1);            /* -> msu */
7916  Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
7917  #if DECDPUN>4
7918  uInt const *pow;                 /* work */
7919  #endif
7920                                   /* (at least 1 in final msu) */
7921  #if DECCHECK
7922  if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7923  #endif
7924
7925  for (; up>=uar; up--) {
7926    if (*up==0) {                  /* unit is all 0s */
7927      if (digits==1) break;        /* a zero has one digit */
7928      digits-=DECDPUN;             /* adjust for 0 unit */
7929      continue;}
7930    /* found the first (most significant) non-zero Unit */
7931    #if DECDPUN>1                  /* not done yet */
7932    if (*up<10) break;             /* is 1-9 */
7933    digits++;
7934    #if DECDPUN>2                  /* not done yet */
7935    if (*up<100) break;            /* is 10-99 */
7936    digits++;
7937    #if DECDPUN>3                  /* not done yet */
7938    if (*up<1000) break;           /* is 100-999 */
7939    digits++;
7940    #if DECDPUN>4                  /* count the rest ... */
7941    for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7942    #endif
7943    #endif
7944    #endif
7945    #endif
7946    break;
7947    } /* up */
7948  return digits;
7949  } /* decGetDigits */
7950
7951/* ------------------------------------------------------------------ */
7952/* mulUInt128ByPowOf10 -- multiply a 128-bit unsigned integer by a    */
7953/* power of 10.                                                       */
7954/*                                                                    */
7955/*   The 128-bit factor composed of plow and phigh is multiplied      */
7956/*   by 10^exp.                                                       */
7957/*                                                                    */
7958/*   plow   pointer to the low 64 bits of the first factor            */
7959/*   phigh  pointer to the high 64 bits of the first factor           */
7960/*   exp    the exponent of the power of 10 of the second factor      */
7961/*                                                                    */
7962/* If the result fits in 128 bits, returns false and the              */
7963/* multiplication result through plow and phigh.                      */
7964/* Otherwise, returns true.                                           */
7965/* ------------------------------------------------------------------ */
7966static bool mulUInt128ByPowOf10(uLong *plow, uLong *phigh, uInt pow10)
7967{
7968    while (pow10 >= ARRAY_SIZE(powers)) {
7969        if (mulu128(plow, phigh, powers[ARRAY_SIZE(powers) - 1])) {
7970            /* Overflow */
7971            return true;
7972        }
7973        pow10 -= ARRAY_SIZE(powers) - 1;
7974    }
7975
7976    if (pow10 > 0) {
7977        return mulu128(plow, phigh, powers[pow10]);
7978    } else {
7979        return false;
7980    }
7981}
7982
7983#if DECTRACE | DECCHECK
7984/* ------------------------------------------------------------------ */
7985/* decNumberShow -- display a number [debug aid]                      */
7986/*   dn is the number to show                                         */
7987/*                                                                    */
7988/* Shows: sign, exponent, coefficient (msu first), digits             */
7989/*    or: sign, special-value                                         */
7990/* ------------------------------------------------------------------ */
7991/* this is public so other modules can use it */
7992void decNumberShow(const decNumber *dn) {
7993  const Unit *up;                  /* work */
7994  uInt u, d;                       /* .. */
7995  Int cut;                         /* .. */
7996  char isign='+';                  /* main sign */
7997  if (dn==NULL) {
7998    printf("NULL\n");
7999    return;}
8000  if (decNumberIsNegative(dn)) isign='-';
8001  printf(" >> %c ", isign);
8002  if (dn->bits&DECSPECIAL) {       /* Is a special value */
8003    if (decNumberIsInfinite(dn)) printf("Infinity");
8004     else {                                  /* a NaN */
8005      if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
8006       else printf("NaN");
8007      }
8008    /* if coefficient and exponent are 0, no more to do */
8009    if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
8010      printf("\n");
8011      return;}
8012    /* drop through to report other information */
8013    printf(" ");
8014    }
8015
8016  /* now carefully display the coefficient */
8017  up=dn->lsu+D2U(dn->digits)-1;         /* msu */
8018  printf("%ld", (LI)*up);
8019  for (up=up-1; up>=dn->lsu; up--) {
8020    u=*up;
8021    printf(":");
8022    for (cut=DECDPUN-1; cut>=0; cut--) {
8023      d=u/powers[cut];
8024      u-=d*powers[cut];
8025      printf("%ld", (LI)d);
8026      } /* cut */
8027    } /* up */
8028  if (dn->exponent!=0) {
8029    char esign='+';
8030    if (dn->exponent<0) esign='-';
8031    printf(" E%c%ld", esign, (LI)abs(dn->exponent));
8032    }
8033  printf(" [%ld]\n", (LI)dn->digits);
8034  } /* decNumberShow */
8035#endif
8036
8037#if DECTRACE || DECCHECK
8038/* ------------------------------------------------------------------ */
8039/* decDumpAr -- display a unit array [debug/check aid]                */
8040/*   name is a single-character tag name                              */
8041/*   ar   is the array to display                                     */
8042/*   len  is the length of the array in Units                         */
8043/* ------------------------------------------------------------------ */
8044static void decDumpAr(char name, const Unit *ar, Int len) {
8045  Int i;
8046  const char *spec;
8047  #if DECDPUN==9
8048    spec="%09d ";
8049  #elif DECDPUN==8
8050    spec="%08d ";
8051  #elif DECDPUN==7
8052    spec="%07d ";
8053  #elif DECDPUN==6
8054    spec="%06d ";
8055  #elif DECDPUN==5
8056    spec="%05d ";
8057  #elif DECDPUN==4
8058    spec="%04d ";
8059  #elif DECDPUN==3
8060    spec="%03d ";
8061  #elif DECDPUN==2
8062    spec="%02d ";
8063  #else
8064    spec="%d ";
8065  #endif
8066  printf("  :%c: ", name);
8067  for (i=len-1; i>=0; i--) {
8068    if (i==len-1) printf("%ld ", (LI)ar[i]);
8069     else printf(spec, ar[i]);
8070    }
8071  printf("\n");
8072  return;}
8073#endif
8074
8075#if DECCHECK
8076/* ------------------------------------------------------------------ */
8077/* decCheckOperands -- check operand(s) to a routine                  */
8078/*   res is the result structure (not checked; it will be set to      */
8079/*          quiet NaN if error found (and it is not NULL))            */
8080/*   lhs is the first operand (may be DECUNRESU)                      */
8081/*   rhs is the second (may be DECUNUSED)                             */
8082/*   set is the context (may be DECUNCONT)                            */
8083/*   returns 0 if both operands, and the context are clean, or 1      */
8084/*     otherwise (in which case the context will show an error,       */
8085/*     unless NULL).  Note that res is not cleaned; caller should     */
8086/*     handle this so res=NULL case is safe.                          */
8087/* The caller is expected to abandon immediately if 1 is returned.    */
8088/* ------------------------------------------------------------------ */
8089static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
8090                             const decNumber *rhs, decContext *set) {
8091  Flag bad=0;
8092  if (set==NULL) {                 /* oops; hopeless */
8093    #if DECTRACE || DECVERB
8094    printf("Reference to context is NULL.\n");
8095    #endif
8096    bad=1;
8097    return 1;}
8098   else if (set!=DECUNCONT
8099     && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
8100    bad=1;
8101    #if DECTRACE || DECVERB
8102    printf("Bad context [digits=%ld round=%ld].\n",
8103           (LI)set->digits, (LI)set->round);
8104    #endif
8105    }
8106   else {
8107    if (res==NULL) {
8108      bad=1;
8109      #if DECTRACE
8110      /* this one not DECVERB as standard tests include NULL */
8111      printf("Reference to result is NULL.\n");
8112      #endif
8113      }
8114    if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
8115    if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
8116    }
8117  if (bad) {
8118    if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
8119    if (res!=DECUNRESU && res!=NULL) {
8120      decNumberZero(res);
8121      res->bits=DECNAN;       /* qNaN */
8122      }
8123    }
8124  return bad;
8125  } /* decCheckOperands */
8126
8127/* ------------------------------------------------------------------ */
8128/* decCheckNumber -- check a number                                   */
8129/*   dn is the number to check                                        */
8130/*   returns 0 if the number is clean, or 1 otherwise                 */
8131/*                                                                    */
8132/* The number is considered valid if it could be a result from some   */
8133/* operation in some valid context.                                   */
8134/* ------------------------------------------------------------------ */
8135static Flag decCheckNumber(const decNumber *dn) {
8136  const Unit *up;             /* work */
8137  uInt maxuint;               /* .. */
8138  Int ae, d, digits;          /* .. */
8139  Int emin, emax;             /* .. */
8140
8141  if (dn==NULL) {             /* hopeless */
8142    #if DECTRACE
8143    /* this one not DECVERB as standard tests include NULL */
8144    printf("Reference to decNumber is NULL.\n");
8145    #endif
8146    return 1;}
8147
8148  /* check special values */
8149  if (dn->bits & DECSPECIAL) {
8150    if (dn->exponent!=0) {
8151      #if DECTRACE || DECVERB
8152      printf("Exponent %ld (not 0) for a special value [%02x].\n",
8153             (LI)dn->exponent, dn->bits);
8154      #endif
8155      return 1;}
8156
8157    /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
8158    if (decNumberIsInfinite(dn)) {
8159      if (dn->digits!=1) {
8160        #if DECTRACE || DECVERB
8161        printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
8162        #endif
8163        return 1;}
8164      if (*dn->lsu!=0) {
8165        #if DECTRACE || DECVERB
8166        printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
8167        #endif
8168        decDumpAr('I', dn->lsu, D2U(dn->digits));
8169        return 1;}
8170      } /* Inf */
8171    /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8172    /*             concrete formats (decimal64, etc.). */
8173    return 0;
8174    }
8175
8176  /* check the coefficient */
8177  if (dn->digits<1 || dn->digits>DECNUMMAXP) {
8178    #if DECTRACE || DECVERB
8179    printf("Digits %ld in number.\n", (LI)dn->digits);
8180    #endif
8181    return 1;}
8182
8183  d=dn->digits;
8184
8185  for (up=dn->lsu; d>0; up++) {
8186    if (d>DECDPUN) maxuint=DECDPUNMAX;
8187     else {                   /* reached the msu */
8188      maxuint=powers[d]-1;
8189      if (dn->digits>1 && *up<powers[d-1]) {
8190        #if DECTRACE || DECVERB
8191        printf("Leading 0 in number.\n");
8192        decNumberShow(dn);
8193        #endif
8194        return 1;}
8195      }
8196    if (*up>maxuint) {
8197      #if DECTRACE || DECVERB
8198      printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8199              (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8200      #endif
8201      return 1;}
8202    d-=DECDPUN;
8203    }
8204
8205  /* check the exponent.  Note that input operands can have exponents */
8206  /* which are out of the set->emin/set->emax and set->digits range */
8207  /* (just as they can have more digits than set->digits). */
8208  ae=dn->exponent+dn->digits-1;    /* adjusted exponent */
8209  emax=DECNUMMAXE;
8210  emin=DECNUMMINE;
8211  digits=DECNUMMAXP;
8212  if (ae<emin-(digits-1)) {
8213    #if DECTRACE || DECVERB
8214    printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8215    decNumberShow(dn);
8216    #endif
8217    return 1;}
8218  if (ae>+emax) {
8219    #if DECTRACE || DECVERB
8220    printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8221    decNumberShow(dn);
8222    #endif
8223    return 1;}
8224
8225  return 0;              /* it's OK */
8226  } /* decCheckNumber */
8227
8228/* ------------------------------------------------------------------ */
8229/* decCheckInexact -- check a normal finite inexact result has digits */
8230/*   dn is the number to check                                        */
8231/*   set is the context (for status and precision)                    */
8232/*   sets Invalid operation, etc., if some digits are missing         */
8233/* [this check is not made for DECSUBSET compilation or when          */
8234/* subnormal is not set]                                              */
8235/* ------------------------------------------------------------------ */
8236static void decCheckInexact(const decNumber *dn, decContext *set) {
8237  #if !DECSUBSET && DECEXTFLAG
8238    if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8239     && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8240      #if DECTRACE || DECVERB
8241      printf("Insufficient digits [%ld] on normal Inexact result.\n",
8242             (LI)dn->digits);
8243      decNumberShow(dn);
8244      #endif
8245      decContextSetStatus(set, DEC_Invalid_operation);
8246      }
8247  #else
8248    /* next is a noop for quiet compiler */
8249    if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8250  #endif
8251  return;
8252  } /* decCheckInexact */
8253#endif
8254
8255#if DECALLOC
8256#undef malloc
8257#undef free
8258/* ------------------------------------------------------------------ */
8259/* decMalloc -- accountable allocation routine                        */
8260/*   n is the number of bytes to allocate                             */
8261/*                                                                    */
8262/* Semantics is the same as the stdlib malloc routine, but bytes      */
8263/* allocated are accounted for globally, and corruption fences are    */
8264/* added before and after the 'actual' storage.                       */
8265/* ------------------------------------------------------------------ */
8266/* This routine allocates storage with an extra twelve bytes; 8 are   */
8267/* at the start and hold:                                             */
8268/*   0-3 the original length requested                                */
8269/*   4-7 buffer corruption detection fence (DECFENCE, x4)             */
8270/* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8271/* ------------------------------------------------------------------ */
8272static void *decMalloc(size_t n) {
8273  uInt  size=n+12;                 /* true size */
8274  void  *alloc;                    /* -> allocated storage */
8275  uInt  *j;                        /* work */
8276  uByte *b, *b0;                   /* .. */
8277
8278  alloc=malloc(size);              /* -> allocated storage */
8279  if (alloc==NULL) return NULL;    /* out of strorage */
8280  b0=(uByte *)alloc;               /* as bytes */
8281  decAllocBytes+=n;                /* account for storage */
8282  j=(uInt *)alloc;                 /* -> first four bytes */
8283  *j=n;                            /* save n */
8284  /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
8285  for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8286  for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8287  return b0+8;                     /* -> play area */
8288  } /* decMalloc */
8289
8290/* ------------------------------------------------------------------ */
8291/* decFree -- accountable free routine                                */
8292/*   alloc is the storage to free                                     */
8293/*                                                                    */
8294/* Semantics is the same as the stdlib malloc routine, except that    */
8295/* the global storage accounting is updated and the fences are        */
8296/* checked to ensure that no routine has written 'out of bounds'.     */
8297/* ------------------------------------------------------------------ */
8298/* This routine first checks that the fences have not been corrupted. */
8299/* It then frees the storage using the 'truw' storage address (that   */
8300/* is, offset by 8).                                                  */
8301/* ------------------------------------------------------------------ */
8302static void decFree(void *alloc) {
8303  uInt  *j, n;                     /* pointer, original length */
8304  uByte *b, *b0;                   /* work */
8305
8306  if (alloc==NULL) return;         /* allowed; it's a nop */
8307  b0=(uByte *)alloc;               /* as bytes */
8308  b0-=8;                           /* -> true start of storage */
8309  j=(uInt *)b0;                    /* -> first four bytes */
8310  n=*j;                            /* lift */
8311  for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8312    printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8313           b-b0-8, (Int)b0);
8314  for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8315    printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8316           b-b0-8, (Int)b0, n);
8317  free(b0);                        /* drop the storage */
8318  decAllocBytes-=n;                /* account for storage */
8319  /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8320  } /* decFree */
8321#define malloc(a) decMalloc(a)
8322#define free(a) decFree(a)
8323#endif
8324