Home | History | Annotate | Download | only in i18n
      1 /* ------------------------------------------------------------------ */
      2 /* Decimal Number arithmetic module                                   */
      3 /* ------------------------------------------------------------------ */
      4 /* Copyright (c) IBM Corporation, 2000-2012.  All rights reserved.    */
      5 /*                                                                    */
      6 /* This software is made available under the terms of the             */
      7 /* ICU License -- ICU 1.8.1 and later.                                */
      8 /*                                                                    */
      9 /* The description and User's Guide ("The decNumber C Library") for   */
     10 /* this software is called decNumber.pdf.  This document is           */
     11 /* available, together with arithmetic and format specifications,     */
     12 /* testcases, and Web links, on the General Decimal Arithmetic page.  */
     13 /*                                                                    */
     14 /* Please send comments, suggestions, and corrections to the author:  */
     15 /*   mfc (at) uk.ibm.com                                                   */
     16 /*   Mike Cowlishaw, IBM Fellow                                       */
     17 /*   IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK         */
     18 /* ------------------------------------------------------------------ */
     19 
     20 /* Modified version, for use from within ICU.
     21  *    Renamed public functions, to avoid an unwanted export of the
     22  *    standard names from the ICU library.
     23  *
     24  *    Use ICU's uprv_malloc() and uprv_free()
     25  *
     26  *    Revert comment syntax to plain C
     27  *
     28  *    Remove a few compiler warnings.
     29  */
     30 
     31 /* This module comprises the routines for arbitrary-precision General */
     32 /* Decimal Arithmetic as defined in the specification which may be    */
     33 /* found on the General Decimal Arithmetic pages.  It implements both */
     34 /* the full ('extended') arithmetic and the simpler ('subset')        */
     35 /* arithmetic.                                                        */
     36 /*                                                                    */
     37 /* Usage notes:                                                       */
     38 /*                                                                    */
     39 /* 1. This code is ANSI C89 except:                                   */
     40 /*                                                                    */
     41 /*    a) C99 line comments (double forward slash) are used.  (Most C  */
     42 /*       compilers accept these.  If yours does not, a simple script  */
     43 /*       can be used to convert them to ANSI C comments.)             */
     44 /*                                                                    */
     45 /*    b) Types from C99 stdint.h are used.  If you do not have this   */
     46 /*       header file, see the User's Guide section of the decNumber   */
     47 /*       documentation; this lists the necessary definitions.         */
     48 /*                                                                    */
     49 /*    c) If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and       */
     50 /*       uint64_t types may be used.  To avoid these, set DECUSE64=0  */
     51 /*       and DECDPUN<=4 (see documentation).                          */
     52 /*                                                                    */
     53 /*    The code also conforms to C99 restrictions; in particular,      */
     54 /*    strict aliasing rules are observed.                             */
     55 /*                                                                    */
     56 /* 2. The decNumber format which this library uses is optimized for   */
     57 /*    efficient processing of relatively short numbers; in particular */
     58 /*    it allows the use of fixed sized structures and minimizes copy  */
     59 /*    and move operations.  It does, however, support arbitrary       */
     60 /*    precision (up to 999,999,999 digits) and arbitrary exponent     */
     61 /*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
     62 /*    range -999,999,999 through 0).  Mathematical functions (for     */
     63 /*    example decNumberExp) as identified below are restricted more   */
     64 /*    tightly: digits, emax, and -emin in the context must be <=      */
     65 /*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
     66 /*    these bounds.                                                   */
     67 /*                                                                    */
     68 /* 3. Logical functions are further restricted; their operands must   */
     69 /*    be finite, positive, have an exponent of zero, and all digits   */
     70 /*    must be either 0 or 1.  The result will only contain digits     */
     71 /*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
     72 /*                                                                    */
     73 /* 4. Operands to operator functions are never modified unless they   */
     74 /*    are also specified to be the result number (which is always     */
     75 /*    permitted).  Other than that case, operands must not overlap.   */
     76 /*                                                                    */
     77 /* 5. Error handling: the type of the error is ORed into the status   */
     78 /*    flags in the current context (decContext structure).  The       */
     79 /*    SIGFPE signal is then raised if the corresponding trap-enabler  */
     80 /*    flag in the decContext is set (is 1).                           */
     81 /*                                                                    */
     82 /*    It is the responsibility of the caller to clear the status      */
     83 /*    flags as required.                                              */
     84 /*                                                                    */
     85 /*    The result of any routine which returns a number will always    */
     86 /*    be a valid number (which may be a special value, such as an     */
     87 /*    Infinity or NaN).                                               */
     88 /*                                                                    */
     89 /* 6. The decNumber format is not an exchangeable concrete            */
     90 /*    representation as it comprises fields which may be machine-     */
     91 /*    dependent (packed or unpacked, or special length, for example). */
     92 /*    Canonical conversions to and from strings are provided; other   */
     93 /*    conversions are available in separate modules.                  */
     94 /*                                                                    */
     95 /* 7. Normally, input operands are assumed to be valid.  Set DECCHECK */
     96 /*    to 1 for extended operand checking (including NULL operands).   */
     97 /*    Results are undefined if a badly-formed structure (or a NULL    */
     98 /*    pointer to a structure) is provided, though with DECCHECK       */
     99 /*    enabled the operator routines are protected against exceptions. */
    100 /*    (Except if the result pointer is NULL, which is unrecoverable.) */
    101 /*                                                                    */
    102 /*    However, the routines will never cause exceptions if they are   */
    103 /*    given well-formed operands, even if the value of the operands   */
    104 /*    is inappropriate for the operation and DECCHECK is not set.     */
    105 /*    (Except for SIGFPE, as and where documented.)                   */
    106 /*                                                                    */
    107 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
    108 /* ------------------------------------------------------------------ */
    109 /* Implementation notes for maintenance of this module:               */
    110 /*                                                                    */
    111 /* 1. Storage leak protection:  Routines which use malloc are not     */
    112 /*    permitted to use return for fastpath or error exits (i.e.,      */
    113 /*    they follow strict structured programming conventions).         */
    114 /*    Instead they have a do{}while(0); construct surrounding the     */
    115 /*    code which is protected -- break may be used to exit this.      */
    116 /*    Other routines can safely use the return statement inline.      */
    117 /*                                                                    */
    118 /*    Storage leak accounting can be enabled using DECALLOC.          */
    119 /*                                                                    */
    120 /* 2. All loops use the for(;;) construct.  Any do construct does     */
    121 /*    not loop; it is for allocation protection as just described.    */
    122 /*                                                                    */
    123 /* 3. Setting status in the context must always be the very last      */
    124 /*    action in a routine, as non-0 status may raise a trap and hence */
    125 /*    the call to set status may not return (if the handler uses long */
    126 /*    jump).  Therefore all cleanup must be done first.  In general,  */
    127 /*    to achieve this status is accumulated and is only applied just  */
    128 /*    before return by calling decContextSetStatus (via decStatus).   */
    129 /*                                                                    */
    130 /*    Routines which allocate storage cannot, in general, use the     */
    131 /*    'top level' routines which could cause a non-returning          */
    132 /*    transfer of control.  The decXxxxOp routines are safe (do not   */
    133 /*    call decStatus even if traps are set in the context) and should */
    134 /*    be used instead (they are also a little faster).                */
    135 /*                                                                    */
    136 /* 4. Exponent checking is minimized by allowing the exponent to      */
    137 /*    grow outside its limits during calculations, provided that      */
    138 /*    the decFinalize function is called later.  Multiplication and   */
    139 /*    division, and intermediate calculations in exponentiation,      */
    140 /*    require more careful checks because of the risk of 31-bit       */
    141 /*    overflow (the most negative valid exponent is -1999999997, for  */
    142 /*    a 999999999-digit number with adjusted exponent of -999999999). */
    143 /*                                                                    */
    144 /* 5. Rounding is deferred until finalization of results, with any    */
    145 /*    'off to the right' data being represented as a single digit     */
    146 /*    residue (in the range -1 through 9).  This avoids any double-   */
    147 /*    rounding when more than one shortening takes place (for         */
    148 /*    example, when a result is subnormal).                           */
    149 /*                                                                    */
    150 /* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
    151 /*    during many operations, so whole Units are handled and exact    */
    152 /*    accounting of digits is not needed.  The correct digits value   */
    153 /*    is found by decGetDigits, which accounts for leading zeros.     */
    154 /*    This must be called before any rounding if the number of digits */
    155 /*    is not known exactly.                                           */
    156 /*                                                                    */
    157 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
    158 /*    numbers up to four digits, using appropriate constants.  This   */
    159 /*    is not useful for longer numbers because overflow of 32 bits    */
    160 /*    would lead to 4 multiplies, which is almost as expensive as     */
    161 /*    a divide (unless a floating-point or 64-bit multiply is         */
    162 /*    assumed to be available).                                       */
    163 /*                                                                    */
    164 /* 8. Unusual abbreviations that may be used in the commentary:       */
    165 /*      lhs -- left hand side (operand, of an operation)              */
    166 /*      lsd -- least significant digit (of coefficient)               */
    167 /*      lsu -- least significant Unit (of coefficient)                */
    168 /*      msd -- most significant digit (of coefficient)                */
    169 /*      msi -- most significant item (in an array)                    */
    170 /*      msu -- most significant Unit (of coefficient)                 */
    171 /*      rhs -- right hand side (operand, of an operation)             */
    172 /*      +ve -- positive                                               */
    173 /*      -ve -- negative                                               */
    174 /*      **  -- raise to the power                                     */
    175 /* ------------------------------------------------------------------ */
    176 
    177 #include <stdlib.h>                /* for malloc, free, etc.  */
    178 /*  #include <stdio.h>   */        /* for printf [if needed]  */
    179 #include <string.h>                /* for strcpy  */
    180 #include <ctype.h>                 /* for lower  */
    181 #include "cmemory.h"               /* for uprv_malloc, etc., in ICU */
    182 #include "decNumber.h"             /* base number library  */
    183 #include "decNumberLocal.h"        /* decNumber local types, etc.  */
    184 #include "uassert.h"
    185 
    186 /* Constants */
    187 /* Public lookup table used by the D2U macro  */
    188 static const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
    189 
    190 #define DECVERB     1              /* set to 1 for verbose DECCHECK  */
    191 #define powers      DECPOWERS      /* old internal name  */
    192 
    193 /* Local constants  */
    194 #define DIVIDE      0x80           /* Divide operators  */
    195 #define REMAINDER   0x40           /* ..  */
    196 #define DIVIDEINT   0x20           /* ..  */
    197 #define REMNEAR     0x10           /* ..  */
    198 #define COMPARE     0x01           /* Compare operators  */
    199 #define COMPMAX     0x02           /* ..  */
    200 #define COMPMIN     0x03           /* ..  */
    201 #define COMPTOTAL   0x04           /* ..  */
    202 #define COMPNAN     0x05           /* .. [NaN processing]  */
    203 #define COMPSIG     0x06           /* .. [signaling COMPARE]  */
    204 #define COMPMAXMAG  0x07           /* ..  */
    205 #define COMPMINMAG  0x08           /* ..  */
    206 
    207 #define DEC_sNaN     0x40000000    /* local status: sNaN signal  */
    208 #define BADINT  (Int)0x80000000    /* most-negative Int; error indicator  */
    209 /* Next two indicate an integer >= 10**6, and its parity (bottom bit)  */
    210 #define BIGEVEN (Int)0x80000002
    211 #define BIGODD  (Int)0x80000003
    212 
    213 static const Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing  */
    214 
    215 /* ------------------------------------------------------------------ */
    216 /* round-for-reround digits                                           */
    217 /* ------------------------------------------------------------------ */
    218 static const uByte DECSTICKYTAB[10]={1,1,2,3,4,6,6,7,8,9}; /* used if sticky */
    219 
    220 /* ------------------------------------------------------------------ */
    221 /* Powers of ten (powers[n]==10**n, 0<=n<=9)                          */
    222 /* ------------------------------------------------------------------ */
    223 static const uInt DECPOWERS[10]={1, 10, 100, 1000, 10000, 100000, 1000000,
    224                           10000000, 100000000, 1000000000};
    225 
    226 
    227 /* Granularity-dependent code */
    228 #if DECDPUN<=4
    229   #define eInt  Int           /* extended integer  */
    230   #define ueInt uInt          /* unsigned extended integer  */
    231   /* Constant multipliers for divide-by-power-of five using reciprocal  */
    232   /* multiply, after removing powers of 2 by shifting, and final shift  */
    233   /* of 17 [we only need up to **4]  */
    234   static const uInt multies[]={131073, 26215, 5243, 1049, 210};
    235   /* QUOT10 -- macro to return the quotient of unit u divided by 10**n  */
    236   #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
    237 #else
    238   /* For DECDPUN>4 non-ANSI-89 64-bit types are needed.  */
    239   #if !DECUSE64
    240     #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
    241   #endif
    242   #define eInt  Long          /* extended integer  */
    243   #define ueInt uLong         /* unsigned extended integer  */
    244 #endif
    245 
    246 /* Local routines */
    247 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
    248                               decContext *, uByte, uInt *);
    249 static Flag        decBiStr(const char *, const char *, const char *);
    250 static uInt        decCheckMath(const decNumber *, decContext *, uInt *);
    251 static void        decApplyRound(decNumber *, decContext *, Int, uInt *);
    252 static Int         decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
    253 static decNumber * decCompareOp(decNumber *, const decNumber *,
    254                               const decNumber *, decContext *,
    255                               Flag, uInt *);
    256 static void        decCopyFit(decNumber *, const decNumber *, decContext *,
    257                               Int *, uInt *);
    258 static decNumber * decDecap(decNumber *, Int);
    259 static decNumber * decDivideOp(decNumber *, const decNumber *,
    260                               const decNumber *, decContext *, Flag, uInt *);
    261 static decNumber * decExpOp(decNumber *, const decNumber *,
    262                               decContext *, uInt *);
    263 static void        decFinalize(decNumber *, decContext *, Int *, uInt *);
    264 static Int         decGetDigits(Unit *, Int);
    265 static Int         decGetInt(const decNumber *);
    266 static decNumber * decLnOp(decNumber *, const decNumber *,
    267                               decContext *, uInt *);
    268 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
    269                               const decNumber *, decContext *,
    270                               uInt *);
    271 static decNumber * decNaNs(decNumber *, const decNumber *,
    272                               const decNumber *, decContext *, uInt *);
    273 static decNumber * decQuantizeOp(decNumber *, const decNumber *,
    274                               const decNumber *, decContext *, Flag,
    275                               uInt *);
    276 static void        decReverse(Unit *, Unit *);
    277 static void        decSetCoeff(decNumber *, decContext *, const Unit *,
    278                               Int, Int *, uInt *);
    279 static void        decSetMaxValue(decNumber *, decContext *);
    280 static void        decSetOverflow(decNumber *, decContext *, uInt *);
    281 static void        decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
    282 static Int         decShiftToLeast(Unit *, Int, Int);
    283 static Int         decShiftToMost(Unit *, Int, Int);
    284 static void        decStatus(decNumber *, uInt, decContext *);
    285 static void        decToString(const decNumber *, char[], Flag);
    286 static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
    287 static Int         decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
    288                               Unit *, Int);
    289 static Int         decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
    290 
    291 #if !DECSUBSET
    292 /* decFinish == decFinalize when no subset arithmetic needed */
    293 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
    294 #else
    295 static void        decFinish(decNumber *, decContext *, Int *, uInt *);
    296 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
    297 #endif
    298 
    299 /* Local macros */
    300 /* masked special-values bits  */
    301 #define SPECIALARG  (rhs->bits & DECSPECIAL)
    302 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
    303 
    304 /* For use in ICU */
    305 #define malloc(a) uprv_malloc(a)
    306 #define free(a) uprv_free(a)
    307 
    308 /* Diagnostic macros, etc. */
    309 #if DECALLOC
    310 /* Handle malloc/free accounting.  If enabled, our accountable routines  */
    311 /* are used; otherwise the code just goes straight to the system malloc  */
    312 /* and free routines.  */
    313 #define malloc(a) decMalloc(a)
    314 #define free(a) decFree(a)
    315 #define DECFENCE 0x5a              /* corruption detector  */
    316 /* 'Our' malloc and free:  */
    317 static void *decMalloc(size_t);
    318 static void  decFree(void *);
    319 uInt decAllocBytes=0;              /* count of bytes allocated  */
    320 /* Note that DECALLOC code only checks for storage buffer overflow.  */
    321 /* To check for memory leaks, the decAllocBytes variable must be  */
    322 /* checked to be 0 at appropriate times (e.g., after the test  */
    323 /* harness completes a set of tests).  This checking may be unreliable  */
    324 /* if the testing is done in a multi-thread environment.  */
    325 #endif
    326 
    327 #if DECCHECK
    328 /* Optional checking routines.  Enabling these means that decNumber  */
    329 /* and decContext operands to operator routines are checked for  */
    330 /* correctness.  This roughly doubles the execution time of the  */
    331 /* fastest routines (and adds 600+ bytes), so should not normally be  */
    332 /* used in 'production'.  */
    333 /* decCheckInexact is used to check that inexact results have a full  */
    334 /* complement of digits (where appropriate -- this is not the case  */
    335 /* for Quantize, for example)  */
    336 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
    337 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
    338 #define DECUNCONT ((decContext *)(void *)(0xffffffff))
    339 static Flag decCheckOperands(decNumber *, const decNumber *,
    340                              const decNumber *, decContext *);
    341 static Flag decCheckNumber(const decNumber *);
    342 static void decCheckInexact(const decNumber *, decContext *);
    343 #endif
    344 
    345 #if DECTRACE || DECCHECK
    346 /* Optional trace/debugging routines (may or may not be used)  */
    347 void decNumberShow(const decNumber *);  /* displays the components of a number  */
    348 static void decDumpAr(char, const Unit *, Int);
    349 #endif
    350 
    351 /* ================================================================== */
    352 /* Conversions                                                        */
    353 /* ================================================================== */
    354 
    355 /* ------------------------------------------------------------------ */
    356 /* from-int32 -- conversion from Int or uInt                          */
    357 /*                                                                    */
    358 /*  dn is the decNumber to receive the integer                        */
    359 /*  in or uin is the integer to be converted                          */
    360 /*  returns dn                                                        */
    361 /*                                                                    */
    362 /* No error is possible.                                              */
    363 /* ------------------------------------------------------------------ */
    364 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromInt32(decNumber *dn, Int in) {
    365   uInt unsig;
    366   if (in>=0) unsig=in;
    367    else {                               /* negative (possibly BADINT)  */
    368     if (in==BADINT) unsig=(uInt)1073741824*2; /* special case  */
    369      else unsig=-in;                    /* invert  */
    370     }
    371   /* in is now positive  */
    372   uprv_decNumberFromUInt32(dn, unsig);
    373   if (in<0) dn->bits=DECNEG;            /* sign needed  */
    374   return dn;
    375   } /* decNumberFromInt32  */
    376 
    377 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) {
    378   Unit *up;                             /* work pointer  */
    379   uprv_decNumberZero(dn);                    /* clean  */
    380   if (uin==0) return dn;                /* [or decGetDigits bad call]  */
    381   for (up=dn->lsu; uin>0; up++) {
    382     *up=(Unit)(uin%(DECDPUNMAX+1));
    383     uin=uin/(DECDPUNMAX+1);
    384     }
    385   dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
    386   return dn;
    387   } /* decNumberFromUInt32  */
    388 
    389 /* ------------------------------------------------------------------ */
    390 /* to-int32 -- conversion to Int or uInt                              */
    391 /*                                                                    */
    392 /*  dn is the decNumber to convert                                    */
    393 /*  set is the context for reporting errors                           */
    394 /*  returns the converted decNumber, or 0 if Invalid is set           */
    395 /*                                                                    */
    396 /* Invalid is set if the decNumber does not have exponent==0 or if    */
    397 /* it is a NaN, Infinite, or out-of-range.                            */
    398 /* ------------------------------------------------------------------ */
    399 U_CAPI Int U_EXPORT2 uprv_decNumberToInt32(const decNumber *dn, decContext *set) {
    400   #if DECCHECK
    401   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    402   #endif
    403 
    404   /* special or too many digits, or bad exponent  */
    405   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad  */
    406    else { /* is a finite integer with 10 or fewer digits  */
    407     Int d;                         /* work  */
    408     const Unit *up;                /* ..  */
    409     uInt hi=0, lo;                 /* ..  */
    410     up=dn->lsu;                    /* -> lsu  */
    411     lo=*up;                        /* get 1 to 9 digits  */
    412     #if DECDPUN>1                  /* split to higher  */
    413       hi=lo/10;
    414       lo=lo%10;
    415     #endif
    416     up++;
    417     /* collect remaining Units, if any, into hi  */
    418     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    419     /* now low has the lsd, hi the remainder  */
    420     if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range?  */
    421       /* most-negative is a reprieve  */
    422       if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
    423       /* bad -- drop through  */
    424       }
    425      else { /* in-range always  */
    426       Int i=X10(hi)+lo;
    427       if (dn->bits&DECNEG) return -i;
    428       return i;
    429       }
    430     } /* integer  */
    431   uprv_decContextSetStatus(set, DEC_Invalid_operation); /* [may not return]  */
    432   return 0;
    433   } /* decNumberToInt32  */
    434 
    435 U_CAPI uInt U_EXPORT2 uprv_decNumberToUInt32(const decNumber *dn, decContext *set) {
    436   #if DECCHECK
    437   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
    438   #endif
    439   /* special or too many digits, or bad exponent, or negative (<0)  */
    440   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
    441     || (dn->bits&DECNEG && !ISZERO(dn)));                   /* bad  */
    442    else { /* is a finite integer with 10 or fewer digits  */
    443     Int d;                         /* work  */
    444     const Unit *up;                /* ..  */
    445     uInt hi=0, lo;                 /* ..  */
    446     up=dn->lsu;                    /* -> lsu  */
    447     lo=*up;                        /* get 1 to 9 digits  */
    448     #if DECDPUN>1                  /* split to higher  */
    449       hi=lo/10;
    450       lo=lo%10;
    451     #endif
    452     up++;
    453     /* collect remaining Units, if any, into hi  */
    454     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
    455 
    456     /* now low has the lsd, hi the remainder  */
    457     if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible  */
    458      else return X10(hi)+lo;
    459     } /* integer  */
    460   uprv_decContextSetStatus(set, DEC_Invalid_operation); /* [may not return]  */
    461   return 0;
    462   } /* decNumberToUInt32  */
    463 
    464 /* ------------------------------------------------------------------ */
    465 /* to-scientific-string -- conversion to numeric string               */
    466 /* to-engineering-string -- conversion to numeric string              */
    467 /*                                                                    */
    468 /*   decNumberToString(dn, string);                                   */
    469 /*   decNumberToEngString(dn, string);                                */
    470 /*                                                                    */
    471 /*  dn is the decNumber to convert                                    */
    472 /*  string is the string where the result will be laid out            */
    473 /*                                                                    */
    474 /*  string must be at least dn->digits+14 characters long             */
    475 /*                                                                    */
    476 /*  No error is possible, and no status can be set.                   */
    477 /* ------------------------------------------------------------------ */
    478 U_CAPI char * U_EXPORT2 uprv_decNumberToString(const decNumber *dn, char *string){
    479   decToString(dn, string, 0);
    480   return string;
    481   } /* DecNumberToString  */
    482 
    483 U_CAPI char * U_EXPORT2 uprv_decNumberToEngString(const decNumber *dn, char *string){
    484   decToString(dn, string, 1);
    485   return string;
    486   } /* DecNumberToEngString  */
    487 
    488 /* ------------------------------------------------------------------ */
    489 /* to-number -- conversion from numeric string                        */
    490 /*                                                                    */
    491 /* decNumberFromString -- convert string to decNumber                 */
    492 /*   dn        -- the number structure to fill                        */
    493 /*   chars[]   -- the string to convert ('\0' terminated)             */
    494 /*   set       -- the context used for processing any error,          */
    495 /*                determining the maximum precision available         */
    496 /*                (set.digits), determining the maximum and minimum   */
    497 /*                exponent (set.emax and set.emin), determining if    */
    498 /*                extended values are allowed, and checking the       */
    499 /*                rounding mode if overflow occurs or rounding is     */
    500 /*                needed.                                             */
    501 /*                                                                    */
    502 /* The length of the coefficient and the size of the exponent are     */
    503 /* checked by this routine, so the correct error (Underflow or        */
    504 /* Overflow) can be reported or rounding applied, as necessary.       */
    505 /*                                                                    */
    506 /* If bad syntax is detected, the result will be a quiet NaN.         */
    507 /* ------------------------------------------------------------------ */
    508 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char chars[],
    509                                 decContext *set) {
    510   Int   exponent=0;                /* working exponent [assume 0]  */
    511   uByte bits=0;                    /* working flags [assume +ve]  */
    512   Unit  *res;                      /* where result will be built  */
    513   Unit  resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary  */
    514                                    /* [+9 allows for ln() constants]  */
    515   Unit  *allocres=NULL;            /* -> allocated result, iff allocated  */
    516   Int   d=0;                       /* count of digits found in decimal part  */
    517   const char *dotchar=NULL;        /* where dot was found  */
    518   const char *cfirst=chars;        /* -> first character of decimal part  */
    519   const char *last=NULL;           /* -> last digit of decimal part  */
    520   const char *c;                   /* work  */
    521   Unit  *up;                       /* ..  */
    522   #if DECDPUN>1
    523   Int   cut, out;                  /* ..  */
    524   #endif
    525   Int   residue;                   /* rounding residue  */
    526   uInt  status=0;                  /* error code  */
    527 
    528   #if DECCHECK
    529   if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
    530     return uprv_decNumberZero(dn);
    531   #endif
    532 
    533   do {                             /* status & malloc protection  */
    534     for (c=chars;; c++) {          /* -> input character  */
    535       if (*c>='0' && *c<='9') {    /* test for Arabic digit  */
    536         last=c;
    537         d++;                       /* count of real digits  */
    538         continue;                  /* still in decimal part  */
    539         }
    540       if (*c=='.' && dotchar==NULL) { /* first '.'  */
    541         dotchar=c;                 /* record offset into decimal part  */
    542         if (c==cfirst) cfirst++;   /* first digit must follow  */
    543         continue;}
    544       if (c==chars) {              /* first in string...  */
    545         if (*c=='-') {             /* valid - sign  */
    546           cfirst++;
    547           bits=DECNEG;
    548           continue;}
    549         if (*c=='+') {             /* valid + sign  */
    550           cfirst++;
    551           continue;}
    552         }
    553       /* *c is not a digit, or a valid +, -, or '.'  */
    554       break;
    555       } /* c  */
    556 
    557     if (last==NULL) {              /* no digits yet  */
    558       status=DEC_Conversion_syntax;/* assume the worst  */
    559       if (*c=='\0') break;         /* and no more to come...  */
    560       #if DECSUBSET
    561       /* if subset then infinities and NaNs are not allowed  */
    562       if (!set->extended) break;   /* hopeless  */
    563       #endif
    564       /* Infinities and NaNs are possible, here  */
    565       if (dotchar!=NULL) break;    /* .. unless had a dot  */
    566       uprv_decNumberZero(dn);           /* be optimistic  */
    567       if (decBiStr(c, "infinity", "INFINITY")
    568        || decBiStr(c, "inf", "INF")) {
    569         dn->bits=bits | DECINF;
    570         status=0;                  /* is OK  */
    571         break; /* all done  */
    572         }
    573       /* a NaN expected  */
    574       /* 2003.09.10 NaNs are now permitted to have a sign  */
    575       dn->bits=bits | DECNAN;      /* assume simple NaN  */
    576       if (*c=='s' || *c=='S') {    /* looks like an sNaN  */
    577         c++;
    578         dn->bits=bits | DECSNAN;
    579         }
    580       if (*c!='n' && *c!='N') break;    /* check caseless "NaN"  */
    581       c++;
    582       if (*c!='a' && *c!='A') break;    /* ..  */
    583       c++;
    584       if (*c!='n' && *c!='N') break;    /* ..  */
    585       c++;
    586       /* now either nothing, or nnnn payload, expected  */
    587       /* -> start of integer and skip leading 0s [including plain 0]  */
    588       for (cfirst=c; *cfirst=='0';) cfirst++;
    589       if (*cfirst=='\0') {         /* "NaN" or "sNaN", maybe with all 0s  */
    590         status=0;                  /* it's good  */
    591         break;                     /* ..  */
    592         }
    593       /* something other than 0s; setup last and d as usual [no dots]  */
    594       for (c=cfirst;; c++, d++) {
    595         if (*c<'0' || *c>'9') break; /* test for Arabic digit  */
    596         last=c;
    597         }
    598       if (*c!='\0') break;         /* not all digits  */
    599       if (d>set->digits-1) {
    600         /* [NB: payload in a decNumber can be full length unless  */
    601         /* clamped, in which case can only be digits-1]  */
    602         if (set->clamp) break;
    603         if (d>set->digits) break;
    604         } /* too many digits?  */
    605       /* good; drop through to convert the integer to coefficient  */
    606       status=0;                    /* syntax is OK  */
    607       bits=dn->bits;               /* for copy-back  */
    608       } /* last==NULL  */
    609 
    610      else if (*c!='\0') {          /* more to process...  */
    611       /* had some digits; exponent is only valid sequence now  */
    612       Flag nege;                   /* 1=negative exponent  */
    613       const char *firstexp;        /* -> first significant exponent digit  */
    614       status=DEC_Conversion_syntax;/* assume the worst  */
    615       if (*c!='e' && *c!='E') break;
    616       /* Found 'e' or 'E' -- now process explicit exponent */
    617       /* 1998.07.11: sign no longer required  */
    618       nege=0;
    619       c++;                         /* to (possible) sign  */
    620       if (*c=='-') {nege=1; c++;}
    621        else if (*c=='+') c++;
    622       if (*c=='\0') break;
    623 
    624       for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros  */
    625       firstexp=c;                            /* save exponent digit place  */
    626       for (; ;c++) {
    627         if (*c<'0' || *c>'9') break;         /* not a digit  */
    628         exponent=X10(exponent)+(Int)*c-(Int)'0';
    629         } /* c  */
    630       /* if not now on a '\0', *c must not be a digit  */
    631       if (*c!='\0') break;
    632 
    633       /* (this next test must be after the syntax checks)  */
    634       /* if it was too long the exponent may have wrapped, so check  */
    635       /* carefully and set it to a certain overflow if wrap possible  */
    636       if (c>=firstexp+9+1) {
    637         if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
    638         /* [up to 1999999999 is OK, for example 1E-1000000998]  */
    639         }
    640       if (nege) exponent=-exponent;     /* was negative  */
    641       status=0;                         /* is OK  */
    642       } /* stuff after digits  */
    643 
    644     /* Here when whole string has been inspected; syntax is good  */
    645     /* cfirst->first digit (never dot), last->last digit (ditto)  */
    646 
    647     /* strip leading zeros/dot [leave final 0 if all 0's]  */
    648     if (*cfirst=='0') {                 /* [cfirst has stepped over .]  */
    649       for (c=cfirst; c<last; c++, cfirst++) {
    650         if (*c=='.') continue;          /* ignore dots  */
    651         if (*c!='0') break;             /* non-zero found  */
    652         d--;                            /* 0 stripped  */
    653         } /* c  */
    654       #if DECSUBSET
    655       /* make a rapid exit for easy zeros if !extended  */
    656       if (*cfirst=='0' && !set->extended) {
    657         uprv_decNumberZero(dn);              /* clean result  */
    658         break;                          /* [could be return]  */
    659         }
    660       #endif
    661       } /* at least one leading 0  */
    662 
    663     /* Handle decimal point...  */
    664     if (dotchar!=NULL && dotchar<last)  /* non-trailing '.' found?  */
    665       exponent-=(last-dotchar);         /* adjust exponent  */
    666     /* [we can now ignore the .]  */
    667 
    668     /* OK, the digits string is good.  Assemble in the decNumber, or in  */
    669     /* a temporary units array if rounding is needed  */
    670     if (d<=set->digits) res=dn->lsu;    /* fits into supplied decNumber  */
    671      else {                             /* rounding needed  */
    672       Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed  */
    673       res=resbuff;                      /* assume use local buffer  */
    674       if (needbytes>(Int)sizeof(resbuff)) { /* too big for local  */
    675         allocres=(Unit *)malloc(needbytes);
    676         if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
    677         res=allocres;
    678         }
    679       }
    680     /* res now -> number lsu, buffer, or allocated storage for Unit array  */
    681 
    682     /* Place the coefficient into the selected Unit array  */
    683     /* [this is often 70% of the cost of this function when DECDPUN>1]  */
    684     #if DECDPUN>1
    685     out=0;                         /* accumulator  */
    686     up=res+D2U(d)-1;               /* -> msu  */
    687     cut=d-(up-res)*DECDPUN;        /* digits in top unit  */
    688     for (c=cfirst;; c++) {         /* along the digits  */
    689       if (*c=='.') continue;       /* ignore '.' [don't decrement cut]  */
    690       out=X10(out)+(Int)*c-(Int)'0';
    691       if (c==last) break;          /* done [never get to trailing '.']  */
    692       cut--;
    693       if (cut>0) continue;         /* more for this unit  */
    694       *up=(Unit)out;               /* write unit  */
    695       up--;                        /* prepare for unit below..  */
    696       cut=DECDPUN;                 /* ..  */
    697       out=0;                       /* ..  */
    698       } /* c  */
    699     *up=(Unit)out;                 /* write lsu  */
    700 
    701     #else
    702     /* DECDPUN==1  */
    703     up=res;                        /* -> lsu  */
    704     for (c=last; c>=cfirst; c--) { /* over each character, from least  */
    705       if (*c=='.') continue;       /* ignore . [don't step up]  */
    706       *up=(Unit)((Int)*c-(Int)'0');
    707       up++;
    708       } /* c  */
    709     #endif
    710 
    711     dn->bits=bits;
    712     dn->exponent=exponent;
    713     dn->digits=d;
    714 
    715     /* if not in number (too long) shorten into the number  */
    716     if (d>set->digits) {
    717       residue=0;
    718       decSetCoeff(dn, set, res, d, &residue, &status);
    719       /* always check for overflow or subnormal and round as needed  */
    720       decFinalize(dn, set, &residue, &status);
    721       }
    722      else { /* no rounding, but may still have overflow or subnormal  */
    723       /* [these tests are just for performance; finalize repeats them]  */
    724       if ((dn->exponent-1<set->emin-dn->digits)
    725        || (dn->exponent-1>set->emax-set->digits)) {
    726         residue=0;
    727         decFinalize(dn, set, &residue, &status);
    728         }
    729       }
    730     /* decNumberShow(dn);  */
    731     } while(0);                         /* [for break]  */
    732 
    733   if (allocres!=NULL) free(allocres);   /* drop any storage used  */
    734   if (status!=0) decStatus(dn, status, set);
    735   return dn;
    736   } /* decNumberFromString */
    737 
    738 /* ================================================================== */
    739 /* Operators                                                          */
    740 /* ================================================================== */
    741 
    742 /* ------------------------------------------------------------------ */
    743 /* decNumberAbs -- absolute value operator                            */
    744 /*                                                                    */
    745 /*   This computes C = abs(A)                                         */
    746 /*                                                                    */
    747 /*   res is C, the result.  C may be A                                */
    748 /*   rhs is A                                                         */
    749 /*   set is the context                                               */
    750 /*                                                                    */
    751 /* See also decNumberCopyAbs for a quiet bitwise version of this.     */
    752 /* C must have space for set->digits digits.                          */
    753 /* ------------------------------------------------------------------ */
    754 /* This has the same effect as decNumberPlus unless A is negative,    */
    755 /* in which case it has the same effect as decNumberMinus.            */
    756 /* ------------------------------------------------------------------ */
    757 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAbs(decNumber *res, const decNumber *rhs,
    758                          decContext *set) {
    759   decNumber dzero;                      /* for 0  */
    760   uInt status=0;                        /* accumulator  */
    761 
    762   #if DECCHECK
    763   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
    764   #endif
    765 
    766   uprv_decNumberZero(&dzero);                /* set 0  */
    767   dzero.exponent=rhs->exponent;         /* [no coefficient expansion]  */
    768   decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
    769   if (status!=0) decStatus(res, status, set);
    770   #if DECCHECK
    771   decCheckInexact(res, set);
    772   #endif
    773   return res;
    774   } /* decNumberAbs  */
    775 
    776 /* ------------------------------------------------------------------ */
    777 /* decNumberAdd -- add two Numbers                                    */
    778 /*                                                                    */
    779 /*   This computes C = A + B                                          */
    780 /*                                                                    */
    781 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
    782 /*   lhs is A                                                         */
    783 /*   rhs is B                                                         */
    784 /*   set is the context                                               */
    785 /*                                                                    */
    786 /* C must have space for set->digits digits.                          */
    787 /* ------------------------------------------------------------------ */
    788 /* This just calls the routine shared with Subtract                   */
    789 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAdd(decNumber *res, const decNumber *lhs,
    790                          const decNumber *rhs, decContext *set) {
    791   uInt status=0;                        /* accumulator  */
    792   decAddOp(res, lhs, rhs, set, 0, &status);
    793   if (status!=0) decStatus(res, status, set);
    794   #if DECCHECK
    795   decCheckInexact(res, set);
    796   #endif
    797   return res;
    798   } /* decNumberAdd  */
    799 
    800 /* ------------------------------------------------------------------ */
    801 /* decNumberAnd -- AND two Numbers, digitwise                         */
    802 /*                                                                    */
    803 /*   This computes C = A & B                                          */
    804 /*                                                                    */
    805 /*   res is C, the result.  C may be A and/or B (e.g., X=X&X)         */
    806 /*   lhs is A                                                         */
    807 /*   rhs is B                                                         */
    808 /*   set is the context (used for result length and error report)     */
    809 /*                                                                    */
    810 /* C must have space for set->digits digits.                          */
    811 /*                                                                    */
    812 /* Logical function restrictions apply (see above); a NaN is          */
    813 /* returned with Invalid_operation if a restriction is violated.      */
    814 /* ------------------------------------------------------------------ */
    815 U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber *lhs,
    816                          const decNumber *rhs, decContext *set) {
    817   const Unit *ua, *ub;                  /* -> operands  */
    818   const Unit *msua, *msub;              /* -> operand msus  */
    819   Unit *uc,  *msuc;                     /* -> result and its msu  */
    820   Int   msudigs;                        /* digits in res msu  */
    821   #if DECCHECK
    822   if (decCheckOperands(res, lhs, rhs, set)) return res;
    823   #endif
    824 
    825   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
    826    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
    827     decStatus(res, DEC_Invalid_operation, set);
    828     return res;
    829     }
    830 
    831   /* operands are valid  */
    832   ua=lhs->lsu;                          /* bottom-up  */
    833   ub=rhs->lsu;                          /* ..  */
    834   uc=res->lsu;                          /* ..  */
    835   msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs  */
    836   msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs  */
    837   msuc=uc+D2U(set->digits)-1;           /* -> msu of result  */
    838   msudigs=MSUDIGITS(set->digits);       /* [faster than remainder]  */
    839   for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop  */
    840     Unit a, b;                          /* extract units  */
    841     if (ua>msua) a=0;
    842      else a=*ua;
    843     if (ub>msub) b=0;
    844      else b=*ub;
    845     *uc=0;                              /* can now write back  */
    846     if (a|b) {                          /* maybe 1 bits to examine  */
    847       Int i, j;
    848       *uc=0;                            /* can now write back  */
    849       /* This loop could be unrolled and/or use BIN2BCD tables  */
    850       for (i=0; i<DECDPUN; i++) {
    851         if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND  */
    852         j=a%10;
    853         a=a/10;
    854         j|=b%10;
    855         b=b/10;
    856         if (j>1) {
    857           decStatus(res, DEC_Invalid_operation, set);
    858           return res;
    859           }
    860         if (uc==msuc && i==msudigs-1) break; /* just did final digit  */
    861         } /* each digit  */
    862       } /* both OK  */
    863     } /* each unit  */
    864   /* [here uc-1 is the msu of the result]  */
    865   res->digits=decGetDigits(res->lsu, uc-res->lsu);
    866   res->exponent=0;                      /* integer  */
    867   res->bits=0;                          /* sign=0  */
    868   return res;  /* [no status to set]  */
    869   } /* decNumberAnd  */
    870 
    871 /* ------------------------------------------------------------------ */
    872 /* decNumberCompare -- compare two Numbers                            */
    873 /*                                                                    */
    874 /*   This computes C = A ? B                                          */
    875 /*                                                                    */
    876 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
    877 /*   lhs is A                                                         */
    878 /*   rhs is B                                                         */
    879 /*   set is the context                                               */
    880 /*                                                                    */
    881 /* C must have space for one digit (or NaN).                          */
    882 /* ------------------------------------------------------------------ */
    883 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompare(decNumber *res, const decNumber *lhs,
    884                              const decNumber *rhs, decContext *set) {
    885   uInt status=0;                        /* accumulator  */
    886   decCompareOp(res, lhs, rhs, set, COMPARE, &status);
    887   if (status!=0) decStatus(res, status, set);
    888   return res;
    889   } /* decNumberCompare  */
    890 
    891 /* ------------------------------------------------------------------ */
    892 /* decNumberCompareSignal -- compare, signalling on all NaNs          */
    893 /*                                                                    */
    894 /*   This computes C = A ? B                                          */
    895 /*                                                                    */
    896 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
    897 /*   lhs is A                                                         */
    898 /*   rhs is B                                                         */
    899 /*   set is the context                                               */
    900 /*                                                                    */
    901 /* C must have space for one digit (or NaN).                          */
    902 /* ------------------------------------------------------------------ */
    903 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareSignal(decNumber *res, const decNumber *lhs,
    904                                    const decNumber *rhs, decContext *set) {
    905   uInt status=0;                        /* accumulator  */
    906   decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
    907   if (status!=0) decStatus(res, status, set);
    908   return res;
    909   } /* decNumberCompareSignal  */
    910 
    911 /* ------------------------------------------------------------------ */
    912 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
    913 /*                                                                    */
    914 /*   This computes C = A ? B, under total ordering                    */
    915 /*                                                                    */
    916 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
    917 /*   lhs is A                                                         */
    918 /*   rhs is B                                                         */
    919 /*   set is the context                                               */
    920 /*                                                                    */
    921 /* C must have space for one digit; the result will always be one of  */
    922 /* -1, 0, or 1.                                                       */
    923 /* ------------------------------------------------------------------ */
    924 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotal(decNumber *res, const decNumber *lhs,
    925                                   const decNumber *rhs, decContext *set) {
    926   uInt status=0;                        /* accumulator  */
    927   decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
    928   if (status!=0) decStatus(res, status, set);
    929   return res;
    930   } /* decNumberCompareTotal  */
    931 
    932 /* ------------------------------------------------------------------ */
    933 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
    934 /*                                                                    */
    935 /*   This computes C = |A| ? |B|, under total ordering                */
    936 /*                                                                    */
    937 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
    938 /*   lhs is A                                                         */
    939 /*   rhs is B                                                         */
    940 /*   set is the context                                               */
    941 /*                                                                    */
    942 /* C must have space for one digit; the result will always be one of  */
    943 /* -1, 0, or 1.                                                       */
    944 /* ------------------------------------------------------------------ */
    945 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
    946                                      const decNumber *rhs, decContext *set) {
    947   uInt status=0;                   /* accumulator  */
    948   uInt needbytes;                  /* for space calculations  */
    949   decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0  */
    950   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
    951   decNumber bufb[D2N(DECBUFFER+1)];
    952   decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated  */
    953   decNumber *a, *b;                /* temporary pointers  */
    954 
    955   #if DECCHECK
    956   if (decCheckOperands(res, lhs, rhs, set)) return res;
    957   #endif
    958 
    959   do {                                  /* protect allocated storage  */
    960     /* if either is negative, take a copy and absolute  */
    961     if (decNumberIsNegative(lhs)) {     /* lhs<0  */
    962       a=bufa;
    963       needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
    964       if (needbytes>sizeof(bufa)) {     /* need malloc space  */
    965         allocbufa=(decNumber *)malloc(needbytes);
    966         if (allocbufa==NULL) {          /* hopeless -- abandon  */
    967           status|=DEC_Insufficient_storage;
    968           break;}
    969         a=allocbufa;                    /* use the allocated space  */
    970         }
    971       uprv_decNumberCopy(a, lhs);            /* copy content  */
    972       a->bits&=~DECNEG;                 /* .. and clear the sign  */
    973       lhs=a;                            /* use copy from here on  */
    974       }
    975     if (decNumberIsNegative(rhs)) {     /* rhs<0  */
    976       b=bufb;
    977       needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
    978       if (needbytes>sizeof(bufb)) {     /* need malloc space  */
    979         allocbufb=(decNumber *)malloc(needbytes);
    980         if (allocbufb==NULL) {          /* hopeless -- abandon  */
    981           status|=DEC_Insufficient_storage;
    982           break;}
    983         b=allocbufb;                    /* use the allocated space  */
    984         }
    985       uprv_decNumberCopy(b, rhs);            /* copy content  */
    986       b->bits&=~DECNEG;                 /* .. and clear the sign  */
    987       rhs=b;                            /* use copy from here on  */
    988       }
    989     decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
    990     } while(0);                         /* end protected  */
    991 
    992   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used  */
    993   if (allocbufb!=NULL) free(allocbufb); /* ..  */
    994   if (status!=0) decStatus(res, status, set);
    995   return res;
    996   } /* decNumberCompareTotalMag  */
    997 
    998 /* ------------------------------------------------------------------ */
    999 /* decNumberDivide -- divide one number by another                    */
   1000 /*                                                                    */
   1001 /*   This computes C = A / B                                          */
   1002 /*                                                                    */
   1003 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
   1004 /*   lhs is A                                                         */
   1005 /*   rhs is B                                                         */
   1006 /*   set is the context                                               */
   1007 /*                                                                    */
   1008 /* C must have space for set->digits digits.                          */
   1009 /* ------------------------------------------------------------------ */
   1010 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivide(decNumber *res, const decNumber *lhs,
   1011                             const decNumber *rhs, decContext *set) {
   1012   uInt status=0;                        /* accumulator  */
   1013   decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
   1014   if (status!=0) decStatus(res, status, set);
   1015   #if DECCHECK
   1016   decCheckInexact(res, set);
   1017   #endif
   1018   return res;
   1019   } /* decNumberDivide  */
   1020 
   1021 /* ------------------------------------------------------------------ */
   1022 /* decNumberDivideInteger -- divide and return integer quotient       */
   1023 /*                                                                    */
   1024 /*   This computes C = A # B, where # is the integer divide operator  */
   1025 /*                                                                    */
   1026 /*   res is C, the result.  C may be A and/or B (e.g., X=X#X)         */
   1027 /*   lhs is A                                                         */
   1028 /*   rhs is B                                                         */
   1029 /*   set is the context                                               */
   1030 /*                                                                    */
   1031 /* C must have space for set->digits digits.                          */
   1032 /* ------------------------------------------------------------------ */
   1033 U_CAPI decNumber * U_EXPORT2 uprv_decNumberDivideInteger(decNumber *res, const decNumber *lhs,
   1034                                    const decNumber *rhs, decContext *set) {
   1035   uInt status=0;                        /* accumulator  */
   1036   decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
   1037   if (status!=0) decStatus(res, status, set);
   1038   return res;
   1039   } /* decNumberDivideInteger  */
   1040 
   1041 /* ------------------------------------------------------------------ */
   1042 /* decNumberExp -- exponentiation                                     */
   1043 /*                                                                    */
   1044 /*   This computes C = exp(A)                                         */
   1045 /*                                                                    */
   1046 /*   res is C, the result.  C may be A                                */
   1047 /*   rhs is A                                                         */
   1048 /*   set is the context; note that rounding mode has no effect        */
   1049 /*                                                                    */
   1050 /* C must have space for set->digits digits.                          */
   1051 /*                                                                    */
   1052 /* Mathematical function restrictions apply (see above); a NaN is     */
   1053 /* returned with Invalid_operation if a restriction is violated.      */
   1054 /*                                                                    */
   1055 /* Finite results will always be full precision and Inexact, except   */
   1056 /* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
   1057 /*                                                                    */
   1058 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1059 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1060 /* error in rare cases.                                               */
   1061 /* ------------------------------------------------------------------ */
   1062 /* This is a wrapper for decExpOp which can handle the slightly wider */
   1063 /* (double) range needed by Ln (which has to be able to calculate     */
   1064 /* exp(-a) where a can be the tiniest number (Ntiny).                 */
   1065 /* ------------------------------------------------------------------ */
   1066 U_CAPI decNumber * U_EXPORT2 uprv_decNumberExp(decNumber *res, const decNumber *rhs,
   1067                          decContext *set) {
   1068   uInt status=0;                        /* accumulator  */
   1069   #if DECSUBSET
   1070   decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated  */
   1071   #endif
   1072 
   1073   #if DECCHECK
   1074   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1075   #endif
   1076 
   1077   /* Check restrictions; these restrictions ensure that if h=8 (see  */
   1078   /* decExpOp) then the result will either overflow or underflow to 0.  */
   1079   /* Other math functions restrict the input range, too, for inverses.  */
   1080   /* If not violated then carry out the operation.  */
   1081   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation  */
   1082     #if DECSUBSET
   1083     if (!set->extended) {
   1084       /* reduce operand and set lostDigits status, as needed  */
   1085       if (rhs->digits>set->digits) {
   1086         allocrhs=decRoundOperand(rhs, set, &status);
   1087         if (allocrhs==NULL) break;
   1088         rhs=allocrhs;
   1089         }
   1090       }
   1091     #endif
   1092     decExpOp(res, rhs, set, &status);
   1093     } while(0);                         /* end protected  */
   1094 
   1095   #if DECSUBSET
   1096   if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used  */
   1097   #endif
   1098   /* apply significant status  */
   1099   if (status!=0) decStatus(res, status, set);
   1100   #if DECCHECK
   1101   decCheckInexact(res, set);
   1102   #endif
   1103   return res;
   1104   } /* decNumberExp  */
   1105 
   1106 /* ------------------------------------------------------------------ */
   1107 /* decNumberFMA -- fused multiply add                                 */
   1108 /*                                                                    */
   1109 /*   This computes D = (A * B) + C with only one rounding             */
   1110 /*                                                                    */
   1111 /*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
   1112 /*   lhs is A                                                         */
   1113 /*   rhs is B                                                         */
   1114 /*   fhs is C [far hand side]                                         */
   1115 /*   set is the context                                               */
   1116 /*                                                                    */
   1117 /* Mathematical function restrictions apply (see above); a NaN is     */
   1118 /* returned with Invalid_operation if a restriction is violated.      */
   1119 /*                                                                    */
   1120 /* C must have space for set->digits digits.                          */
   1121 /* ------------------------------------------------------------------ */
   1122 U_CAPI decNumber * U_EXPORT2 uprv_decNumberFMA(decNumber *res, const decNumber *lhs,
   1123                          const decNumber *rhs, const decNumber *fhs,
   1124                          decContext *set) {
   1125   uInt status=0;                   /* accumulator  */
   1126   decContext dcmul;                /* context for the multiplication  */
   1127   uInt needbytes;                  /* for space calculations  */
   1128   decNumber bufa[D2N(DECBUFFER*2+1)];
   1129   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
   1130   decNumber *acc;                  /* accumulator pointer  */
   1131   decNumber dzero;                 /* work  */
   1132 
   1133   #if DECCHECK
   1134   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1135   if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
   1136   #endif
   1137 
   1138   do {                                  /* protect allocated storage  */
   1139     #if DECSUBSET
   1140     if (!set->extended) {               /* [undefined if subset]  */
   1141       status|=DEC_Invalid_operation;
   1142       break;}
   1143     #endif
   1144     /* Check math restrictions [these ensure no overflow or underflow]  */
   1145     if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
   1146      || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
   1147      || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
   1148     /* set up context for multiply  */
   1149     dcmul=*set;
   1150     dcmul.digits=lhs->digits+rhs->digits; /* just enough  */
   1151     /* [The above may be an over-estimate for subset arithmetic, but that's OK]  */
   1152     dcmul.emax=DEC_MAX_EMAX;            /* effectively unbounded ..  */
   1153     dcmul.emin=DEC_MIN_EMIN;            /* [thanks to Math restrictions]  */
   1154     /* set up decNumber space to receive the result of the multiply  */
   1155     acc=bufa;                           /* may fit  */
   1156     needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
   1157     if (needbytes>sizeof(bufa)) {       /* need malloc space  */
   1158       allocbufa=(decNumber *)malloc(needbytes);
   1159       if (allocbufa==NULL) {            /* hopeless -- abandon  */
   1160         status|=DEC_Insufficient_storage;
   1161         break;}
   1162       acc=allocbufa;                    /* use the allocated space  */
   1163       }
   1164     /* multiply with extended range and necessary precision  */
   1165     /*printf("emin=%ld\n", dcmul.emin);  */
   1166     decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
   1167     /* Only Invalid operation (from sNaN or Inf * 0) is possible in  */
   1168     /* status; if either is seen than ignore fhs (in case it is  */
   1169     /* another sNaN) and set acc to NaN unless we had an sNaN  */
   1170     /* [decMultiplyOp leaves that to caller]  */
   1171     /* Note sNaN has to go through addOp to shorten payload if  */
   1172     /* necessary  */
   1173     if ((status&DEC_Invalid_operation)!=0) {
   1174       if (!(status&DEC_sNaN)) {         /* but be true invalid  */
   1175         uprv_decNumberZero(res);             /* acc not yet set  */
   1176         res->bits=DECNAN;
   1177         break;
   1178         }
   1179       uprv_decNumberZero(&dzero);            /* make 0 (any non-NaN would do)  */
   1180       fhs=&dzero;                       /* use that  */
   1181       }
   1182     #if DECCHECK
   1183      else { /* multiply was OK  */
   1184       if (status!=0) printf("Status=%08lx after FMA multiply\n", (LI)status);
   1185       }
   1186     #endif
   1187     /* add the third operand and result -> res, and all is done  */
   1188     decAddOp(res, acc, fhs, set, 0, &status);
   1189     } while(0);                         /* end protected  */
   1190 
   1191   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used  */
   1192   if (status!=0) decStatus(res, status, set);
   1193   #if DECCHECK
   1194   decCheckInexact(res, set);
   1195   #endif
   1196   return res;
   1197   } /* decNumberFMA  */
   1198 
   1199 /* ------------------------------------------------------------------ */
   1200 /* decNumberInvert -- invert a Number, digitwise                      */
   1201 /*                                                                    */
   1202 /*   This computes C = ~A                                             */
   1203 /*                                                                    */
   1204 /*   res is C, the result.  C may be A (e.g., X=~X)                   */
   1205 /*   rhs is A                                                         */
   1206 /*   set is the context (used for result length and error report)     */
   1207 /*                                                                    */
   1208 /* C must have space for set->digits digits.                          */
   1209 /*                                                                    */
   1210 /* Logical function restrictions apply (see above); a NaN is          */
   1211 /* returned with Invalid_operation if a restriction is violated.      */
   1212 /* ------------------------------------------------------------------ */
   1213 U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumber *rhs,
   1214                             decContext *set) {
   1215   const Unit *ua, *msua;                /* -> operand and its msu  */
   1216   Unit  *uc, *msuc;                     /* -> result and its msu  */
   1217   Int   msudigs;                        /* digits in res msu  */
   1218   #if DECCHECK
   1219   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1220   #endif
   1221 
   1222   if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1223     decStatus(res, DEC_Invalid_operation, set);
   1224     return res;
   1225     }
   1226   /* operand is valid  */
   1227   ua=rhs->lsu;                          /* bottom-up  */
   1228   uc=res->lsu;                          /* ..  */
   1229   msua=ua+D2U(rhs->digits)-1;           /* -> msu of rhs  */
   1230   msuc=uc+D2U(set->digits)-1;           /* -> msu of result  */
   1231   msudigs=MSUDIGITS(set->digits);       /* [faster than remainder]  */
   1232   for (; uc<=msuc; ua++, uc++) {        /* Unit loop  */
   1233     Unit a;                             /* extract unit  */
   1234     Int  i, j;                          /* work  */
   1235     if (ua>msua) a=0;
   1236      else a=*ua;
   1237     *uc=0;                              /* can now write back  */
   1238     /* always need to examine all bits in rhs  */
   1239     /* This loop could be unrolled and/or use BIN2BCD tables  */
   1240     for (i=0; i<DECDPUN; i++) {
   1241       if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT  */
   1242       j=a%10;
   1243       a=a/10;
   1244       if (j>1) {
   1245         decStatus(res, DEC_Invalid_operation, set);
   1246         return res;
   1247         }
   1248       if (uc==msuc && i==msudigs-1) break;   /* just did final digit  */
   1249       } /* each digit  */
   1250     } /* each unit  */
   1251   /* [here uc-1 is the msu of the result]  */
   1252   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1253   res->exponent=0;                      /* integer  */
   1254   res->bits=0;                          /* sign=0  */
   1255   return res;  /* [no status to set]  */
   1256   } /* decNumberInvert  */
   1257 
   1258 /* ------------------------------------------------------------------ */
   1259 /* decNumberLn -- natural logarithm                                   */
   1260 /*                                                                    */
   1261 /*   This computes C = ln(A)                                          */
   1262 /*                                                                    */
   1263 /*   res is C, the result.  C may be A                                */
   1264 /*   rhs is A                                                         */
   1265 /*   set is the context; note that rounding mode has no effect        */
   1266 /*                                                                    */
   1267 /* C must have space for set->digits digits.                          */
   1268 /*                                                                    */
   1269 /* Notable cases:                                                     */
   1270 /*   A<0 -> Invalid                                                   */
   1271 /*   A=0 -> -Infinity (Exact)                                         */
   1272 /*   A=+Infinity -> +Infinity (Exact)                                 */
   1273 /*   A=1 exactly -> 0 (Exact)                                         */
   1274 /*                                                                    */
   1275 /* Mathematical function restrictions apply (see above); a NaN is     */
   1276 /* returned with Invalid_operation if a restriction is violated.      */
   1277 /*                                                                    */
   1278 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1279 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1280 /* error in rare cases.                                               */
   1281 /* ------------------------------------------------------------------ */
   1282 /* This is a wrapper for decLnOp which can handle the slightly wider  */
   1283 /* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
   1284 /* to calculate at p+e+2).                                            */
   1285 /* ------------------------------------------------------------------ */
   1286 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLn(decNumber *res, const decNumber *rhs,
   1287                         decContext *set) {
   1288   uInt status=0;                   /* accumulator  */
   1289   #if DECSUBSET
   1290   decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated  */
   1291   #endif
   1292 
   1293   #if DECCHECK
   1294   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1295   #endif
   1296 
   1297   /* Check restrictions; this is a math function; if not violated  */
   1298   /* then carry out the operation.  */
   1299   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation  */
   1300     #if DECSUBSET
   1301     if (!set->extended) {
   1302       /* reduce operand and set lostDigits status, as needed  */
   1303       if (rhs->digits>set->digits) {
   1304         allocrhs=decRoundOperand(rhs, set, &status);
   1305         if (allocrhs==NULL) break;
   1306         rhs=allocrhs;
   1307         }
   1308       /* special check in subset for rhs=0  */
   1309       if (ISZERO(rhs)) {                /* +/- zeros -> error  */
   1310         status|=DEC_Invalid_operation;
   1311         break;}
   1312       } /* extended=0  */
   1313     #endif
   1314     decLnOp(res, rhs, set, &status);
   1315     } while(0);                         /* end protected  */
   1316 
   1317   #if DECSUBSET
   1318   if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used  */
   1319   #endif
   1320   /* apply significant status  */
   1321   if (status!=0) decStatus(res, status, set);
   1322   #if DECCHECK
   1323   decCheckInexact(res, set);
   1324   #endif
   1325   return res;
   1326   } /* decNumberLn  */
   1327 
   1328 /* ------------------------------------------------------------------ */
   1329 /* decNumberLogB - get adjusted exponent, by 754 rules                */
   1330 /*                                                                    */
   1331 /*   This computes C = adjustedexponent(A)                            */
   1332 /*                                                                    */
   1333 /*   res is C, the result.  C may be A                                */
   1334 /*   rhs is A                                                         */
   1335 /*   set is the context, used only for digits and status              */
   1336 /*                                                                    */
   1337 /* C must have space for 10 digits (A might have 10**9 digits and     */
   1338 /* an exponent of +999999999, or one digit and an exponent of         */
   1339 /* -1999999999).                                                      */
   1340 /*                                                                    */
   1341 /* This returns the adjusted exponent of A after (in theory) padding  */
   1342 /* with zeros on the right to set->digits digits while keeping the    */
   1343 /* same value.  The exponent is not limited by emin/emax.             */
   1344 /*                                                                    */
   1345 /* Notable cases:                                                     */
   1346 /*   A<0 -> Use |A|                                                   */
   1347 /*   A=0 -> -Infinity (Division by zero)                              */
   1348 /*   A=Infinite -> +Infinity (Exact)                                  */
   1349 /*   A=1 exactly -> 0 (Exact)                                         */
   1350 /*   NaNs are propagated as usual                                     */
   1351 /* ------------------------------------------------------------------ */
   1352 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLogB(decNumber *res, const decNumber *rhs,
   1353                           decContext *set) {
   1354   uInt status=0;                   /* accumulator  */
   1355 
   1356   #if DECCHECK
   1357   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1358   #endif
   1359 
   1360   /* NaNs as usual; Infinities return +Infinity; 0->oops  */
   1361   if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
   1362    else if (decNumberIsInfinite(rhs)) uprv_decNumberCopyAbs(res, rhs);
   1363    else if (decNumberIsZero(rhs)) {
   1364     uprv_decNumberZero(res);                 /* prepare for Infinity  */
   1365     res->bits=DECNEG|DECINF;            /* -Infinity  */
   1366     status|=DEC_Division_by_zero;       /* as per 754  */
   1367     }
   1368    else { /* finite non-zero  */
   1369     Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent  */
   1370     uprv_decNumberFromInt32(res, ae);        /* lay it out  */
   1371     }
   1372 
   1373   if (status!=0) decStatus(res, status, set);
   1374   return res;
   1375   } /* decNumberLogB  */
   1376 
   1377 /* ------------------------------------------------------------------ */
   1378 /* decNumberLog10 -- logarithm in base 10                             */
   1379 /*                                                                    */
   1380 /*   This computes C = log10(A)                                       */
   1381 /*                                                                    */
   1382 /*   res is C, the result.  C may be A                                */
   1383 /*   rhs is A                                                         */
   1384 /*   set is the context; note that rounding mode has no effect        */
   1385 /*                                                                    */
   1386 /* C must have space for set->digits digits.                          */
   1387 /*                                                                    */
   1388 /* Notable cases:                                                     */
   1389 /*   A<0 -> Invalid                                                   */
   1390 /*   A=0 -> -Infinity (Exact)                                         */
   1391 /*   A=+Infinity -> +Infinity (Exact)                                 */
   1392 /*   A=10**n (if n is an integer) -> n (Exact)                        */
   1393 /*                                                                    */
   1394 /* Mathematical function restrictions apply (see above); a NaN is     */
   1395 /* returned with Invalid_operation if a restriction is violated.      */
   1396 /*                                                                    */
   1397 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
   1398 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1399 /* error in rare cases.                                               */
   1400 /* ------------------------------------------------------------------ */
   1401 /* This calculates ln(A)/ln(10) using appropriate precision.  For     */
   1402 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
   1403 /* requested digits and t is the number of digits in the exponent     */
   1404 /* (maximum 6).  For ln(10) it is p + 3; this is often handled by the */
   1405 /* fastpath in decLnOp.  The final division is done to the requested  */
   1406 /* precision.                                                         */
   1407 /* ------------------------------------------------------------------ */
   1408 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   1409 #pragma GCC diagnostic push
   1410 #pragma GCC diagnostic ignored "-Warray-bounds"
   1411 #endif
   1412 U_CAPI decNumber * U_EXPORT2 uprv_decNumberLog10(decNumber *res, const decNumber *rhs,
   1413                           decContext *set) {
   1414   uInt status=0, ignore=0;         /* status accumulators  */
   1415   uInt needbytes;                  /* for space calculations  */
   1416   Int p;                           /* working precision  */
   1417   Int t;                           /* digits in exponent of A  */
   1418 
   1419   /* buffers for a and b working decimals  */
   1420   /* (adjustment calculator, same size)  */
   1421   decNumber bufa[D2N(DECBUFFER+2)];
   1422   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
   1423   decNumber *a=bufa;               /* temporary a  */
   1424   decNumber bufb[D2N(DECBUFFER+2)];
   1425   decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated  */
   1426   decNumber *b=bufb;               /* temporary b  */
   1427   decNumber bufw[D2N(10)];         /* working 2-10 digit number  */
   1428   decNumber *w=bufw;               /* ..  */
   1429   #if DECSUBSET
   1430   decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated  */
   1431   #endif
   1432 
   1433   decContext aset;                 /* working context  */
   1434 
   1435   #if DECCHECK
   1436   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1437   #endif
   1438 
   1439   /* Check restrictions; this is a math function; if not violated  */
   1440   /* then carry out the operation.  */
   1441   if (!decCheckMath(rhs, set, &status)) do { /* protect malloc  */
   1442     #if DECSUBSET
   1443     if (!set->extended) {
   1444       /* reduce operand and set lostDigits status, as needed  */
   1445       if (rhs->digits>set->digits) {
   1446         allocrhs=decRoundOperand(rhs, set, &status);
   1447         if (allocrhs==NULL) break;
   1448         rhs=allocrhs;
   1449         }
   1450       /* special check in subset for rhs=0  */
   1451       if (ISZERO(rhs)) {                /* +/- zeros -> error  */
   1452         status|=DEC_Invalid_operation;
   1453         break;}
   1454       } /* extended=0  */
   1455     #endif
   1456 
   1457     uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context  */
   1458 
   1459     /* handle exact powers of 10; only check if +ve finite  */
   1460     if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
   1461       Int residue=0;               /* (no residue)  */
   1462       uInt copystat=0;             /* clean status  */
   1463 
   1464       /* round to a single digit...  */
   1465       aset.digits=1;
   1466       decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten  */
   1467       /* if exact and the digit is 1, rhs is a power of 10  */
   1468       if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
   1469         /* the exponent, conveniently, is the power of 10; making  */
   1470         /* this the result needs a little care as it might not fit,  */
   1471         /* so first convert it into the working number, and then move  */
   1472         /* to res  */
   1473         uprv_decNumberFromInt32(w, w->exponent);
   1474         residue=0;
   1475         decCopyFit(res, w, set, &residue, &status); /* copy & round  */
   1476         decFinish(res, set, &residue, &status);     /* cleanup/set flags  */
   1477         break;
   1478         } /* not a power of 10  */
   1479       } /* not a candidate for exact  */
   1480 
   1481     /* simplify the information-content calculation to use 'total  */
   1482     /* number of digits in a, including exponent' as compared to the  */
   1483     /* requested digits, as increasing this will only rarely cost an  */
   1484     /* iteration in ln(a) anyway  */
   1485     t=6;                                /* it can never be >6  */
   1486 
   1487     /* allocate space when needed...  */
   1488     p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
   1489     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1490     if (needbytes>sizeof(bufa)) {       /* need malloc space  */
   1491       allocbufa=(decNumber *)malloc(needbytes);
   1492       if (allocbufa==NULL) {            /* hopeless -- abandon  */
   1493         status|=DEC_Insufficient_storage;
   1494         break;}
   1495       a=allocbufa;                      /* use the allocated space  */
   1496       }
   1497     aset.digits=p;                      /* as calculated  */
   1498     aset.emax=DEC_MAX_MATH;             /* usual bounds  */
   1499     aset.emin=-DEC_MAX_MATH;            /* ..  */
   1500     aset.clamp=0;                       /* and no concrete format  */
   1501     decLnOp(a, rhs, &aset, &status);    /* a=ln(rhs)  */
   1502 
   1503     /* skip the division if the result so far is infinite, NaN, or  */
   1504     /* zero, or there was an error; note NaN from sNaN needs copy  */
   1505     if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
   1506     if (a->bits&DECSPECIAL || ISZERO(a)) {
   1507       uprv_decNumberCopy(res, a);            /* [will fit]  */
   1508       break;}
   1509 
   1510     /* for ln(10) an extra 3 digits of precision are needed  */
   1511     p=set->digits+3;
   1512     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
   1513     if (needbytes>sizeof(bufb)) {       /* need malloc space  */
   1514       allocbufb=(decNumber *)malloc(needbytes);
   1515       if (allocbufb==NULL) {            /* hopeless -- abandon  */
   1516         status|=DEC_Insufficient_storage;
   1517         break;}
   1518       b=allocbufb;                      /* use the allocated space  */
   1519       }
   1520     uprv_decNumberZero(w);                   /* set up 10...  */
   1521     #if DECDPUN==1
   1522     w->lsu[1]=1; w->lsu[0]=0;           /* ..  */
   1523     #else
   1524     w->lsu[0]=10;                       /* ..  */
   1525     #endif
   1526     w->digits=2;                        /* ..  */
   1527 
   1528     aset.digits=p;
   1529     decLnOp(b, w, &aset, &ignore);      /* b=ln(10)  */
   1530 
   1531     aset.digits=set->digits;            /* for final divide  */
   1532     decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result  */
   1533     } while(0);                         /* [for break]  */
   1534 
   1535   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used  */
   1536   if (allocbufb!=NULL) free(allocbufb); /* ..  */
   1537   #if DECSUBSET
   1538   if (allocrhs !=NULL) free(allocrhs);  /* ..  */
   1539   #endif
   1540   /* apply significant status  */
   1541   if (status!=0) decStatus(res, status, set);
   1542   #if DECCHECK
   1543   decCheckInexact(res, set);
   1544   #endif
   1545   return res;
   1546   } /* decNumberLog10  */
   1547 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   1548 #pragma GCC diagnostic pop
   1549 #endif
   1550 
   1551 /* ------------------------------------------------------------------ */
   1552 /* decNumberMax -- compare two Numbers and return the maximum         */
   1553 /*                                                                    */
   1554 /*   This computes C = A ? B, returning the maximum by 754 rules      */
   1555 /*                                                                    */
   1556 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
   1557 /*   lhs is A                                                         */
   1558 /*   rhs is B                                                         */
   1559 /*   set is the context                                               */
   1560 /*                                                                    */
   1561 /* C must have space for set->digits digits.                          */
   1562 /* ------------------------------------------------------------------ */
   1563 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMax(decNumber *res, const decNumber *lhs,
   1564                          const decNumber *rhs, decContext *set) {
   1565   uInt status=0;                        /* accumulator  */
   1566   decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
   1567   if (status!=0) decStatus(res, status, set);
   1568   #if DECCHECK
   1569   decCheckInexact(res, set);
   1570   #endif
   1571   return res;
   1572   } /* decNumberMax  */
   1573 
   1574 /* ------------------------------------------------------------------ */
   1575 /* decNumberMaxMag -- compare and return the maximum by magnitude     */
   1576 /*                                                                    */
   1577 /*   This computes C = A ? B, returning the maximum by 754 rules      */
   1578 /*                                                                    */
   1579 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
   1580 /*   lhs is A                                                         */
   1581 /*   rhs is B                                                         */
   1582 /*   set is the context                                               */
   1583 /*                                                                    */
   1584 /* C must have space for set->digits digits.                          */
   1585 /* ------------------------------------------------------------------ */
   1586 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMaxMag(decNumber *res, const decNumber *lhs,
   1587                          const decNumber *rhs, decContext *set) {
   1588   uInt status=0;                        /* accumulator  */
   1589   decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
   1590   if (status!=0) decStatus(res, status, set);
   1591   #if DECCHECK
   1592   decCheckInexact(res, set);
   1593   #endif
   1594   return res;
   1595   } /* decNumberMaxMag  */
   1596 
   1597 /* ------------------------------------------------------------------ */
   1598 /* decNumberMin -- compare two Numbers and return the minimum         */
   1599 /*                                                                    */
   1600 /*   This computes C = A ? B, returning the minimum by 754 rules      */
   1601 /*                                                                    */
   1602 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
   1603 /*   lhs is A                                                         */
   1604 /*   rhs is B                                                         */
   1605 /*   set is the context                                               */
   1606 /*                                                                    */
   1607 /* C must have space for set->digits digits.                          */
   1608 /* ------------------------------------------------------------------ */
   1609 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMin(decNumber *res, const decNumber *lhs,
   1610                          const decNumber *rhs, decContext *set) {
   1611   uInt status=0;                        /* accumulator  */
   1612   decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
   1613   if (status!=0) decStatus(res, status, set);
   1614   #if DECCHECK
   1615   decCheckInexact(res, set);
   1616   #endif
   1617   return res;
   1618   } /* decNumberMin  */
   1619 
   1620 /* ------------------------------------------------------------------ */
   1621 /* decNumberMinMag -- compare and return the minimum by magnitude     */
   1622 /*                                                                    */
   1623 /*   This computes C = A ? B, returning the minimum by 754 rules      */
   1624 /*                                                                    */
   1625 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
   1626 /*   lhs is A                                                         */
   1627 /*   rhs is B                                                         */
   1628 /*   set is the context                                               */
   1629 /*                                                                    */
   1630 /* C must have space for set->digits digits.                          */
   1631 /* ------------------------------------------------------------------ */
   1632 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinMag(decNumber *res, const decNumber *lhs,
   1633                          const decNumber *rhs, decContext *set) {
   1634   uInt status=0;                        /* accumulator  */
   1635   decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
   1636   if (status!=0) decStatus(res, status, set);
   1637   #if DECCHECK
   1638   decCheckInexact(res, set);
   1639   #endif
   1640   return res;
   1641   } /* decNumberMinMag  */
   1642 
   1643 /* ------------------------------------------------------------------ */
   1644 /* decNumberMinus -- prefix minus operator                            */
   1645 /*                                                                    */
   1646 /*   This computes C = 0 - A                                          */
   1647 /*                                                                    */
   1648 /*   res is C, the result.  C may be A                                */
   1649 /*   rhs is A                                                         */
   1650 /*   set is the context                                               */
   1651 /*                                                                    */
   1652 /* See also decNumberCopyNegate for a quiet bitwise version of this.  */
   1653 /* C must have space for set->digits digits.                          */
   1654 /* ------------------------------------------------------------------ */
   1655 /* Simply use AddOp for the subtract, which will do the necessary.    */
   1656 /* ------------------------------------------------------------------ */
   1657 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMinus(decNumber *res, const decNumber *rhs,
   1658                            decContext *set) {
   1659   decNumber dzero;
   1660   uInt status=0;                        /* accumulator  */
   1661 
   1662   #if DECCHECK
   1663   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1664   #endif
   1665 
   1666   uprv_decNumberZero(&dzero);                /* make 0  */
   1667   dzero.exponent=rhs->exponent;         /* [no coefficient expansion]  */
   1668   decAddOp(res, &dzero, rhs, set, DECNEG, &status);
   1669   if (status!=0) decStatus(res, status, set);
   1670   #if DECCHECK
   1671   decCheckInexact(res, set);
   1672   #endif
   1673   return res;
   1674   } /* decNumberMinus  */
   1675 
   1676 /* ------------------------------------------------------------------ */
   1677 /* decNumberNextMinus -- next towards -Infinity                       */
   1678 /*                                                                    */
   1679 /*   This computes C = A - infinitesimal, rounded towards -Infinity   */
   1680 /*                                                                    */
   1681 /*   res is C, the result.  C may be A                                */
   1682 /*   rhs is A                                                         */
   1683 /*   set is the context                                               */
   1684 /*                                                                    */
   1685 /* This is a generalization of 754 NextDown.                          */
   1686 /* ------------------------------------------------------------------ */
   1687 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextMinus(decNumber *res, const decNumber *rhs,
   1688                                decContext *set) {
   1689   decNumber dtiny;                           /* constant  */
   1690   decContext workset=*set;                   /* work  */
   1691   uInt status=0;                             /* accumulator  */
   1692   #if DECCHECK
   1693   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1694   #endif
   1695 
   1696   /* +Infinity is the special case  */
   1697   if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
   1698     decSetMaxValue(res, set);                /* is +ve  */
   1699     /* there is no status to set  */
   1700     return res;
   1701     }
   1702   uprv_decNumberZero(&dtiny);                     /* start with 0  */
   1703   dtiny.lsu[0]=1;                            /* make number that is ..  */
   1704   dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest  */
   1705   workset.round=DEC_ROUND_FLOOR;
   1706   decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
   1707   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please  */
   1708   if (status!=0) decStatus(res, status, set);
   1709   return res;
   1710   } /* decNumberNextMinus  */
   1711 
   1712 /* ------------------------------------------------------------------ */
   1713 /* decNumberNextPlus -- next towards +Infinity                        */
   1714 /*                                                                    */
   1715 /*   This computes C = A + infinitesimal, rounded towards +Infinity   */
   1716 /*                                                                    */
   1717 /*   res is C, the result.  C may be A                                */
   1718 /*   rhs is A                                                         */
   1719 /*   set is the context                                               */
   1720 /*                                                                    */
   1721 /* This is a generalization of 754 NextUp.                            */
   1722 /* ------------------------------------------------------------------ */
   1723 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextPlus(decNumber *res, const decNumber *rhs,
   1724                               decContext *set) {
   1725   decNumber dtiny;                           /* constant  */
   1726   decContext workset=*set;                   /* work  */
   1727   uInt status=0;                             /* accumulator  */
   1728   #if DECCHECK
   1729   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1730   #endif
   1731 
   1732   /* -Infinity is the special case  */
   1733   if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1734     decSetMaxValue(res, set);
   1735     res->bits=DECNEG;                        /* negative  */
   1736     /* there is no status to set  */
   1737     return res;
   1738     }
   1739   uprv_decNumberZero(&dtiny);                     /* start with 0  */
   1740   dtiny.lsu[0]=1;                            /* make number that is ..  */
   1741   dtiny.exponent=DEC_MIN_EMIN-1;             /* .. smaller than tiniest  */
   1742   workset.round=DEC_ROUND_CEILING;
   1743   decAddOp(res, rhs, &dtiny, &workset, 0, &status);
   1744   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please  */
   1745   if (status!=0) decStatus(res, status, set);
   1746   return res;
   1747   } /* decNumberNextPlus  */
   1748 
   1749 /* ------------------------------------------------------------------ */
   1750 /* decNumberNextToward -- next towards rhs                            */
   1751 /*                                                                    */
   1752 /*   This computes C = A +/- infinitesimal, rounded towards           */
   1753 /*   +/-Infinity in the direction of B, as per 754-1985 nextafter     */
   1754 /*   modified during revision but dropped from 754-2008.              */
   1755 /*                                                                    */
   1756 /*   res is C, the result.  C may be A or B.                          */
   1757 /*   lhs is A                                                         */
   1758 /*   rhs is B                                                         */
   1759 /*   set is the context                                               */
   1760 /*                                                                    */
   1761 /* This is a generalization of 754-1985 NextAfter.                    */
   1762 /* ------------------------------------------------------------------ */
   1763 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNextToward(decNumber *res, const decNumber *lhs,
   1764                                 const decNumber *rhs, decContext *set) {
   1765   decNumber dtiny;                           /* constant  */
   1766   decContext workset=*set;                   /* work  */
   1767   Int result;                                /* ..  */
   1768   uInt status=0;                             /* accumulator  */
   1769   #if DECCHECK
   1770   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1771   #endif
   1772 
   1773   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
   1774     decNaNs(res, lhs, rhs, set, &status);
   1775     }
   1776    else { /* Is numeric, so no chance of sNaN Invalid, etc.  */
   1777     result=decCompare(lhs, rhs, 0);     /* sign matters  */
   1778     if (result==BADINT) status|=DEC_Insufficient_storage; /* rare  */
   1779      else { /* valid compare  */
   1780       if (result==0) uprv_decNumberCopySign(res, lhs, rhs); /* easy  */
   1781        else { /* differ: need NextPlus or NextMinus  */
   1782         uByte sub;                      /* add or subtract  */
   1783         if (result<0) {                 /* lhs<rhs, do nextplus  */
   1784           /* -Infinity is the special case  */
   1785           if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
   1786             decSetMaxValue(res, set);
   1787             res->bits=DECNEG;           /* negative  */
   1788             return res;                 /* there is no status to set  */
   1789             }
   1790           workset.round=DEC_ROUND_CEILING;
   1791           sub=0;                        /* add, please  */
   1792           } /* plus  */
   1793          else {                         /* lhs>rhs, do nextminus  */
   1794           /* +Infinity is the special case  */
   1795           if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
   1796             decSetMaxValue(res, set);
   1797             return res;                 /* there is no status to set  */
   1798             }
   1799           workset.round=DEC_ROUND_FLOOR;
   1800           sub=DECNEG;                   /* subtract, please  */
   1801           } /* minus  */
   1802         uprv_decNumberZero(&dtiny);          /* start with 0  */
   1803         dtiny.lsu[0]=1;                 /* make number that is ..  */
   1804         dtiny.exponent=DEC_MIN_EMIN-1;  /* .. smaller than tiniest  */
   1805         decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or -  */
   1806         /* turn off exceptions if the result is a normal number  */
   1807         /* (including Nmin), otherwise let all status through  */
   1808         if (uprv_decNumberIsNormal(res, set)) status=0;
   1809         } /* unequal  */
   1810       } /* compare OK  */
   1811     } /* numeric  */
   1812   if (status!=0) decStatus(res, status, set);
   1813   return res;
   1814   } /* decNumberNextToward  */
   1815 
   1816 /* ------------------------------------------------------------------ */
   1817 /* decNumberOr -- OR two Numbers, digitwise                           */
   1818 /*                                                                    */
   1819 /*   This computes C = A | B                                          */
   1820 /*                                                                    */
   1821 /*   res is C, the result.  C may be A and/or B (e.g., X=X|X)         */
   1822 /*   lhs is A                                                         */
   1823 /*   rhs is B                                                         */
   1824 /*   set is the context (used for result length and error report)     */
   1825 /*                                                                    */
   1826 /* C must have space for set->digits digits.                          */
   1827 /*                                                                    */
   1828 /* Logical function restrictions apply (see above); a NaN is          */
   1829 /* returned with Invalid_operation if a restriction is violated.      */
   1830 /* ------------------------------------------------------------------ */
   1831 U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *lhs,
   1832                         const decNumber *rhs, decContext *set) {
   1833   const Unit *ua, *ub;                  /* -> operands  */
   1834   const Unit *msua, *msub;              /* -> operand msus  */
   1835   Unit  *uc, *msuc;                     /* -> result and its msu  */
   1836   Int   msudigs;                        /* digits in res msu  */
   1837   #if DECCHECK
   1838   if (decCheckOperands(res, lhs, rhs, set)) return res;
   1839   #endif
   1840 
   1841   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   1842    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   1843     decStatus(res, DEC_Invalid_operation, set);
   1844     return res;
   1845     }
   1846   /* operands are valid  */
   1847   ua=lhs->lsu;                          /* bottom-up  */
   1848   ub=rhs->lsu;                          /* ..  */
   1849   uc=res->lsu;                          /* ..  */
   1850   msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs  */
   1851   msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs  */
   1852   msuc=uc+D2U(set->digits)-1;           /* -> msu of result  */
   1853   msudigs=MSUDIGITS(set->digits);       /* [faster than remainder]  */
   1854   for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop  */
   1855     Unit a, b;                          /* extract units  */
   1856     if (ua>msua) a=0;
   1857      else a=*ua;
   1858     if (ub>msub) b=0;
   1859      else b=*ub;
   1860     *uc=0;                              /* can now write back  */
   1861     if (a|b) {                          /* maybe 1 bits to examine  */
   1862       Int i, j;
   1863       /* This loop could be unrolled and/or use BIN2BCD tables  */
   1864       for (i=0; i<DECDPUN; i++) {
   1865         if ((a|b)&1) *uc=*uc+(Unit)powers[i];     /* effect OR  */
   1866         j=a%10;
   1867         a=a/10;
   1868         j|=b%10;
   1869         b=b/10;
   1870         if (j>1) {
   1871           decStatus(res, DEC_Invalid_operation, set);
   1872           return res;
   1873           }
   1874         if (uc==msuc && i==msudigs-1) break;      /* just did final digit  */
   1875         } /* each digit  */
   1876       } /* non-zero  */
   1877     } /* each unit  */
   1878   /* [here uc-1 is the msu of the result]  */
   1879   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   1880   res->exponent=0;                      /* integer  */
   1881   res->bits=0;                          /* sign=0  */
   1882   return res;  /* [no status to set]  */
   1883   } /* decNumberOr  */
   1884 
   1885 /* ------------------------------------------------------------------ */
   1886 /* decNumberPlus -- prefix plus operator                              */
   1887 /*                                                                    */
   1888 /*   This computes C = 0 + A                                          */
   1889 /*                                                                    */
   1890 /*   res is C, the result.  C may be A                                */
   1891 /*   rhs is A                                                         */
   1892 /*   set is the context                                               */
   1893 /*                                                                    */
   1894 /* See also decNumberCopy for a quiet bitwise version of this.        */
   1895 /* C must have space for set->digits digits.                          */
   1896 /* ------------------------------------------------------------------ */
   1897 /* This simply uses AddOp; Add will take fast path after preparing A. */
   1898 /* Performance is a concern here, as this routine is often used to    */
   1899 /* check operands and apply rounding and overflow/underflow testing.  */
   1900 /* ------------------------------------------------------------------ */
   1901 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPlus(decNumber *res, const decNumber *rhs,
   1902                           decContext *set) {
   1903   decNumber dzero;
   1904   uInt status=0;                        /* accumulator  */
   1905   #if DECCHECK
   1906   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   1907   #endif
   1908 
   1909   uprv_decNumberZero(&dzero);                /* make 0  */
   1910   dzero.exponent=rhs->exponent;         /* [no coefficient expansion]  */
   1911   decAddOp(res, &dzero, rhs, set, 0, &status);
   1912   if (status!=0) decStatus(res, status, set);
   1913   #if DECCHECK
   1914   decCheckInexact(res, set);
   1915   #endif
   1916   return res;
   1917   } /* decNumberPlus  */
   1918 
   1919 /* ------------------------------------------------------------------ */
   1920 /* decNumberMultiply -- multiply two Numbers                          */
   1921 /*                                                                    */
   1922 /*   This computes C = A x B                                          */
   1923 /*                                                                    */
   1924 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
   1925 /*   lhs is A                                                         */
   1926 /*   rhs is B                                                         */
   1927 /*   set is the context                                               */
   1928 /*                                                                    */
   1929 /* C must have space for set->digits digits.                          */
   1930 /* ------------------------------------------------------------------ */
   1931 U_CAPI decNumber * U_EXPORT2 uprv_decNumberMultiply(decNumber *res, const decNumber *lhs,
   1932                               const decNumber *rhs, decContext *set) {
   1933   uInt status=0;                   /* accumulator  */
   1934   decMultiplyOp(res, lhs, rhs, set, &status);
   1935   if (status!=0) decStatus(res, status, set);
   1936   #if DECCHECK
   1937   decCheckInexact(res, set);
   1938   #endif
   1939   return res;
   1940   } /* decNumberMultiply  */
   1941 
   1942 /* ------------------------------------------------------------------ */
   1943 /* decNumberPower -- raise a number to a power                        */
   1944 /*                                                                    */
   1945 /*   This computes C = A ** B                                         */
   1946 /*                                                                    */
   1947 /*   res is C, the result.  C may be A and/or B (e.g., X=X**X)        */
   1948 /*   lhs is A                                                         */
   1949 /*   rhs is B                                                         */
   1950 /*   set is the context                                               */
   1951 /*                                                                    */
   1952 /* C must have space for set->digits digits.                          */
   1953 /*                                                                    */
   1954 /* Mathematical function restrictions apply (see above); a NaN is     */
   1955 /* returned with Invalid_operation if a restriction is violated.      */
   1956 /*                                                                    */
   1957 /* However, if 1999999997<=B<=999999999 and B is an integer then the  */
   1958 /* restrictions on A and the context are relaxed to the usual bounds, */
   1959 /* for compatibility with the earlier (integer power only) version    */
   1960 /* of this function.                                                  */
   1961 /*                                                                    */
   1962 /* When B is an integer, the result may be exact, even if rounded.    */
   1963 /*                                                                    */
   1964 /* The final result is rounded according to the context; it will      */
   1965 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   1966 /* error in rare cases.                                               */
   1967 /* ------------------------------------------------------------------ */
   1968 U_CAPI decNumber * U_EXPORT2 uprv_decNumberPower(decNumber *res, const decNumber *lhs,
   1969                            const decNumber *rhs, decContext *set) {
   1970   #if DECSUBSET
   1971   decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated  */
   1972   decNumber *allocrhs=NULL;        /* .., rhs  */
   1973   #endif
   1974   decNumber *allocdac=NULL;        /* -> allocated acc buffer, iff used  */
   1975   decNumber *allocinv=NULL;        /* -> allocated 1/x buffer, iff used  */
   1976   Int   reqdigits=set->digits;     /* requested DIGITS  */
   1977   Int   n;                         /* rhs in binary  */
   1978   Flag  rhsint=0;                  /* 1 if rhs is an integer  */
   1979   Flag  useint=0;                  /* 1 if can use integer calculation  */
   1980   Flag  isoddint=0;                /* 1 if rhs is an integer and odd  */
   1981   Int   i;                         /* work  */
   1982   #if DECSUBSET
   1983   Int   dropped;                   /* ..  */
   1984   #endif
   1985   uInt  needbytes;                 /* buffer size needed  */
   1986   Flag  seenbit;                   /* seen a bit while powering  */
   1987   Int   residue=0;                 /* rounding residue  */
   1988   uInt  status=0;                  /* accumulators  */
   1989   uByte bits=0;                    /* result sign if errors  */
   1990   decContext aset;                 /* working context  */
   1991   decNumber dnOne;                 /* work value 1...  */
   1992   /* local accumulator buffer [a decNumber, with digits+elength+1 digits]  */
   1993   decNumber dacbuff[D2N(DECBUFFER+9)];
   1994   decNumber *dac=dacbuff;          /* -> result accumulator  */
   1995   /* same again for possible 1/lhs calculation  */
   1996   decNumber invbuff[D2N(DECBUFFER+9)];
   1997 
   1998   #if DECCHECK
   1999   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2000   #endif
   2001 
   2002   do {                             /* protect allocated storage  */
   2003     #if DECSUBSET
   2004     if (!set->extended) { /* reduce operands and set status, as needed  */
   2005       if (lhs->digits>reqdigits) {
   2006         alloclhs=decRoundOperand(lhs, set, &status);
   2007         if (alloclhs==NULL) break;
   2008         lhs=alloclhs;
   2009         }
   2010       if (rhs->digits>reqdigits) {
   2011         allocrhs=decRoundOperand(rhs, set, &status);
   2012         if (allocrhs==NULL) break;
   2013         rhs=allocrhs;
   2014         }
   2015       }
   2016     #endif
   2017     /* [following code does not require input rounding]  */
   2018 
   2019     /* handle NaNs and rhs Infinity (lhs infinity is harder)  */
   2020     if (SPECIALARGS) {
   2021       if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs  */
   2022         decNaNs(res, lhs, rhs, set, &status);
   2023         break;}
   2024       if (decNumberIsInfinite(rhs)) {   /* rhs Infinity  */
   2025         Flag rhsneg=rhs->bits&DECNEG;   /* save rhs sign  */
   2026         if (decNumberIsNegative(lhs)    /* lhs<0  */
   2027          && !decNumberIsZero(lhs))      /* ..  */
   2028           status|=DEC_Invalid_operation;
   2029          else {                         /* lhs >=0  */
   2030           uprv_decNumberZero(&dnOne);        /* set up 1  */
   2031           dnOne.lsu[0]=1;
   2032           uprv_decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1  */
   2033           uprv_decNumberZero(res);           /* prepare for 0/1/Infinity  */
   2034           if (decNumberIsNegative(dac)) {    /* lhs<1  */
   2035             if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0]  */
   2036             }
   2037            else if (dac->lsu[0]==0) {        /* lhs=1  */
   2038             /* 1**Infinity is inexact, so return fully-padded 1.0000  */
   2039             Int shift=set->digits-1;
   2040             *res->lsu=1;                     /* was 0, make int 1  */
   2041             res->digits=decShiftToMost(res->lsu, 1, shift);
   2042             res->exponent=-shift;            /* make 1.0000...  */
   2043             status|=DEC_Inexact|DEC_Rounded; /* deemed inexact  */
   2044             }
   2045            else {                            /* lhs>1  */
   2046             if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0]  */
   2047             }
   2048           } /* lhs>=0  */
   2049         break;}
   2050       /* [lhs infinity drops through]  */
   2051       } /* specials  */
   2052 
   2053     /* Original rhs may be an integer that fits and is in range  */
   2054     n=decGetInt(rhs);
   2055     if (n!=BADINT) {                    /* it is an integer  */
   2056       rhsint=1;                         /* record the fact for 1**n  */
   2057       isoddint=(Flag)n&1;               /* [works even if big]  */
   2058       if (n!=BIGEVEN && n!=BIGODD)      /* can use integer path?  */
   2059         useint=1;                       /* looks good  */
   2060       }
   2061 
   2062     if (decNumberIsNegative(lhs)        /* -x ..  */
   2063       && isoddint) bits=DECNEG;         /* .. to an odd power  */
   2064 
   2065     /* handle LHS infinity  */
   2066     if (decNumberIsInfinite(lhs)) {     /* [NaNs already handled]  */
   2067       uByte rbits=rhs->bits;            /* save  */
   2068       uprv_decNumberZero(res);               /* prepare  */
   2069       if (n==0) *res->lsu=1;            /* [-]Inf**0 => 1  */
   2070        else {
   2071         /* -Inf**nonint -> error  */
   2072         if (!rhsint && decNumberIsNegative(lhs)) {
   2073           status|=DEC_Invalid_operation;     /* -Inf**nonint is error  */
   2074           break;}
   2075         if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n  */
   2076         /* [otherwise will be 0 or -0]  */
   2077         res->bits=bits;
   2078         }
   2079       break;}
   2080 
   2081     /* similarly handle LHS zero  */
   2082     if (decNumberIsZero(lhs)) {
   2083       if (n==0) {                            /* 0**0 => Error  */
   2084         #if DECSUBSET
   2085         if (!set->extended) {                /* [unless subset]  */
   2086           uprv_decNumberZero(res);
   2087           *res->lsu=1;                       /* return 1  */
   2088           break;}
   2089         #endif
   2090         status|=DEC_Invalid_operation;
   2091         }
   2092        else {                                /* 0**x  */
   2093         uByte rbits=rhs->bits;               /* save  */
   2094         if (rbits & DECNEG) {                /* was a 0**(-n)  */
   2095           #if DECSUBSET
   2096           if (!set->extended) {              /* [bad if subset]  */
   2097             status|=DEC_Invalid_operation;
   2098             break;}
   2099           #endif
   2100           bits|=DECINF;
   2101           }
   2102         uprv_decNumberZero(res);                  /* prepare  */
   2103         /* [otherwise will be 0 or -0]  */
   2104         res->bits=bits;
   2105         }
   2106       break;}
   2107 
   2108     /* here both lhs and rhs are finite; rhs==0 is handled in the  */
   2109     /* integer path.  Next handle the non-integer cases  */
   2110     if (!useint) {                      /* non-integral rhs  */
   2111       /* any -ve lhs is bad, as is either operand or context out of  */
   2112       /* bounds  */
   2113       if (decNumberIsNegative(lhs)) {
   2114         status|=DEC_Invalid_operation;
   2115         break;}
   2116       if (decCheckMath(lhs, set, &status)
   2117        || decCheckMath(rhs, set, &status)) break; /* variable status  */
   2118 
   2119       uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context  */
   2120       aset.emax=DEC_MAX_MATH;           /* usual bounds  */
   2121       aset.emin=-DEC_MAX_MATH;          /* ..  */
   2122       aset.clamp=0;                     /* and no concrete format  */
   2123 
   2124       /* calculate the result using exp(ln(lhs)*rhs), which can  */
   2125       /* all be done into the accumulator, dac.  The precision needed  */
   2126       /* is enough to contain the full information in the lhs (which  */
   2127       /* is the total digits, including exponent), or the requested  */
   2128       /* precision, if larger, + 4; 6 is used for the exponent  */
   2129       /* maximum length, and this is also used when it is shorter  */
   2130       /* than the requested digits as it greatly reduces the >0.5 ulp  */
   2131       /* cases at little cost (because Ln doubles digits each  */
   2132       /* iteration so a few extra digits rarely causes an extra  */
   2133       /* iteration)  */
   2134       aset.digits=MAXI(lhs->digits, set->digits)+6+4;
   2135       } /* non-integer rhs  */
   2136 
   2137      else { /* rhs is in-range integer  */
   2138       if (n==0) {                       /* x**0 = 1  */
   2139         /* (0**0 was handled above)  */
   2140         uprv_decNumberZero(res);             /* result=1  */
   2141         *res->lsu=1;                    /* ..  */
   2142         break;}
   2143       /* rhs is a non-zero integer  */
   2144       if (n<0) n=-n;                    /* use abs(n)  */
   2145 
   2146       aset=*set;                        /* clone the context  */
   2147       aset.round=DEC_ROUND_HALF_EVEN;   /* internally use balanced  */
   2148       /* calculate the working DIGITS  */
   2149       aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
   2150       #if DECSUBSET
   2151       if (!set->extended) aset.digits--;     /* use classic precision  */
   2152       #endif
   2153       /* it's an error if this is more than can be handled  */
   2154       if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
   2155       } /* integer path  */
   2156 
   2157     /* aset.digits is the count of digits for the accumulator needed  */
   2158     /* if accumulator is too long for local storage, then allocate  */
   2159     needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
   2160     /* [needbytes also used below if 1/lhs needed]  */
   2161     if (needbytes>sizeof(dacbuff)) {
   2162       allocdac=(decNumber *)malloc(needbytes);
   2163       if (allocdac==NULL) {   /* hopeless -- abandon  */
   2164         status|=DEC_Insufficient_storage;
   2165         break;}
   2166       dac=allocdac;           /* use the allocated space  */
   2167       }
   2168     /* here, aset is set up and accumulator is ready for use  */
   2169 
   2170     if (!useint) {                           /* non-integral rhs  */
   2171       /* x ** y; special-case x=1 here as it will otherwise always  */
   2172       /* reduce to integer 1; decLnOp has a fastpath which detects  */
   2173       /* the case of x=1  */
   2174       decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs)  */
   2175       /* [no error possible, as lhs 0 already handled]  */
   2176       if (ISZERO(dac)) {                     /* x==1, 1.0, etc.  */
   2177         /* need to return fully-padded 1.0000 etc., but rhsint->1  */
   2178         *dac->lsu=1;                         /* was 0, make int 1  */
   2179         if (!rhsint) {                       /* add padding  */
   2180           Int shift=set->digits-1;
   2181           dac->digits=decShiftToMost(dac->lsu, 1, shift);
   2182           dac->exponent=-shift;              /* make 1.0000...  */
   2183           status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact  */
   2184           }
   2185         }
   2186        else {
   2187         decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs  */
   2188         decExpOp(dac, dac, &aset, &status);            /* dac=exp(dac)  */
   2189         }
   2190       /* and drop through for final rounding  */
   2191       } /* non-integer rhs  */
   2192 
   2193      else {                             /* carry on with integer  */
   2194       uprv_decNumberZero(dac);               /* acc=1  */
   2195       *dac->lsu=1;                      /* ..  */
   2196 
   2197       /* if a negative power the constant 1 is needed, and if not subset  */
   2198       /* invert the lhs now rather than inverting the result later  */
   2199       if (decNumberIsNegative(rhs)) {   /* was a **-n [hence digits>0]  */
   2200         decNumber *inv=invbuff;         /* asssume use fixed buffer  */
   2201         uprv_decNumberCopy(&dnOne, dac);     /* dnOne=1;  [needed now or later]  */
   2202         #if DECSUBSET
   2203         if (set->extended) {            /* need to calculate 1/lhs  */
   2204         #endif
   2205           /* divide lhs into 1, putting result in dac [dac=1/dac]  */
   2206           decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
   2207           /* now locate or allocate space for the inverted lhs  */
   2208           if (needbytes>sizeof(invbuff)) {
   2209             allocinv=(decNumber *)malloc(needbytes);
   2210             if (allocinv==NULL) {       /* hopeless -- abandon  */
   2211               status|=DEC_Insufficient_storage;
   2212               break;}
   2213             inv=allocinv;               /* use the allocated space  */
   2214             }
   2215           /* [inv now points to big-enough buffer or allocated storage]  */
   2216           uprv_decNumberCopy(inv, dac);      /* copy the 1/lhs  */
   2217           uprv_decNumberCopy(dac, &dnOne);   /* restore acc=1  */
   2218           lhs=inv;                      /* .. and go forward with new lhs  */
   2219         #if DECSUBSET
   2220           }
   2221         #endif
   2222         }
   2223 
   2224       /* Raise-to-the-power loop...  */
   2225       seenbit=0;                   /* set once a 1-bit is encountered  */
   2226       for (i=1;;i++){              /* for each bit [top bit ignored]  */
   2227         /* abandon if had overflow or terminal underflow  */
   2228         if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting?  */
   2229           if (status&DEC_Overflow || ISZERO(dac)) break;
   2230           }
   2231         /* [the following two lines revealed an optimizer bug in a C++  */
   2232         /* compiler, with symptom: 5**3 -> 25, when n=n+n was used]  */
   2233         n=n<<1;                    /* move next bit to testable position  */
   2234         if (n<0) {                 /* top bit is set  */
   2235           seenbit=1;               /* OK, significant bit seen  */
   2236           decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x  */
   2237           }
   2238         if (i==31) break;          /* that was the last bit  */
   2239         if (!seenbit) continue;    /* no need to square 1  */
   2240         decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square]  */
   2241         } /*i*/ /* 32 bits  */
   2242 
   2243       /* complete internal overflow or underflow processing  */
   2244       if (status & (DEC_Overflow|DEC_Underflow)) {
   2245         #if DECSUBSET
   2246         /* If subset, and power was negative, reverse the kind of -erflow  */
   2247         /* [1/x not yet done]  */
   2248         if (!set->extended && decNumberIsNegative(rhs)) {
   2249           if (status & DEC_Overflow)
   2250             status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
   2251            else { /* trickier -- Underflow may or may not be set  */
   2252             status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both]  */
   2253             status|=DEC_Overflow;
   2254             }
   2255           }
   2256         #endif
   2257         dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign  */
   2258         /* round subnormals [to set.digits rather than aset.digits]  */
   2259         /* or set overflow result similarly as required  */
   2260         decFinalize(dac, set, &residue, &status);
   2261         uprv_decNumberCopy(res, dac);   /* copy to result (is now OK length)  */
   2262         break;
   2263         }
   2264 
   2265       #if DECSUBSET
   2266       if (!set->extended &&                  /* subset math  */
   2267           decNumberIsNegative(rhs)) {        /* was a **-n [hence digits>0]  */
   2268         /* so divide result into 1 [dac=1/dac]  */
   2269         decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
   2270         }
   2271       #endif
   2272       } /* rhs integer path  */
   2273 
   2274     /* reduce result to the requested length and copy to result  */
   2275     decCopyFit(res, dac, set, &residue, &status);
   2276     decFinish(res, set, &residue, &status);  /* final cleanup  */
   2277     #if DECSUBSET
   2278     if (!set->extended) decTrim(res, set, 0, 1, &dropped); /* trailing zeros  */
   2279     #endif
   2280     } while(0);                         /* end protected  */
   2281 
   2282   if (allocdac!=NULL) free(allocdac);   /* drop any storage used  */
   2283   if (allocinv!=NULL) free(allocinv);   /* ..  */
   2284   #if DECSUBSET
   2285   if (alloclhs!=NULL) free(alloclhs);   /* ..  */
   2286   if (allocrhs!=NULL) free(allocrhs);   /* ..  */
   2287   #endif
   2288   if (status!=0) decStatus(res, status, set);
   2289   #if DECCHECK
   2290   decCheckInexact(res, set);
   2291   #endif
   2292   return res;
   2293   } /* decNumberPower  */
   2294 
   2295 /* ------------------------------------------------------------------ */
   2296 /* decNumberQuantize -- force exponent to requested value             */
   2297 /*                                                                    */
   2298 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2299 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2300 /*   of C has exponent of B.  The numerical value of C will equal A,  */
   2301 /*   except for the effects of any rounding that occurred.            */
   2302 /*                                                                    */
   2303 /*   res is C, the result.  C may be A or B                           */
   2304 /*   lhs is A, the number to adjust                                   */
   2305 /*   rhs is B, the number with exponent to match                      */
   2306 /*   set is the context                                               */
   2307 /*                                                                    */
   2308 /* C must have space for set->digits digits.                          */
   2309 /*                                                                    */
   2310 /* Unless there is an error or the result is infinite, the exponent   */
   2311 /* after the operation is guaranteed to be equal to that of B.        */
   2312 /* ------------------------------------------------------------------ */
   2313 U_CAPI decNumber * U_EXPORT2 uprv_decNumberQuantize(decNumber *res, const decNumber *lhs,
   2314                               const decNumber *rhs, decContext *set) {
   2315   uInt status=0;                        /* accumulator  */
   2316   decQuantizeOp(res, lhs, rhs, set, 1, &status);
   2317   if (status!=0) decStatus(res, status, set);
   2318   return res;
   2319   } /* decNumberQuantize  */
   2320 
   2321 /* ------------------------------------------------------------------ */
   2322 /* decNumberReduce -- remove trailing zeros                           */
   2323 /*                                                                    */
   2324 /*   This computes C = 0 + A, and normalizes the result               */
   2325 /*                                                                    */
   2326 /*   res is C, the result.  C may be A                                */
   2327 /*   rhs is A                                                         */
   2328 /*   set is the context                                               */
   2329 /*                                                                    */
   2330 /* C must have space for set->digits digits.                          */
   2331 /* ------------------------------------------------------------------ */
   2332 /* Previously known as Normalize  */
   2333 U_CAPI decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *res, const decNumber *rhs,
   2334                                decContext *set) {
   2335   return uprv_decNumberReduce(res, rhs, set);
   2336   } /* decNumberNormalize  */
   2337 
   2338 U_CAPI decNumber * U_EXPORT2 uprv_decNumberReduce(decNumber *res, const decNumber *rhs,
   2339                             decContext *set) {
   2340   #if DECSUBSET
   2341   decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated  */
   2342   #endif
   2343   uInt status=0;                   /* as usual  */
   2344   Int  residue=0;                  /* as usual  */
   2345   Int  dropped;                    /* work  */
   2346 
   2347   #if DECCHECK
   2348   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2349   #endif
   2350 
   2351   do {                             /* protect allocated storage  */
   2352     #if DECSUBSET
   2353     if (!set->extended) {
   2354       /* reduce operand and set lostDigits status, as needed  */
   2355       if (rhs->digits>set->digits) {
   2356         allocrhs=decRoundOperand(rhs, set, &status);
   2357         if (allocrhs==NULL) break;
   2358         rhs=allocrhs;
   2359         }
   2360       }
   2361     #endif
   2362     /* [following code does not require input rounding]  */
   2363 
   2364     /* Infinities copy through; NaNs need usual treatment  */
   2365     if (decNumberIsNaN(rhs)) {
   2366       decNaNs(res, rhs, NULL, set, &status);
   2367       break;
   2368       }
   2369 
   2370     /* reduce result to the requested length and copy to result  */
   2371     decCopyFit(res, rhs, set, &residue, &status); /* copy & round  */
   2372     decFinish(res, set, &residue, &status);       /* cleanup/set flags  */
   2373     decTrim(res, set, 1, 0, &dropped);            /* normalize in place  */
   2374                                                   /* [may clamp]  */
   2375     } while(0);                              /* end protected  */
   2376 
   2377   #if DECSUBSET
   2378   if (allocrhs !=NULL) free(allocrhs);       /* ..  */
   2379   #endif
   2380   if (status!=0) decStatus(res, status, set);/* then report status  */
   2381   return res;
   2382   } /* decNumberReduce  */
   2383 
   2384 /* ------------------------------------------------------------------ */
   2385 /* decNumberRescale -- force exponent to requested value              */
   2386 /*                                                                    */
   2387 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   2388 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   2389 /*   of C has the value B.  The numerical value of C will equal A,    */
   2390 /*   except for the effects of any rounding that occurred.            */
   2391 /*                                                                    */
   2392 /*   res is C, the result.  C may be A or B                           */
   2393 /*   lhs is A, the number to adjust                                   */
   2394 /*   rhs is B, the requested exponent                                 */
   2395 /*   set is the context                                               */
   2396 /*                                                                    */
   2397 /* C must have space for set->digits digits.                          */
   2398 /*                                                                    */
   2399 /* Unless there is an error or the result is infinite, the exponent   */
   2400 /* after the operation is guaranteed to be equal to B.                */
   2401 /* ------------------------------------------------------------------ */
   2402 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRescale(decNumber *res, const decNumber *lhs,
   2403                              const decNumber *rhs, decContext *set) {
   2404   uInt status=0;                        /* accumulator  */
   2405   decQuantizeOp(res, lhs, rhs, set, 0, &status);
   2406   if (status!=0) decStatus(res, status, set);
   2407   return res;
   2408   } /* decNumberRescale  */
   2409 
   2410 /* ------------------------------------------------------------------ */
   2411 /* decNumberRemainder -- divide and return remainder                  */
   2412 /*                                                                    */
   2413 /*   This computes C = A % B                                          */
   2414 /*                                                                    */
   2415 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
   2416 /*   lhs is A                                                         */
   2417 /*   rhs is B                                                         */
   2418 /*   set is the context                                               */
   2419 /*                                                                    */
   2420 /* C must have space for set->digits digits.                          */
   2421 /* ------------------------------------------------------------------ */
   2422 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainder(decNumber *res, const decNumber *lhs,
   2423                                const decNumber *rhs, decContext *set) {
   2424   uInt status=0;                        /* accumulator  */
   2425   decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
   2426   if (status!=0) decStatus(res, status, set);
   2427   #if DECCHECK
   2428   decCheckInexact(res, set);
   2429   #endif
   2430   return res;
   2431   } /* decNumberRemainder  */
   2432 
   2433 /* ------------------------------------------------------------------ */
   2434 /* decNumberRemainderNear -- divide and return remainder from nearest */
   2435 /*                                                                    */
   2436 /*   This computes C = A % B, where % is the IEEE remainder operator  */
   2437 /*                                                                    */
   2438 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)         */
   2439 /*   lhs is A                                                         */
   2440 /*   rhs is B                                                         */
   2441 /*   set is the context                                               */
   2442 /*                                                                    */
   2443 /* C must have space for set->digits digits.                          */
   2444 /* ------------------------------------------------------------------ */
   2445 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRemainderNear(decNumber *res, const decNumber *lhs,
   2446                                    const decNumber *rhs, decContext *set) {
   2447   uInt status=0;                        /* accumulator  */
   2448   decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
   2449   if (status!=0) decStatus(res, status, set);
   2450   #if DECCHECK
   2451   decCheckInexact(res, set);
   2452   #endif
   2453   return res;
   2454   } /* decNumberRemainderNear  */
   2455 
   2456 /* ------------------------------------------------------------------ */
   2457 /* decNumberRotate -- rotate the coefficient of a Number left/right   */
   2458 /*                                                                    */
   2459 /*   This computes C = A rot B  (in base ten and rotating set->digits */
   2460 /*   digits).                                                         */
   2461 /*                                                                    */
   2462 /*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)       */
   2463 /*   lhs is A                                                         */
   2464 /*   rhs is B, the number of digits to rotate (-ve to right)          */
   2465 /*   set is the context                                               */
   2466 /*                                                                    */
   2467 /* The digits of the coefficient of A are rotated to the left (if B   */
   2468 /* is positive) or to the right (if B is negative) without adjusting  */
   2469 /* the exponent or the sign of A.  If lhs->digits is less than        */
   2470 /* set->digits the coefficient is padded with zeros on the left       */
   2471 /* before the rotate.  Any leading zeros in the result are removed    */
   2472 /* as usual.                                                          */
   2473 /*                                                                    */
   2474 /* B must be an integer (q=0) and in the range -set->digits through   */
   2475 /* +set->digits.                                                      */
   2476 /* C must have space for set->digits digits.                          */
   2477 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2478 /* B must be valid).  No status is set unless B is invalid or an      */
   2479 /* operand is an sNaN.                                                */
   2480 /* ------------------------------------------------------------------ */
   2481 U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumber *lhs,
   2482                            const decNumber *rhs, decContext *set) {
   2483   uInt status=0;              /* accumulator  */
   2484   Int  rotate;                /* rhs as an Int  */
   2485 
   2486   #if DECCHECK
   2487   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2488   #endif
   2489 
   2490   /* NaNs propagate as normal  */
   2491   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2492     decNaNs(res, lhs, rhs, set, &status);
   2493    /* rhs must be an integer  */
   2494    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2495     status=DEC_Invalid_operation;
   2496    else { /* both numeric, rhs is an integer  */
   2497     rotate=decGetInt(rhs);                   /* [cannot fail]  */
   2498     if (rotate==BADINT                       /* something bad ..  */
   2499      || rotate==BIGODD || rotate==BIGEVEN    /* .. very big ..  */
   2500      || abs(rotate)>set->digits)             /* .. or out of range  */
   2501       status=DEC_Invalid_operation;
   2502      else {                                  /* rhs is OK  */
   2503       uprv_decNumberCopy(res, lhs);
   2504       /* convert -ve rotate to equivalent positive rotation  */
   2505       if (rotate<0) rotate=set->digits+rotate;
   2506       if (rotate!=0 && rotate!=set->digits   /* zero or full rotation  */
   2507        && !decNumberIsInfinite(res)) {       /* lhs was infinite  */
   2508         /* left-rotate to do; 0 < rotate < set->digits  */
   2509         uInt units, shift;                   /* work  */
   2510         uInt msudigits;                      /* digits in result msu  */
   2511         Unit *msu=res->lsu+D2U(res->digits)-1;    /* current msu  */
   2512         Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu  */
   2513         for (msu++; msu<=msumax; msu++) *msu=0;   /* ensure high units=0  */
   2514         res->digits=set->digits;                  /* now full-length  */
   2515         msudigits=MSUDIGITS(res->digits);         /* actual digits in msu  */
   2516 
   2517         /* rotation here is done in-place, in three steps  */
   2518         /* 1. shift all to least up to one unit to unit-align final  */
   2519         /*    lsd [any digits shifted out are rotated to the left,  */
   2520         /*    abutted to the original msd (which may require split)]  */
   2521         /*  */
   2522         /*    [if there are no whole units left to rotate, the  */
   2523         /*    rotation is now complete]  */
   2524         /*  */
   2525         /* 2. shift to least, from below the split point only, so that  */
   2526         /*    the final msd is in the right place in its Unit [any  */
   2527         /*    digits shifted out will fit exactly in the current msu,  */
   2528         /*    left aligned, no split required]  */
   2529         /*  */
   2530         /* 3. rotate all the units by reversing left part, right  */
   2531         /*    part, and then whole  */
   2532         /*  */
   2533         /* example: rotate right 8 digits (2 units + 2), DECDPUN=3.  */
   2534         /*  */
   2535         /*   start: 00a bcd efg hij klm npq  */
   2536         /*  */
   2537         /*      1a  000 0ab cde fgh|ijk lmn [pq saved]  */
   2538         /*      1b  00p qab cde fgh|ijk lmn  */
   2539         /*  */
   2540         /*      2a  00p qab cde fgh|00i jkl [mn saved]  */
   2541         /*      2b  mnp qab cde fgh|00i jkl  */
   2542         /*  */
   2543         /*      3a  fgh cde qab mnp|00i jkl  */
   2544         /*      3b  fgh cde qab mnp|jkl 00i  */
   2545         /*      3c  00i jkl mnp qab cde fgh  */
   2546 
   2547         /* Step 1: amount to shift is the partial right-rotate count  */
   2548         rotate=set->digits-rotate;      /* make it right-rotate  */
   2549         units=rotate/DECDPUN;           /* whole units to rotate  */
   2550         shift=rotate%DECDPUN;           /* left-over digits count  */
   2551         if (shift>0) {                  /* not an exact number of units  */
   2552           uInt save=res->lsu[0]%powers[shift];    /* save low digit(s)  */
   2553           decShiftToLeast(res->lsu, D2U(res->digits), shift);
   2554           if (shift>msudigits) {        /* msumax-1 needs >0 digits  */
   2555             uInt rem=save%powers[shift-msudigits];/* split save  */
   2556             *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert  */
   2557             *(msumax-1)=*(msumax-1)
   2558                        +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* ..  */
   2559             }
   2560            else { /* all fits in msumax  */
   2561             *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1]  */
   2562             }
   2563           } /* digits shift needed  */
   2564 
   2565         /* If whole units to rotate...  */
   2566         if (units>0) {                  /* some to do  */
   2567           /* Step 2: the units to touch are the whole ones in rotate,  */
   2568           /*   if any, and the shift is DECDPUN-msudigits (which may be  */
   2569           /*   0, again)  */
   2570           shift=DECDPUN-msudigits;
   2571           if (shift>0) {                /* not an exact number of units  */
   2572             uInt save=res->lsu[0]%powers[shift];  /* save low digit(s)  */
   2573             decShiftToLeast(res->lsu, units, shift);
   2574             *msumax=*msumax+(Unit)(save*powers[msudigits]);
   2575             } /* partial shift needed  */
   2576 
   2577           /* Step 3: rotate the units array using triple reverse  */
   2578           /* (reversing is easy and fast)  */
   2579           decReverse(res->lsu+units, msumax);     /* left part  */
   2580           decReverse(res->lsu, res->lsu+units-1); /* right part  */
   2581           decReverse(res->lsu, msumax);           /* whole  */
   2582           } /* whole units to rotate  */
   2583         /* the rotation may have left an undetermined number of zeros  */
   2584         /* on the left, so true length needs to be calculated  */
   2585         res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
   2586         } /* rotate needed  */
   2587       } /* rhs OK  */
   2588     } /* numerics  */
   2589   if (status!=0) decStatus(res, status, set);
   2590   return res;
   2591   } /* decNumberRotate  */
   2592 
   2593 /* ------------------------------------------------------------------ */
   2594 /* decNumberSameQuantum -- test for equal exponents                   */
   2595 /*                                                                    */
   2596 /*   res is the result number, which will contain either 0 or 1       */
   2597 /*   lhs is a number to test                                          */
   2598 /*   rhs is the second (usually a pattern)                            */
   2599 /*                                                                    */
   2600 /* No errors are possible and no context is needed.                   */
   2601 /* ------------------------------------------------------------------ */
   2602 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSameQuantum(decNumber *res, const decNumber *lhs,
   2603                                  const decNumber *rhs) {
   2604   Unit ret=0;                      /* return value  */
   2605 
   2606   #if DECCHECK
   2607   if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
   2608   #endif
   2609 
   2610   if (SPECIALARGS) {
   2611     if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
   2612      else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
   2613      /* [anything else with a special gives 0]  */
   2614     }
   2615    else if (lhs->exponent==rhs->exponent) ret=1;
   2616 
   2617   uprv_decNumberZero(res);              /* OK to overwrite an operand now  */
   2618   *res->lsu=ret;
   2619   return res;
   2620   } /* decNumberSameQuantum  */
   2621 
   2622 /* ------------------------------------------------------------------ */
   2623 /* decNumberScaleB -- multiply by a power of 10                       */
   2624 /*                                                                    */
   2625 /* This computes C = A x 10**B where B is an integer (q=0) with       */
   2626 /* maximum magnitude 2*(emax+digits)                                  */
   2627 /*                                                                    */
   2628 /*   res is C, the result.  C may be A or B                           */
   2629 /*   lhs is A, the number to adjust                                   */
   2630 /*   rhs is B, the requested power of ten to use                      */
   2631 /*   set is the context                                               */
   2632 /*                                                                    */
   2633 /* C must have space for set->digits digits.                          */
   2634 /*                                                                    */
   2635 /* The result may underflow or overflow.                              */
   2636 /* ------------------------------------------------------------------ */
   2637 U_CAPI decNumber * U_EXPORT2 uprv_decNumberScaleB(decNumber *res, const decNumber *lhs,
   2638                             const decNumber *rhs, decContext *set) {
   2639   Int  reqexp;                /* requested exponent change [B]  */
   2640   uInt status=0;              /* accumulator  */
   2641   Int  residue;               /* work  */
   2642 
   2643   #if DECCHECK
   2644   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2645   #endif
   2646 
   2647   /* Handle special values except lhs infinite  */
   2648   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2649     decNaNs(res, lhs, rhs, set, &status);
   2650     /* rhs must be an integer  */
   2651    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2652     status=DEC_Invalid_operation;
   2653    else {
   2654     /* lhs is a number; rhs is a finite with q==0  */
   2655     reqexp=decGetInt(rhs);                   /* [cannot fail]  */
   2656     if (reqexp==BADINT                       /* something bad ..  */
   2657      || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big ..  */
   2658      || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range  */
   2659       status=DEC_Invalid_operation;
   2660      else {                                  /* rhs is OK  */
   2661       uprv_decNumberCopy(res, lhs);               /* all done if infinite lhs  */
   2662       if (!decNumberIsInfinite(res)) {       /* prepare to scale  */
   2663         res->exponent+=reqexp;               /* adjust the exponent  */
   2664         residue=0;
   2665         decFinalize(res, set, &residue, &status); /* .. and check  */
   2666         } /* finite LHS  */
   2667       } /* rhs OK  */
   2668     } /* rhs finite  */
   2669   if (status!=0) decStatus(res, status, set);
   2670   return res;
   2671   } /* decNumberScaleB  */
   2672 
   2673 /* ------------------------------------------------------------------ */
   2674 /* decNumberShift -- shift the coefficient of a Number left or right  */
   2675 /*                                                                    */
   2676 /*   This computes C = A << B or C = A >> -B  (in base ten).          */
   2677 /*                                                                    */
   2678 /*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)        */
   2679 /*   lhs is A                                                         */
   2680 /*   rhs is B, the number of digits to shift (-ve to right)           */
   2681 /*   set is the context                                               */
   2682 /*                                                                    */
   2683 /* The digits of the coefficient of A are shifted to the left (if B   */
   2684 /* is positive) or to the right (if B is negative) without adjusting  */
   2685 /* the exponent or the sign of A.                                     */
   2686 /*                                                                    */
   2687 /* B must be an integer (q=0) and in the range -set->digits through   */
   2688 /* +set->digits.                                                      */
   2689 /* C must have space for set->digits digits.                          */
   2690 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
   2691 /* B must be valid).  No status is set unless B is invalid or an      */
   2692 /* operand is an sNaN.                                                */
   2693 /* ------------------------------------------------------------------ */
   2694 U_CAPI decNumber * U_EXPORT2 uprv_decNumberShift(decNumber *res, const decNumber *lhs,
   2695                            const decNumber *rhs, decContext *set) {
   2696   uInt status=0;              /* accumulator  */
   2697   Int  shift;                 /* rhs as an Int  */
   2698 
   2699   #if DECCHECK
   2700   if (decCheckOperands(res, lhs, rhs, set)) return res;
   2701   #endif
   2702 
   2703   /* NaNs propagate as normal  */
   2704   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
   2705     decNaNs(res, lhs, rhs, set, &status);
   2706    /* rhs must be an integer  */
   2707    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
   2708     status=DEC_Invalid_operation;
   2709    else { /* both numeric, rhs is an integer  */
   2710     shift=decGetInt(rhs);                    /* [cannot fail]  */
   2711     if (shift==BADINT                        /* something bad ..  */
   2712      || shift==BIGODD || shift==BIGEVEN      /* .. very big ..  */
   2713      || abs(shift)>set->digits)              /* .. or out of range  */
   2714       status=DEC_Invalid_operation;
   2715      else {                                  /* rhs is OK  */
   2716       uprv_decNumberCopy(res, lhs);
   2717       if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do  */
   2718         if (shift>0) {                       /* to left  */
   2719           if (shift==set->digits) {          /* removing all  */
   2720             *res->lsu=0;                     /* so place 0  */
   2721             res->digits=1;                   /* ..  */
   2722             }
   2723            else {                            /*  */
   2724             /* first remove leading digits if necessary  */
   2725             if (res->digits+shift>set->digits) {
   2726               decDecap(res, res->digits+shift-set->digits);
   2727               /* that updated res->digits; may have gone to 1 (for a  */
   2728               /* single digit or for zero  */
   2729               }
   2730             if (res->digits>1 || *res->lsu)  /* if non-zero..  */
   2731               res->digits=decShiftToMost(res->lsu, res->digits, shift);
   2732             } /* partial left  */
   2733           } /* left  */
   2734          else { /* to right  */
   2735           if (-shift>=res->digits) {         /* discarding all  */
   2736             *res->lsu=0;                     /* so place 0  */
   2737             res->digits=1;                   /* ..  */
   2738             }
   2739            else {
   2740             decShiftToLeast(res->lsu, D2U(res->digits), -shift);
   2741             res->digits-=(-shift);
   2742             }
   2743           } /* to right  */
   2744         } /* non-0 non-Inf shift  */
   2745       } /* rhs OK  */
   2746     } /* numerics  */
   2747   if (status!=0) decStatus(res, status, set);
   2748   return res;
   2749   } /* decNumberShift  */
   2750 
   2751 /* ------------------------------------------------------------------ */
   2752 /* decNumberSquareRoot -- square root operator                        */
   2753 /*                                                                    */
   2754 /*   This computes C = squareroot(A)                                  */
   2755 /*                                                                    */
   2756 /*   res is C, the result.  C may be A                                */
   2757 /*   rhs is A                                                         */
   2758 /*   set is the context; note that rounding mode has no effect        */
   2759 /*                                                                    */
   2760 /* C must have space for set->digits digits.                          */
   2761 /* ------------------------------------------------------------------ */
   2762 /* This uses the following varying-precision algorithm in:            */
   2763 /*                                                                    */
   2764 /*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
   2765 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
   2766 /*   pp229-237, ACM, September 1985.                                  */
   2767 /*                                                                    */
   2768 /* The square-root is calculated using Newton's method, after which   */
   2769 /* a check is made to ensure the result is correctly rounded.         */
   2770 /*                                                                    */
   2771 /* % [Reformatted original Numerical Turing source code follows.]     */
   2772 /* function sqrt(x : real) : real                                     */
   2773 /* % sqrt(x) returns the properly rounded approximation to the square */
   2774 /* % root of x, in the precision of the calling environment, or it    */
   2775 /* % fails if x < 0.                                                  */
   2776 /* % t e hull and a abrham, august, 1984                              */
   2777 /* if x <= 0 then                                                     */
   2778 /*   if x < 0 then                                                    */
   2779 /*     assert false                                                   */
   2780 /*   else                                                             */
   2781 /*     result 0                                                       */
   2782 /*   end if                                                           */
   2783 /* end if                                                             */
   2784 /* var f := setexp(x, 0)  % fraction part of x   [0.1 <= x < 1]       */
   2785 /* var e := getexp(x)     % exponent part of x                        */
   2786 /* var approx : real                                                  */
   2787 /* if e mod 2 = 0  then                                               */
   2788 /*   approx := .259 + .819 * f   % approx to root of f                */
   2789 /* else                                                               */
   2790 /*   f := f/l0                   % adjustments                        */
   2791 /*   e := e + 1                  %   for odd                          */
   2792 /*   approx := .0819 + 2.59 * f  %   exponent                         */
   2793 /* end if                                                             */
   2794 /*                                                                    */
   2795 /* var p:= 3                                                          */
   2796 /* const maxp := currentprecision + 2                                 */
   2797 /* loop                                                               */
   2798 /*   p := min(2*p - 2, maxp)     % p = 4,6,10, . . . , maxp           */
   2799 /*   precision p                                                      */
   2800 /*   approx := .5 * (approx + f/approx)                               */
   2801 /*   exit when p = maxp                                               */
   2802 /* end loop                                                           */
   2803 /*                                                                    */
   2804 /* % approx is now within 1 ulp of the properly rounded square root   */
   2805 /* % of f; to ensure proper rounding, compare squares of (approx -    */
   2806 /* % l/2 ulp) and (approx + l/2 ulp) with f.                          */
   2807 /* p := currentprecision                                              */
   2808 /* begin                                                              */
   2809 /*   precision p + 2                                                  */
   2810 /*   const approxsubhalf := approx - setexp(.5, -p)                   */
   2811 /*   if mulru(approxsubhalf, approxsubhalf) > f then                  */
   2812 /*     approx := approx - setexp(.l, -p + 1)                          */
   2813 /*   else                                                             */
   2814 /*     const approxaddhalf := approx + setexp(.5, -p)                 */
   2815 /*     if mulrd(approxaddhalf, approxaddhalf) < f then                */
   2816 /*       approx := approx + setexp(.l, -p + 1)                        */
   2817 /*     end if                                                         */
   2818 /*   end if                                                           */
   2819 /* end                                                                */
   2820 /* result setexp(approx, e div 2)  % fix exponent                     */
   2821 /* end sqrt                                                           */
   2822 /* ------------------------------------------------------------------ */
   2823 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   2824 #pragma GCC diagnostic push
   2825 #pragma GCC diagnostic ignored "-Warray-bounds"
   2826 #endif
   2827 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSquareRoot(decNumber *res, const decNumber *rhs,
   2828                                 decContext *set) {
   2829   decContext workset, approxset;   /* work contexts  */
   2830   decNumber dzero;                 /* used for constant zero  */
   2831   Int  maxp;                       /* largest working precision  */
   2832   Int  workp;                      /* working precision  */
   2833   Int  residue=0;                  /* rounding residue  */
   2834   uInt status=0, ignore=0;         /* status accumulators  */
   2835   uInt rstatus;                    /* ..  */
   2836   Int  exp;                        /* working exponent  */
   2837   Int  ideal;                      /* ideal (preferred) exponent  */
   2838   Int  needbytes;                  /* work  */
   2839   Int  dropped;                    /* ..  */
   2840 
   2841   #if DECSUBSET
   2842   decNumber *allocrhs=NULL;        /* non-NULL if rounded rhs allocated  */
   2843   #endif
   2844   /* buffer for f [needs +1 in case DECBUFFER 0]  */
   2845   decNumber buff[D2N(DECBUFFER+1)];
   2846   /* buffer for a [needs +2 to match likely maxp]  */
   2847   decNumber bufa[D2N(DECBUFFER+2)];
   2848   /* buffer for temporary, b [must be same size as a]  */
   2849   decNumber bufb[D2N(DECBUFFER+2)];
   2850   decNumber *allocbuff=NULL;       /* -> allocated buff, iff allocated  */
   2851   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
   2852   decNumber *allocbufb=NULL;       /* -> allocated bufb, iff allocated  */
   2853   decNumber *f=buff;               /* reduced fraction  */
   2854   decNumber *a=bufa;               /* approximation to result  */
   2855   decNumber *b=bufb;               /* intermediate result  */
   2856   /* buffer for temporary variable, up to 3 digits  */
   2857   decNumber buft[D2N(3)];
   2858   decNumber *t=buft;               /* up-to-3-digit constant or work  */
   2859 
   2860   #if DECCHECK
   2861   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   2862   #endif
   2863 
   2864   do {                             /* protect allocated storage  */
   2865     #if DECSUBSET
   2866     if (!set->extended) {
   2867       /* reduce operand and set lostDigits status, as needed  */
   2868       if (rhs->digits>set->digits) {
   2869         allocrhs=decRoundOperand(rhs, set, &status);
   2870         if (allocrhs==NULL) break;
   2871         /* [Note: 'f' allocation below could reuse this buffer if  */
   2872         /* used, but as this is rare they are kept separate for clarity.]  */
   2873         rhs=allocrhs;
   2874         }
   2875       }
   2876     #endif
   2877     /* [following code does not require input rounding]  */
   2878 
   2879     /* handle infinities and NaNs  */
   2880     if (SPECIALARG) {
   2881       if (decNumberIsInfinite(rhs)) {         /* an infinity  */
   2882         if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
   2883          else uprv_decNumberCopy(res, rhs);        /* +Infinity  */
   2884         }
   2885        else decNaNs(res, rhs, NULL, set, &status); /* a NaN  */
   2886       break;
   2887       }
   2888 
   2889     /* calculate the ideal (preferred) exponent [floor(exp/2)]  */
   2890     /* [It would be nicer to write: ideal=rhs->exponent>>1, but this  */
   2891     /* generates a compiler warning.  Generated code is the same.]  */
   2892     ideal=(rhs->exponent&~1)/2;         /* target  */
   2893 
   2894     /* handle zeros  */
   2895     if (ISZERO(rhs)) {
   2896       uprv_decNumberCopy(res, rhs);          /* could be 0 or -0  */
   2897       res->exponent=ideal;              /* use the ideal [safe]  */
   2898       /* use decFinish to clamp any out-of-range exponent, etc.  */
   2899       decFinish(res, set, &residue, &status);
   2900       break;
   2901       }
   2902 
   2903     /* any other -x is an oops  */
   2904     if (decNumberIsNegative(rhs)) {
   2905       status|=DEC_Invalid_operation;
   2906       break;
   2907       }
   2908 
   2909     /* space is needed for three working variables  */
   2910     /*   f -- the same precision as the RHS, reduced to 0.01->0.99...  */
   2911     /*   a -- Hull's approximation -- precision, when assigned, is  */
   2912     /*        currentprecision+1 or the input argument precision,  */
   2913     /*        whichever is larger (+2 for use as temporary)  */
   2914     /*   b -- intermediate temporary result (same size as a)  */
   2915     /* if any is too long for local storage, then allocate  */
   2916     workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision  */
   2917     workp=MAXI(workp, 7);                    /* at least 7 for low cases  */
   2918     maxp=workp+2;                            /* largest working precision  */
   2919 
   2920     needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   2921     if (needbytes>(Int)sizeof(buff)) {
   2922       allocbuff=(decNumber *)malloc(needbytes);
   2923       if (allocbuff==NULL) {  /* hopeless -- abandon  */
   2924         status|=DEC_Insufficient_storage;
   2925         break;}
   2926       f=allocbuff;            /* use the allocated space  */
   2927       }
   2928     /* a and b both need to be able to hold a maxp-length number  */
   2929     needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
   2930     if (needbytes>(Int)sizeof(bufa)) {            /* [same applies to b]  */
   2931       allocbufa=(decNumber *)malloc(needbytes);
   2932       allocbufb=(decNumber *)malloc(needbytes);
   2933       if (allocbufa==NULL || allocbufb==NULL) {   /* hopeless  */
   2934         status|=DEC_Insufficient_storage;
   2935         break;}
   2936       a=allocbufa;            /* use the allocated spaces  */
   2937       b=allocbufb;            /* ..  */
   2938       }
   2939 
   2940     /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1  */
   2941     uprv_decNumberCopy(f, rhs);
   2942     exp=f->exponent+f->digits;               /* adjusted to Hull rules  */
   2943     f->exponent=-(f->digits);                /* to range  */
   2944 
   2945     /* set up working context  */
   2946     uprv_decContextDefault(&workset, DEC_INIT_DECIMAL64);
   2947     workset.emax=DEC_MAX_EMAX;
   2948     workset.emin=DEC_MIN_EMIN;
   2949 
   2950     /* [Until further notice, no error is possible and status bits  */
   2951     /* (Rounded, etc.) should be ignored, not accumulated.]  */
   2952 
   2953     /* Calculate initial approximation, and allow for odd exponent  */
   2954     workset.digits=workp;                    /* p for initial calculation  */
   2955     t->bits=0; t->digits=3;
   2956     a->bits=0; a->digits=3;
   2957     if ((exp & 1)==0) {                      /* even exponent  */
   2958       /* Set t=0.259, a=0.819  */
   2959       t->exponent=-3;
   2960       a->exponent=-3;
   2961       #if DECDPUN>=3
   2962         t->lsu[0]=259;
   2963         a->lsu[0]=819;
   2964       #elif DECDPUN==2
   2965         t->lsu[0]=59; t->lsu[1]=2;
   2966         a->lsu[0]=19; a->lsu[1]=8;
   2967       #else
   2968         t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
   2969         a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
   2970       #endif
   2971       }
   2972      else {                                  /* odd exponent  */
   2973       /* Set t=0.0819, a=2.59  */
   2974       f->exponent--;                         /* f=f/10  */
   2975       exp++;                                 /* e=e+1  */
   2976       t->exponent=-4;
   2977       a->exponent=-2;
   2978       #if DECDPUN>=3
   2979         t->lsu[0]=819;
   2980         a->lsu[0]=259;
   2981       #elif DECDPUN==2
   2982         t->lsu[0]=19; t->lsu[1]=8;
   2983         a->lsu[0]=59; a->lsu[1]=2;
   2984       #else
   2985         t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
   2986         a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
   2987       #endif
   2988       }
   2989 
   2990     decMultiplyOp(a, a, f, &workset, &ignore);    /* a=a*f  */
   2991     decAddOp(a, a, t, &workset, 0, &ignore);      /* ..+t  */
   2992     /* [a is now the initial approximation for sqrt(f), calculated with  */
   2993     /* currentprecision, which is also a's precision.]  */
   2994 
   2995     /* the main calculation loop  */
   2996     uprv_decNumberZero(&dzero);                   /* make 0  */
   2997     uprv_decNumberZero(t);                        /* set t = 0.5  */
   2998     t->lsu[0]=5;                             /* ..  */
   2999     t->exponent=-1;                          /* ..  */
   3000     workset.digits=3;                        /* initial p  */
   3001     for (; workset.digits<maxp;) {
   3002       /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp]  */
   3003       workset.digits=MINI(workset.digits*2-2, maxp);
   3004       /* a = 0.5 * (a + f/a)  */
   3005       /* [calculated at p then rounded to currentprecision]  */
   3006       decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a  */
   3007       decAddOp(b, b, a, &workset, 0, &ignore);         /* b=b+a  */
   3008       decMultiplyOp(a, b, t, &workset, &ignore);       /* a=b*0.5  */
   3009       } /* loop  */
   3010 
   3011     /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits  */
   3012     /* now reduce to length, etc.; this needs to be done with a  */
   3013     /* having the correct exponent so as to handle subnormals  */
   3014     /* correctly  */
   3015     approxset=*set;                          /* get emin, emax, etc.  */
   3016     approxset.round=DEC_ROUND_HALF_EVEN;
   3017     a->exponent+=exp/2;                      /* set correct exponent  */
   3018     rstatus=0;                               /* clear status  */
   3019     residue=0;                               /* .. and accumulator  */
   3020     decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed)  */
   3021     decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize  */
   3022 
   3023     /* Overflow was possible if the input exponent was out-of-range,  */
   3024     /* in which case quit  */
   3025     if (rstatus&DEC_Overflow) {
   3026       status=rstatus;                        /* use the status as-is  */
   3027       uprv_decNumberCopy(res, a);                 /* copy to result  */
   3028       break;
   3029       }
   3030 
   3031     /* Preserve status except Inexact/Rounded  */
   3032     status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
   3033 
   3034     /* Carry out the Hull correction  */
   3035     a->exponent-=exp/2;                      /* back to 0.1->1  */
   3036 
   3037     /* a is now at final precision and within 1 ulp of the properly  */
   3038     /* rounded square root of f; to ensure proper rounding, compare  */
   3039     /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f.  */
   3040     /* Here workset.digits=maxp and t=0.5, and a->digits determines  */
   3041     /* the ulp  */
   3042     workset.digits--;                             /* maxp-1 is OK now  */
   3043     t->exponent=-a->digits-1;                     /* make 0.5 ulp  */
   3044     decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp  */
   3045     workset.round=DEC_ROUND_UP;
   3046     decMultiplyOp(b, b, b, &workset, &ignore);    /* b = mulru(b, b)  */
   3047     decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed  */
   3048     if (decNumberIsNegative(b)) {                 /* f < b [i.e., b > f]  */
   3049       /* this is the more common adjustment, though both are rare  */
   3050       t->exponent++;                              /* make 1.0 ulp  */
   3051       t->lsu[0]=1;                                /* ..  */
   3052       decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp  */
   3053       /* assign to approx [round to length]  */
   3054       approxset.emin-=exp/2;                      /* adjust to match a  */
   3055       approxset.emax-=exp/2;
   3056       decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3057       }
   3058      else {
   3059       decAddOp(b, a, t, &workset, 0, &ignore);    /* b = a + 0.5 ulp  */
   3060       workset.round=DEC_ROUND_DOWN;
   3061       decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b)  */
   3062       decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f  */
   3063       if (decNumberIsNegative(b)) {               /* b < f  */
   3064         t->exponent++;                            /* make 1.0 ulp  */
   3065         t->lsu[0]=1;                              /* ..  */
   3066         decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp  */
   3067         /* assign to approx [round to length]  */
   3068         approxset.emin-=exp/2;                    /* adjust to match a  */
   3069         approxset.emax-=exp/2;
   3070         decAddOp(a, &dzero, a, &approxset, 0, &ignore);
   3071         }
   3072       }
   3073     /* [no errors are possible in the above, and rounding/inexact during  */
   3074     /* estimation are irrelevant, so status was not accumulated]  */
   3075 
   3076     /* Here, 0.1 <= a < 1  (still), so adjust back  */
   3077     a->exponent+=exp/2;                      /* set correct exponent  */
   3078 
   3079     /* count droppable zeros [after any subnormal rounding] by  */
   3080     /* trimming a copy  */
   3081     uprv_decNumberCopy(b, a);
   3082     decTrim(b, set, 1, 1, &dropped);         /* [drops trailing zeros]  */
   3083 
   3084     /* Set Inexact and Rounded.  The answer can only be exact if  */
   3085     /* it is short enough so that squaring it could fit in workp  */
   3086     /* digits, so this is the only (relatively rare) condition that  */
   3087     /* a careful check is needed  */
   3088     if (b->digits*2-1 > workp) {             /* cannot fit  */
   3089       status|=DEC_Inexact|DEC_Rounded;
   3090       }
   3091      else {                                  /* could be exact/unrounded  */
   3092       uInt mstatus=0;                        /* local status  */
   3093       decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply  */
   3094       if (mstatus&DEC_Overflow) {            /* result just won't fit  */
   3095         status|=DEC_Inexact|DEC_Rounded;
   3096         }
   3097        else {                                /* plausible  */
   3098         decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs  */
   3099         if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal  */
   3100          else {                              /* is Exact  */
   3101           /* here, dropped is the count of trailing zeros in 'a'  */
   3102           /* use closest exponent to ideal...  */
   3103           Int todrop=ideal-a->exponent;      /* most that can be dropped  */
   3104           if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s  */
   3105            else {                            /* unrounded  */
   3106             /* there are some to drop, but emax may not allow all  */
   3107             Int maxexp=set->emax-set->digits+1;
   3108             Int maxdrop=maxexp-a->exponent;
   3109             if (todrop>maxdrop && set->clamp) { /* apply clamping  */
   3110               todrop=maxdrop;
   3111               status|=DEC_Clamped;
   3112               }
   3113             if (dropped<todrop) {            /* clamp to those available  */
   3114               todrop=dropped;
   3115               status|=DEC_Clamped;
   3116               }
   3117             if (todrop>0) {                  /* have some to drop  */
   3118               decShiftToLeast(a->lsu, D2U(a->digits), todrop);
   3119               a->exponent+=todrop;           /* maintain numerical value  */
   3120               a->digits-=todrop;             /* new length  */
   3121               }
   3122             }
   3123           }
   3124         }
   3125       }
   3126 
   3127     /* double-check Underflow, as perhaps the result could not have  */
   3128     /* been subnormal (initial argument too big), or it is now Exact  */
   3129     if (status&DEC_Underflow) {
   3130       Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent  */
   3131       /* check if truly subnormal  */
   3132       #if DECEXTFLAG                         /* DEC_Subnormal too  */
   3133         if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
   3134       #else
   3135         if (ae>=set->emin*2) status&=~DEC_Underflow;
   3136       #endif
   3137       /* check if truly inexact  */
   3138       if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
   3139       }
   3140 
   3141     uprv_decNumberCopy(res, a);                   /* a is now the result  */
   3142     } while(0);                              /* end protected  */
   3143 
   3144   if (allocbuff!=NULL) free(allocbuff);      /* drop any storage used  */
   3145   if (allocbufa!=NULL) free(allocbufa);      /* ..  */
   3146   if (allocbufb!=NULL) free(allocbufb);      /* ..  */
   3147   #if DECSUBSET
   3148   if (allocrhs !=NULL) free(allocrhs);       /* ..  */
   3149   #endif
   3150   if (status!=0) decStatus(res, status, set);/* then report status  */
   3151   #if DECCHECK
   3152   decCheckInexact(res, set);
   3153   #endif
   3154   return res;
   3155   } /* decNumberSquareRoot  */
   3156 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   3157 #pragma GCC diagnostic pop
   3158 #endif
   3159 
   3160 /* ------------------------------------------------------------------ */
   3161 /* decNumberSubtract -- subtract two Numbers                          */
   3162 /*                                                                    */
   3163 /*   This computes C = A - B                                          */
   3164 /*                                                                    */
   3165 /*   res is C, the result.  C may be A and/or B (e.g., X=X-X)         */
   3166 /*   lhs is A                                                         */
   3167 /*   rhs is B                                                         */
   3168 /*   set is the context                                               */
   3169 /*                                                                    */
   3170 /* C must have space for set->digits digits.                          */
   3171 /* ------------------------------------------------------------------ */
   3172 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSubtract(decNumber *res, const decNumber *lhs,
   3173                               const decNumber *rhs, decContext *set) {
   3174   uInt status=0;                        /* accumulator  */
   3175 
   3176   decAddOp(res, lhs, rhs, set, DECNEG, &status);
   3177   if (status!=0) decStatus(res, status, set);
   3178   #if DECCHECK
   3179   decCheckInexact(res, set);
   3180   #endif
   3181   return res;
   3182   } /* decNumberSubtract  */
   3183 
   3184 /* ------------------------------------------------------------------ */
   3185 /* decNumberToIntegralExact -- round-to-integral-value with InExact   */
   3186 /* decNumberToIntegralValue -- round-to-integral-value                */
   3187 /*                                                                    */
   3188 /*   res is the result                                                */
   3189 /*   rhs is input number                                              */
   3190 /*   set is the context                                               */
   3191 /*                                                                    */
   3192 /* res must have space for any value of rhs.                          */
   3193 /*                                                                    */
   3194 /* This implements the IEEE special operators and therefore treats    */
   3195 /* special values as valid.  For finite numbers it returns            */
   3196 /* rescale(rhs, 0) if rhs->exponent is <0.                            */
   3197 /* Otherwise the result is rhs (so no error is possible, except for   */
   3198 /* sNaN).                                                             */
   3199 /*                                                                    */
   3200 /* The context is used for rounding mode and status after sNaN, but   */
   3201 /* the digits setting is ignored.  The Exact version will signal      */
   3202 /* Inexact if the result differs numerically from rhs; the other      */
   3203 /* never signals Inexact.                                             */
   3204 /* ------------------------------------------------------------------ */
   3205 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
   3206                                      decContext *set) {
   3207   decNumber dn;
   3208   decContext workset;              /* working context  */
   3209   uInt status=0;                   /* accumulator  */
   3210 
   3211   #if DECCHECK
   3212   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   3213   #endif
   3214 
   3215   /* handle infinities and NaNs  */
   3216   if (SPECIALARG) {
   3217     if (decNumberIsInfinite(rhs)) uprv_decNumberCopy(res, rhs); /* an Infinity  */
   3218      else decNaNs(res, rhs, NULL, set, &status); /* a NaN  */
   3219     }
   3220    else { /* finite  */
   3221     /* have a finite number; no error possible (res must be big enough)  */
   3222     if (rhs->exponent>=0) return uprv_decNumberCopy(res, rhs);
   3223     /* that was easy, but if negative exponent there is work to do...  */
   3224     workset=*set;                  /* clone rounding, etc.  */
   3225     workset.digits=rhs->digits;    /* no length rounding  */
   3226     workset.traps=0;               /* no traps  */
   3227     uprv_decNumberZero(&dn);            /* make a number with exponent 0  */
   3228     uprv_decNumberQuantize(res, rhs, &dn, &workset);
   3229     status|=workset.status;
   3230     }
   3231   if (status!=0) decStatus(res, status, set);
   3232   return res;
   3233   } /* decNumberToIntegralExact  */
   3234 
   3235 U_CAPI decNumber * U_EXPORT2 uprv_decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
   3236                                      decContext *set) {
   3237   decContext workset=*set;         /* working context  */
   3238   workset.traps=0;                 /* no traps  */
   3239   uprv_decNumberToIntegralExact(res, rhs, &workset);
   3240   /* this never affects set, except for sNaNs; NaN will have been set  */
   3241   /* or propagated already, so no need to call decStatus  */
   3242   set->status|=workset.status&DEC_Invalid_operation;
   3243   return res;
   3244   } /* decNumberToIntegralValue  */
   3245 
   3246 /* ------------------------------------------------------------------ */
   3247 /* decNumberXor -- XOR two Numbers, digitwise                         */
   3248 /*                                                                    */
   3249 /*   This computes C = A ^ B                                          */
   3250 /*                                                                    */
   3251 /*   res is C, the result.  C may be A and/or B (e.g., X=X^X)         */
   3252 /*   lhs is A                                                         */
   3253 /*   rhs is B                                                         */
   3254 /*   set is the context (used for result length and error report)     */
   3255 /*                                                                    */
   3256 /* C must have space for set->digits digits.                          */
   3257 /*                                                                    */
   3258 /* Logical function restrictions apply (see above); a NaN is          */
   3259 /* returned with Invalid_operation if a restriction is violated.      */
   3260 /* ------------------------------------------------------------------ */
   3261 U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber *lhs,
   3262                          const decNumber *rhs, decContext *set) {
   3263   const Unit *ua, *ub;                  /* -> operands  */
   3264   const Unit *msua, *msub;              /* -> operand msus  */
   3265   Unit  *uc, *msuc;                     /* -> result and its msu  */
   3266   Int   msudigs;                        /* digits in res msu  */
   3267   #if DECCHECK
   3268   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3269   #endif
   3270 
   3271   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
   3272    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
   3273     decStatus(res, DEC_Invalid_operation, set);
   3274     return res;
   3275     }
   3276   /* operands are valid  */
   3277   ua=lhs->lsu;                          /* bottom-up  */
   3278   ub=rhs->lsu;                          /* ..  */
   3279   uc=res->lsu;                          /* ..  */
   3280   msua=ua+D2U(lhs->digits)-1;           /* -> msu of lhs  */
   3281   msub=ub+D2U(rhs->digits)-1;           /* -> msu of rhs  */
   3282   msuc=uc+D2U(set->digits)-1;           /* -> msu of result  */
   3283   msudigs=MSUDIGITS(set->digits);       /* [faster than remainder]  */
   3284   for (; uc<=msuc; ua++, ub++, uc++) {  /* Unit loop  */
   3285     Unit a, b;                          /* extract units  */
   3286     if (ua>msua) a=0;
   3287      else a=*ua;
   3288     if (ub>msub) b=0;
   3289      else b=*ub;
   3290     *uc=0;                              /* can now write back  */
   3291     if (a|b) {                          /* maybe 1 bits to examine  */
   3292       Int i, j;
   3293       /* This loop could be unrolled and/or use BIN2BCD tables  */
   3294       for (i=0; i<DECDPUN; i++) {
   3295         if ((a^b)&1) *uc=*uc+(Unit)powers[i];     /* effect XOR  */
   3296         j=a%10;
   3297         a=a/10;
   3298         j|=b%10;
   3299         b=b/10;
   3300         if (j>1) {
   3301           decStatus(res, DEC_Invalid_operation, set);
   3302           return res;
   3303           }
   3304         if (uc==msuc && i==msudigs-1) break;      /* just did final digit  */
   3305         } /* each digit  */
   3306       } /* non-zero  */
   3307     } /* each unit  */
   3308   /* [here uc-1 is the msu of the result]  */
   3309   res->digits=decGetDigits(res->lsu, uc-res->lsu);
   3310   res->exponent=0;                      /* integer  */
   3311   res->bits=0;                          /* sign=0  */
   3312   return res;  /* [no status to set]  */
   3313   } /* decNumberXor  */
   3314 
   3315 
   3316 /* ================================================================== */
   3317 /* Utility routines                                                   */
   3318 /* ================================================================== */
   3319 
   3320 /* ------------------------------------------------------------------ */
   3321 /* decNumberClass -- return the decClass of a decNumber               */
   3322 /*   dn -- the decNumber to test                                      */
   3323 /*   set -- the context to use for Emin                               */
   3324 /*   returns the decClass enum                                        */
   3325 /* ------------------------------------------------------------------ */
   3326 enum decClass uprv_decNumberClass(const decNumber *dn, decContext *set) {
   3327   if (decNumberIsSpecial(dn)) {
   3328     if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
   3329     if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
   3330     /* must be an infinity  */
   3331     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
   3332     return DEC_CLASS_POS_INF;
   3333     }
   3334   /* is finite  */
   3335   if (uprv_decNumberIsNormal(dn, set)) { /* most common  */
   3336     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
   3337     return DEC_CLASS_POS_NORMAL;
   3338     }
   3339   /* is subnormal or zero  */
   3340   if (decNumberIsZero(dn)) {    /* most common  */
   3341     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
   3342     return DEC_CLASS_POS_ZERO;
   3343     }
   3344   if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
   3345   return DEC_CLASS_POS_SUBNORMAL;
   3346   } /* decNumberClass  */
   3347 
   3348 /* ------------------------------------------------------------------ */
   3349 /* decNumberClassToString -- convert decClass to a string             */
   3350 /*                                                                    */
   3351 /*  eclass is a valid decClass                                        */
   3352 /*  returns a constant string describing the class (max 13+1 chars)   */
   3353 /* ------------------------------------------------------------------ */
   3354 const char *uprv_decNumberClassToString(enum decClass eclass) {
   3355   if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
   3356   if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
   3357   if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
   3358   if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
   3359   if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
   3360   if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
   3361   if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
   3362   if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
   3363   if (eclass==DEC_CLASS_QNAN)          return DEC_ClassString_QN;
   3364   if (eclass==DEC_CLASS_SNAN)          return DEC_ClassString_SN;
   3365   return DEC_ClassString_UN;           /* Unknown  */
   3366   } /* decNumberClassToString  */
   3367 
   3368 /* ------------------------------------------------------------------ */
   3369 /* decNumberCopy -- copy a number                                     */
   3370 /*                                                                    */
   3371 /*   dest is the target decNumber                                     */
   3372 /*   src  is the source decNumber                                     */
   3373 /*   returns dest                                                     */
   3374 /*                                                                    */
   3375 /* (dest==src is allowed and is a no-op)                              */
   3376 /* All fields are updated as required.  This is a utility operation,  */
   3377 /* so special values are unchanged and no error is possible.          */
   3378 /* ------------------------------------------------------------------ */
   3379 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopy(decNumber *dest, const decNumber *src) {
   3380 
   3381   #if DECCHECK
   3382   if (src==NULL) return uprv_decNumberZero(dest);
   3383   #endif
   3384 
   3385   if (dest==src) return dest;                /* no copy required  */
   3386 
   3387   /* Use explicit assignments here as structure assignment could copy  */
   3388   /* more than just the lsu (for small DECDPUN).  This would not affect  */
   3389   /* the value of the results, but could disturb test harness spill  */
   3390   /* checking.  */
   3391   dest->bits=src->bits;
   3392   dest->exponent=src->exponent;
   3393   dest->digits=src->digits;
   3394   dest->lsu[0]=src->lsu[0];
   3395   if (src->digits>DECDPUN) {                 /* more Units to come  */
   3396     const Unit *smsup, *s;                   /* work  */
   3397     Unit  *d;                                /* ..  */
   3398     /* memcpy for the remaining Units would be safe as they cannot  */
   3399     /* overlap.  However, this explicit loop is faster in short cases.  */
   3400     d=dest->lsu+1;                           /* -> first destination  */
   3401     smsup=src->lsu+D2U(src->digits);         /* -> source msu+1  */
   3402     for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
   3403     }
   3404   return dest;
   3405   } /* decNumberCopy  */
   3406 
   3407 /* ------------------------------------------------------------------ */
   3408 /* decNumberCopyAbs -- quiet absolute value operator                  */
   3409 /*                                                                    */
   3410 /*   This sets C = abs(A)                                             */
   3411 /*                                                                    */
   3412 /*   res is C, the result.  C may be A                                */
   3413 /*   rhs is A                                                         */
   3414 /*                                                                    */
   3415 /* C must have space for set->digits digits.                          */
   3416 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3417 /* See also decNumberAbs for a checking version of this.              */
   3418 /* ------------------------------------------------------------------ */
   3419 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
   3420   #if DECCHECK
   3421   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3422   #endif
   3423   uprv_decNumberCopy(res, rhs);
   3424   res->bits&=~DECNEG;                   /* turn off sign  */
   3425   return res;
   3426   } /* decNumberCopyAbs  */
   3427 
   3428 /* ------------------------------------------------------------------ */
   3429 /* decNumberCopyNegate -- quiet negate value operator                 */
   3430 /*                                                                    */
   3431 /*   This sets C = negate(A)                                          */
   3432 /*                                                                    */
   3433 /*   res is C, the result.  C may be A                                */
   3434 /*   rhs is A                                                         */
   3435 /*                                                                    */
   3436 /* C must have space for set->digits digits.                          */
   3437 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3438 /* See also decNumberMinus for a checking version of this.            */
   3439 /* ------------------------------------------------------------------ */
   3440 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
   3441   #if DECCHECK
   3442   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3443   #endif
   3444   uprv_decNumberCopy(res, rhs);
   3445   res->bits^=DECNEG;                    /* invert the sign  */
   3446   return res;
   3447   } /* decNumberCopyNegate  */
   3448 
   3449 /* ------------------------------------------------------------------ */
   3450 /* decNumberCopySign -- quiet copy and set sign operator              */
   3451 /*                                                                    */
   3452 /*   This sets C = A with the sign of B                               */
   3453 /*                                                                    */
   3454 /*   res is C, the result.  C may be A                                */
   3455 /*   lhs is A                                                         */
   3456 /*   rhs is B                                                         */
   3457 /*                                                                    */
   3458 /* C must have space for set->digits digits.                          */
   3459 /* No exception or error can occur; this is a quiet bitwise operation.*/
   3460 /* ------------------------------------------------------------------ */
   3461 U_CAPI decNumber * U_EXPORT2 uprv_decNumberCopySign(decNumber *res, const decNumber *lhs,
   3462                               const decNumber *rhs) {
   3463   uByte sign;                           /* rhs sign  */
   3464   #if DECCHECK
   3465   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
   3466   #endif
   3467   sign=rhs->bits & DECNEG;              /* save sign bit  */
   3468   uprv_decNumberCopy(res, lhs);
   3469   res->bits&=~DECNEG;                   /* clear the sign  */
   3470   res->bits|=sign;                      /* set from rhs  */
   3471   return res;
   3472   } /* decNumberCopySign  */
   3473 
   3474 /* ------------------------------------------------------------------ */
   3475 /* decNumberGetBCD -- get the coefficient in BCD8                     */
   3476 /*   dn is the source decNumber                                       */
   3477 /*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
   3478 /*     most-significant at offset 0                                   */
   3479 /*   returns bcd                                                      */
   3480 /*                                                                    */
   3481 /* bcd must have at least dn->digits bytes.  No error is possible; if */
   3482 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
   3483 /* ------------------------------------------------------------------ */
   3484 U_CAPI uByte * U_EXPORT2 uprv_decNumberGetBCD(const decNumber *dn, uByte *bcd) {
   3485   uByte *ub=bcd+dn->digits-1;      /* -> lsd  */
   3486   const Unit *up=dn->lsu;          /* Unit pointer, -> lsu  */
   3487 
   3488   #if DECDPUN==1                   /* trivial simple copy  */
   3489     for (; ub>=bcd; ub--, up++) *ub=*up;
   3490   #else                            /* chopping needed  */
   3491     uInt u=*up;                    /* work  */
   3492     uInt cut=DECDPUN;              /* downcounter through unit  */
   3493     for (; ub>=bcd; ub--) {
   3494       *ub=(uByte)(u%10);           /* [*6554 trick inhibits, here]  */
   3495       u=u/10;
   3496       cut--;
   3497       if (cut>0) continue;         /* more in this unit  */
   3498       up++;
   3499       u=*up;
   3500       cut=DECDPUN;
   3501       }
   3502   #endif
   3503   return bcd;
   3504   } /* decNumberGetBCD  */
   3505 
   3506 /* ------------------------------------------------------------------ */
   3507 /* decNumberSetBCD -- set (replace) the coefficient from BCD8         */
   3508 /*   dn is the target decNumber                                       */
   3509 /*   bcd is the uInt array that will source n BCD bytes, most-        */
   3510 /*     significant at offset 0                                        */
   3511 /*   n is the number of digits in the source BCD array (bcd)          */
   3512 /*   returns dn                                                       */
   3513 /*                                                                    */
   3514 /* dn must have space for at least n digits.  No error is possible;   */
   3515 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
   3516 /* and bcd[0] zero.                                                   */
   3517 /* ------------------------------------------------------------------ */
   3518 U_CAPI decNumber * U_EXPORT2 uprv_decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
   3519   Unit *up=dn->lsu+D2U(dn->digits)-1;   /* -> msu [target pointer]  */
   3520   const uByte *ub=bcd;                  /* -> source msd  */
   3521 
   3522   #if DECDPUN==1                        /* trivial simple copy  */
   3523     for (; ub<bcd+n; ub++, up--) *up=*ub;
   3524   #else                                 /* some assembly needed  */
   3525     /* calculate how many digits in msu, and hence first cut  */
   3526     Int cut=MSUDIGITS(n);               /* [faster than remainder]  */
   3527     for (;up>=dn->lsu; up--) {          /* each Unit from msu  */
   3528       *up=0;                            /* will take <=DECDPUN digits  */
   3529       for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
   3530       cut=DECDPUN;                      /* next Unit has all digits  */
   3531       }
   3532   #endif
   3533   dn->digits=n;                         /* set digit count  */
   3534   return dn;
   3535   } /* decNumberSetBCD  */
   3536 
   3537 /* ------------------------------------------------------------------ */
   3538 /* decNumberIsNormal -- test normality of a decNumber                 */
   3539 /*   dn is the decNumber to test                                      */
   3540 /*   set is the context to use for Emin                               */
   3541 /*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise              */
   3542 /* ------------------------------------------------------------------ */
   3543 Int uprv_decNumberIsNormal(const decNumber *dn, decContext *set) {
   3544   Int ae;                               /* adjusted exponent  */
   3545   #if DECCHECK
   3546   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3547   #endif
   3548 
   3549   if (decNumberIsSpecial(dn)) return 0; /* not finite  */
   3550   if (decNumberIsZero(dn)) return 0;    /* not non-zero  */
   3551 
   3552   ae=dn->exponent+dn->digits-1;         /* adjusted exponent  */
   3553   if (ae<set->emin) return 0;           /* is subnormal  */
   3554   return 1;
   3555   } /* decNumberIsNormal  */
   3556 
   3557 /* ------------------------------------------------------------------ */
   3558 /* decNumberIsSubnormal -- test subnormality of a decNumber           */
   3559 /*   dn is the decNumber to test                                      */
   3560 /*   set is the context to use for Emin                               */
   3561 /*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
   3562 /* ------------------------------------------------------------------ */
   3563 Int uprv_decNumberIsSubnormal(const decNumber *dn, decContext *set) {
   3564   Int ae;                               /* adjusted exponent  */
   3565   #if DECCHECK
   3566   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
   3567   #endif
   3568 
   3569   if (decNumberIsSpecial(dn)) return 0; /* not finite  */
   3570   if (decNumberIsZero(dn)) return 0;    /* not non-zero  */
   3571 
   3572   ae=dn->exponent+dn->digits-1;         /* adjusted exponent  */
   3573   if (ae<set->emin) return 1;           /* is subnormal  */
   3574   return 0;
   3575   } /* decNumberIsSubnormal  */
   3576 
   3577 /* ------------------------------------------------------------------ */
   3578 /* decNumberTrim -- remove insignificant zeros                        */
   3579 /*                                                                    */
   3580 /*   dn is the number to trim                                         */
   3581 /*   returns dn                                                       */
   3582 /*                                                                    */
   3583 /* All fields are updated as required.  This is a utility operation,  */
   3584 /* so special values are unchanged and no error is possible.  The     */
   3585 /* zeros are removed unconditionally.                                 */
   3586 /* ------------------------------------------------------------------ */
   3587 U_CAPI decNumber * U_EXPORT2 uprv_decNumberTrim(decNumber *dn) {
   3588   Int  dropped;                    /* work  */
   3589   decContext set;                  /* ..  */
   3590   #if DECCHECK
   3591   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
   3592   #endif
   3593   uprv_decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0  */
   3594   return decTrim(dn, &set, 0, 1, &dropped);
   3595   } /* decNumberTrim  */
   3596 
   3597 /* ------------------------------------------------------------------ */
   3598 /* decNumberVersion -- return the name and version of this module     */
   3599 /*                                                                    */
   3600 /* No error is possible.                                              */
   3601 /* ------------------------------------------------------------------ */
   3602 const char * uprv_decNumberVersion(void) {
   3603   return DECVERSION;
   3604   } /* decNumberVersion  */
   3605 
   3606 /* ------------------------------------------------------------------ */
   3607 /* decNumberZero -- set a number to 0                                 */
   3608 /*                                                                    */
   3609 /*   dn is the number to set, with space for one digit                */
   3610 /*   returns dn                                                       */
   3611 /*                                                                    */
   3612 /* No error is possible.                                              */
   3613 /* ------------------------------------------------------------------ */
   3614 /* Memset is not used as it is much slower in some environments.  */
   3615 U_CAPI decNumber * U_EXPORT2 uprv_decNumberZero(decNumber *dn) {
   3616 
   3617   #if DECCHECK
   3618   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   3619   #endif
   3620 
   3621   dn->bits=0;
   3622   dn->exponent=0;
   3623   dn->digits=1;
   3624   dn->lsu[0]=0;
   3625   return dn;
   3626   } /* decNumberZero  */
   3627 
   3628 /* ================================================================== */
   3629 /* Local routines                                                     */
   3630 /* ================================================================== */
   3631 
   3632 /* ------------------------------------------------------------------ */
   3633 /* decToString -- lay out a number into a string                      */
   3634 /*                                                                    */
   3635 /*   dn     is the number to lay out                                  */
   3636 /*   string is where to lay out the number                            */
   3637 /*   eng    is 1 if Engineering, 0 if Scientific                      */
   3638 /*                                                                    */
   3639 /* string must be at least dn->digits+14 characters long              */
   3640 /* No error is possible.                                              */
   3641 /*                                                                    */
   3642 /* Note that this routine can generate a -0 or 0.000.  These are      */
   3643 /* never generated in subset to-number or arithmetic, but can occur   */
   3644 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).              */
   3645 /* ------------------------------------------------------------------ */
   3646 /* If DECCHECK is enabled the string "?" is returned if a number is  */
   3647 /* invalid.  */
   3648 static void decToString(const decNumber *dn, char *string, Flag eng) {
   3649   Int exp=dn->exponent;       /* local copy  */
   3650   Int e;                      /* E-part value  */
   3651   Int pre;                    /* digits before the '.'  */
   3652   Int cut;                    /* for counting digits in a Unit  */
   3653   char *c=string;             /* work [output pointer]  */
   3654   const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer]  */
   3655   uInt u, pow;                /* work  */
   3656 
   3657   #if DECCHECK
   3658   if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
   3659     strcpy(string, "?");
   3660     return;}
   3661   #endif
   3662 
   3663   if (decNumberIsNegative(dn)) {   /* Negatives get a minus  */
   3664     *c='-';
   3665     c++;
   3666     }
   3667   if (dn->bits&DECSPECIAL) {       /* Is a special value  */
   3668     if (decNumberIsInfinite(dn)) {
   3669       strcpy(c,   "Inf");
   3670       strcpy(c+3, "inity");
   3671       return;}
   3672     /* a NaN  */
   3673     if (dn->bits&DECSNAN) {        /* signalling NaN  */
   3674       *c='s';
   3675       c++;
   3676       }
   3677     strcpy(c, "NaN");
   3678     c+=3;                          /* step past  */
   3679     /* if not a clean non-zero coefficient, that's all there is in a  */
   3680     /* NaN string  */
   3681     if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
   3682     /* [drop through to add integer]  */
   3683     }
   3684 
   3685   /* calculate how many digits in msu, and hence first cut  */
   3686   cut=MSUDIGITS(dn->digits);       /* [faster than remainder]  */
   3687   cut--;                           /* power of ten for digit  */
   3688 
   3689   if (exp==0) {                    /* simple integer [common fastpath]  */
   3690     for (;up>=dn->lsu; up--) {     /* each Unit from msu  */
   3691       u=*up;                       /* contains DECDPUN digits to lay out  */
   3692       for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
   3693       cut=DECDPUN-1;               /* next Unit has all digits  */
   3694       }
   3695     *c='\0';                       /* terminate the string  */
   3696     return;}
   3697 
   3698   /* non-0 exponent -- assume plain form */
   3699   pre=dn->digits+exp;              /* digits before '.'  */
   3700   e=0;                             /* no E  */
   3701   if ((exp>0) || (pre<-5)) {       /* need exponential form  */
   3702     e=exp+dn->digits-1;            /* calculate E value  */
   3703     pre=1;                         /* assume one digit before '.'  */
   3704     if (eng && (e!=0)) {           /* engineering: may need to adjust  */
   3705       Int adj;                     /* adjustment  */
   3706       /* The C remainder operator is undefined for negative numbers, so  */
   3707       /* a positive remainder calculation must be used here  */
   3708       if (e<0) {
   3709         adj=(-e)%3;
   3710         if (adj!=0) adj=3-adj;
   3711         }
   3712        else { /* e>0  */
   3713         adj=e%3;
   3714         }
   3715       e=e-adj;
   3716       /* if dealing with zero still produce an exponent which is a  */
   3717       /* multiple of three, as expected, but there will only be the  */
   3718       /* one zero before the E, still.  Otherwise note the padding.  */
   3719       if (!ISZERO(dn)) pre+=adj;
   3720        else {  /* is zero  */
   3721         if (adj!=0) {              /* 0.00Esnn needed  */
   3722           e=e+3;
   3723           pre=-(2-adj);
   3724           }
   3725         } /* zero  */
   3726       } /* eng  */
   3727     } /* need exponent  */
   3728 
   3729   /* lay out the digits of the coefficient, adding 0s and . as needed */
   3730   u=*up;
   3731   if (pre>0) {                     /* xxx.xxx or xx00 (engineering) form  */
   3732     Int n=pre;
   3733     for (; pre>0; pre--, c++, cut--) {
   3734       if (cut<0) {                 /* need new Unit  */
   3735         if (up==dn->lsu) break;    /* out of input digits (pre>digits)  */
   3736         up--;
   3737         cut=DECDPUN-1;
   3738         u=*up;
   3739         }
   3740       TODIGIT(u, cut, c, pow);
   3741       }
   3742     if (n<dn->digits) {            /* more to come, after '.'  */
   3743       *c='.'; c++;
   3744       for (;; c++, cut--) {
   3745         if (cut<0) {               /* need new Unit  */
   3746           if (up==dn->lsu) break;  /* out of input digits  */
   3747           up--;
   3748           cut=DECDPUN-1;
   3749           u=*up;
   3750           }
   3751         TODIGIT(u, cut, c, pow);
   3752         }
   3753       }
   3754      else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed  */
   3755     }
   3756    else {                          /* 0.xxx or 0.000xxx form  */
   3757     *c='0'; c++;
   3758     *c='.'; c++;
   3759     for (; pre<0; pre++, c++) *c='0';   /* add any 0's after '.'  */
   3760     for (; ; c++, cut--) {
   3761       if (cut<0) {                 /* need new Unit  */
   3762         if (up==dn->lsu) break;    /* out of input digits  */
   3763         up--;
   3764         cut=DECDPUN-1;
   3765         u=*up;
   3766         }
   3767       TODIGIT(u, cut, c, pow);
   3768       }
   3769     }
   3770 
   3771   /* Finally add the E-part, if needed.  It will never be 0, has a
   3772      base maximum and minimum of +999999999 through -999999999, but
   3773      could range down to -1999999998 for anormal numbers */
   3774   if (e!=0) {
   3775     Flag had=0;               /* 1=had non-zero  */
   3776     *c='E'; c++;
   3777     *c='+'; c++;              /* assume positive  */
   3778     u=e;                      /* ..  */
   3779     if (e<0) {
   3780       *(c-1)='-';             /* oops, need -  */
   3781       u=-e;                   /* uInt, please  */
   3782       }
   3783     /* lay out the exponent [_itoa or equivalent is not ANSI C]  */
   3784     for (cut=9; cut>=0; cut--) {
   3785       TODIGIT(u, cut, c, pow);
   3786       if (*c=='0' && !had) continue;    /* skip leading zeros  */
   3787       had=1;                            /* had non-0  */
   3788       c++;                              /* step for next  */
   3789       } /* cut  */
   3790     }
   3791   *c='\0';          /* terminate the string (all paths)  */
   3792   return;
   3793   } /* decToString  */
   3794 
   3795 /* ------------------------------------------------------------------ */
   3796 /* decAddOp -- add/subtract operation                                 */
   3797 /*                                                                    */
   3798 /*   This computes C = A + B                                          */
   3799 /*                                                                    */
   3800 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)         */
   3801 /*   lhs is A                                                         */
   3802 /*   rhs is B                                                         */
   3803 /*   set is the context                                               */
   3804 /*   negate is DECNEG if rhs should be negated, or 0 otherwise        */
   3805 /*   status accumulates status for the caller                         */
   3806 /*                                                                    */
   3807 /* C must have space for set->digits digits.                          */
   3808 /* Inexact in status must be 0 for correct Exact zero sign in result  */
   3809 /* ------------------------------------------------------------------ */
   3810 /* If possible, the coefficient is calculated directly into C.        */
   3811 /* However, if:                                                       */
   3812 /*   -- a digits+1 calculation is needed because the numbers are      */
   3813 /*      unaligned and span more than set->digits digits               */
   3814 /*   -- a carry to digits+1 digits looks possible                     */
   3815 /*   -- C is the same as A or B, and the result would destructively   */
   3816 /*      overlap the A or B coefficient                                */
   3817 /* then the result must be calculated into a temporary buffer.  In    */
   3818 /* this case a local (stack) buffer is used if possible, and only if  */
   3819 /* too long for that does malloc become the final resort.             */
   3820 /*                                                                    */
   3821 /* Misalignment is handled as follows:                                */
   3822 /*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
   3823 /*   BPad: Apply the padding by a combination of shifting (whole      */
   3824 /*         units) and multiplication (part units).                    */
   3825 /*                                                                    */
   3826 /* Addition, especially x=x+1, is speed-critical.                     */
   3827 /* The static buffer is larger than might be expected to allow for    */
   3828 /* calls from higher-level funtions (notable exp).                    */
   3829 /* ------------------------------------------------------------------ */
   3830 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
   3831                             const decNumber *rhs, decContext *set,
   3832                             uByte negate, uInt *status) {
   3833   #if DECSUBSET
   3834   decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated  */
   3835   decNumber *allocrhs=NULL;        /* .., rhs  */
   3836   #endif
   3837   Int   rhsshift;                  /* working shift (in Units)  */
   3838   Int   maxdigits;                 /* longest logical length  */
   3839   Int   mult;                      /* multiplier  */
   3840   Int   residue;                   /* rounding accumulator  */
   3841   uByte bits;                      /* result bits  */
   3842   Flag  diffsign;                  /* non-0 if arguments have different sign  */
   3843   Unit  *acc;                      /* accumulator for result  */
   3844   Unit  accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many  */
   3845                                    /* allocations when called from  */
   3846                                    /* other operations, notable exp]  */
   3847   Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated  */
   3848   Int   reqdigits=set->digits;     /* local copy; requested DIGITS  */
   3849   Int   padding;                   /* work  */
   3850 
   3851   #if DECCHECK
   3852   if (decCheckOperands(res, lhs, rhs, set)) return res;
   3853   #endif
   3854 
   3855   do {                             /* protect allocated storage  */
   3856     #if DECSUBSET
   3857     if (!set->extended) {
   3858       /* reduce operands and set lostDigits status, as needed  */
   3859       if (lhs->digits>reqdigits) {
   3860         alloclhs=decRoundOperand(lhs, set, status);
   3861         if (alloclhs==NULL) break;
   3862         lhs=alloclhs;
   3863         }
   3864       if (rhs->digits>reqdigits) {
   3865         allocrhs=decRoundOperand(rhs, set, status);
   3866         if (allocrhs==NULL) break;
   3867         rhs=allocrhs;
   3868         }
   3869       }
   3870     #endif
   3871     /* [following code does not require input rounding]  */
   3872 
   3873     /* note whether signs differ [used all paths]  */
   3874     diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
   3875 
   3876     /* handle infinities and NaNs  */
   3877     if (SPECIALARGS) {                  /* a special bit set  */
   3878       if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN  */
   3879         decNaNs(res, lhs, rhs, set, status);
   3880        else { /* one or two infinities  */
   3881         if (decNumberIsInfinite(lhs)) { /* LHS is infinity  */
   3882           /* two infinities with different signs is invalid  */
   3883           if (decNumberIsInfinite(rhs) && diffsign) {
   3884             *status|=DEC_Invalid_operation;
   3885             break;
   3886             }
   3887           bits=lhs->bits & DECNEG;      /* get sign from LHS  */
   3888           }
   3889          else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity  */
   3890         bits|=DECINF;
   3891         uprv_decNumberZero(res);
   3892         res->bits=bits;                 /* set +/- infinity  */
   3893         } /* an infinity  */
   3894       break;
   3895       }
   3896 
   3897     /* Quick exit for add 0s; return the non-0, modified as need be  */
   3898     if (ISZERO(lhs)) {
   3899       Int adjust;                       /* work  */
   3900       Int lexp=lhs->exponent;           /* save in case LHS==RES  */
   3901       bits=lhs->bits;                   /* ..  */
   3902       residue=0;                        /* clear accumulator  */
   3903       decCopyFit(res, rhs, set, &residue, status); /* copy (as needed)  */
   3904       res->bits^=negate;                /* flip if rhs was negated  */
   3905       #if DECSUBSET
   3906       if (set->extended) {              /* exponents on zeros count  */
   3907       #endif
   3908         /* exponent will be the lower of the two  */
   3909         adjust=lexp-res->exponent;      /* adjustment needed [if -ve]  */
   3910         if (ISZERO(res)) {              /* both 0: special IEEE 754 rules  */
   3911           if (adjust<0) res->exponent=lexp;  /* set exponent  */
   3912           /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0  */
   3913           if (diffsign) {
   3914             if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
   3915              else res->bits=DECNEG;     /* preserve 0 sign  */
   3916             }
   3917           }
   3918          else { /* non-0 res  */
   3919           if (adjust<0) {     /* 0-padding needed  */
   3920             if ((res->digits-adjust)>set->digits) {
   3921               adjust=res->digits-set->digits;     /* to fit exactly  */
   3922               *status|=DEC_Rounded;               /* [but exact]  */
   3923               }
   3924             res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   3925             res->exponent+=adjust;                /* set the exponent.  */
   3926             }
   3927           } /* non-0 res  */
   3928       #if DECSUBSET
   3929         } /* extended  */
   3930       #endif
   3931       decFinish(res, set, &residue, status);      /* clean and finalize  */
   3932       break;}
   3933 
   3934     if (ISZERO(rhs)) {                  /* [lhs is non-zero]  */
   3935       Int adjust;                       /* work  */
   3936       Int rexp=rhs->exponent;           /* save in case RHS==RES  */
   3937       bits=rhs->bits;                   /* be clean  */
   3938       residue=0;                        /* clear accumulator  */
   3939       decCopyFit(res, lhs, set, &residue, status); /* copy (as needed)  */
   3940       #if DECSUBSET
   3941       if (set->extended) {              /* exponents on zeros count  */
   3942       #endif
   3943         /* exponent will be the lower of the two  */
   3944         /* [0-0 case handled above]  */
   3945         adjust=rexp-res->exponent;      /* adjustment needed [if -ve]  */
   3946         if (adjust<0) {     /* 0-padding needed  */
   3947           if ((res->digits-adjust)>set->digits) {
   3948             adjust=res->digits-set->digits;     /* to fit exactly  */
   3949             *status|=DEC_Rounded;               /* [but exact]  */
   3950             }
   3951           res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   3952           res->exponent+=adjust;                /* set the exponent.  */
   3953           }
   3954       #if DECSUBSET
   3955         } /* extended  */
   3956       #endif
   3957       decFinish(res, set, &residue, status);      /* clean and finalize  */
   3958       break;}
   3959 
   3960     /* [NB: both fastpath and mainpath code below assume these cases  */
   3961     /* (notably 0-0) have already been handled]  */
   3962 
   3963     /* calculate the padding needed to align the operands  */
   3964     padding=rhs->exponent-lhs->exponent;
   3965 
   3966     /* Fastpath cases where the numbers are aligned and normal, the RHS  */
   3967     /* is all in one unit, no operand rounding is needed, and no carry,  */
   3968     /* lengthening, or borrow is needed  */
   3969     if (padding==0
   3970         && rhs->digits<=DECDPUN
   3971         && rhs->exponent>=set->emin     /* [some normals drop through]  */
   3972         && rhs->exponent<=set->emax-set->digits+1 /* [could clamp]  */
   3973         && rhs->digits<=reqdigits
   3974         && lhs->digits<=reqdigits) {
   3975       Int partial=*lhs->lsu;
   3976       if (!diffsign) {                  /* adding  */
   3977         partial+=*rhs->lsu;
   3978         if ((partial<=DECDPUNMAX)       /* result fits in unit  */
   3979          && (lhs->digits>=DECDPUN ||    /* .. and no digits-count change  */
   3980              partial<(Int)powers[lhs->digits])) { /* ..  */
   3981           if (res!=lhs) uprv_decNumberCopy(res, lhs);  /* not in place  */
   3982           *res->lsu=(Unit)partial;      /* [copy could have overwritten RHS]  */
   3983           break;
   3984           }
   3985         /* else drop out for careful add  */
   3986         }
   3987        else {                           /* signs differ  */
   3988         partial-=*rhs->lsu;
   3989         if (partial>0) { /* no borrow needed, and non-0 result  */
   3990           if (res!=lhs) uprv_decNumberCopy(res, lhs);  /* not in place  */
   3991           *res->lsu=(Unit)partial;
   3992           /* this could have reduced digits [but result>0]  */
   3993           res->digits=decGetDigits(res->lsu, D2U(res->digits));
   3994           break;
   3995           }
   3996         /* else drop out for careful subtract  */
   3997         }
   3998       }
   3999 
   4000     /* Now align (pad) the lhs or rhs so they can be added or  */
   4001     /* subtracted, as necessary.  If one number is much larger than  */
   4002     /* the other (that is, if in plain form there is a least one  */
   4003     /* digit between the lowest digit of one and the highest of the  */
   4004     /* other) padding with up to DIGITS-1 trailing zeros may be  */
   4005     /* needed; then apply rounding (as exotic rounding modes may be  */
   4006     /* affected by the residue).  */
   4007     rhsshift=0;               /* rhs shift to left (padding) in Units  */
   4008     bits=lhs->bits;           /* assume sign is that of LHS  */
   4009     mult=1;                   /* likely multiplier  */
   4010 
   4011     /* [if padding==0 the operands are aligned; no padding is needed]  */
   4012     if (padding!=0) {
   4013       /* some padding needed; always pad the RHS, as any required  */
   4014       /* padding can then be effected by a simple combination of  */
   4015       /* shifts and a multiply  */
   4016       Flag swapped=0;
   4017       if (padding<0) {                  /* LHS needs the padding  */
   4018         const decNumber *t;
   4019         padding=-padding;               /* will be +ve  */
   4020         bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS  */
   4021         t=lhs; lhs=rhs; rhs=t;
   4022         swapped=1;
   4023         }
   4024 
   4025       /* If, after pad, rhs would be longer than lhs by digits+1 or  */
   4026       /* more then lhs cannot affect the answer, except as a residue,  */
   4027       /* so only need to pad up to a length of DIGITS+1.  */
   4028       if (rhs->digits+padding > lhs->digits+reqdigits+1) {
   4029         /* The RHS is sufficient  */
   4030         /* for residue use the relative sign indication...  */
   4031         Int shift=reqdigits-rhs->digits;     /* left shift needed  */
   4032         residue=1;                           /* residue for rounding  */
   4033         if (diffsign) residue=-residue;      /* signs differ  */
   4034         /* copy, shortening if necessary  */
   4035         decCopyFit(res, rhs, set, &residue, status);
   4036         /* if it was already shorter, then need to pad with zeros  */
   4037         if (shift>0) {
   4038           res->digits=decShiftToMost(res->lsu, res->digits, shift);
   4039           res->exponent-=shift;              /* adjust the exponent.  */
   4040           }
   4041         /* flip the result sign if unswapped and rhs was negated  */
   4042         if (!swapped) res->bits^=negate;
   4043         decFinish(res, set, &residue, status);    /* done  */
   4044         break;}
   4045 
   4046       /* LHS digits may affect result  */
   4047       rhsshift=D2U(padding+1)-1;        /* this much by Unit shift ..  */
   4048       mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication  */
   4049       } /* padding needed  */
   4050 
   4051     if (diffsign) mult=-mult;           /* signs differ  */
   4052 
   4053     /* determine the longer operand  */
   4054     maxdigits=rhs->digits+padding;      /* virtual length of RHS  */
   4055     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4056 
   4057     /* Decide on the result buffer to use; if possible place directly  */
   4058     /* into result.  */
   4059     acc=res->lsu;                       /* assume add direct to result  */
   4060     /* If destructive overlap, or the number is too long, or a carry or  */
   4061     /* borrow to DIGITS+1 might be possible, a buffer must be used.  */
   4062     /* [Might be worth more sophisticated tests when maxdigits==reqdigits]  */
   4063     if ((maxdigits>=reqdigits)          /* is, or could be, too large  */
   4064      || (res==rhs && rhsshift>0)) {     /* destructive overlap  */
   4065       /* buffer needed, choose it; units for maxdigits digits will be  */
   4066       /* needed, +1 Unit for carry or borrow  */
   4067       Int need=D2U(maxdigits)+1;
   4068       acc=accbuff;                      /* assume use local buffer  */
   4069       if (need*sizeof(Unit)>sizeof(accbuff)) {
   4070         /* printf("malloc add %ld %ld\n", need, sizeof(accbuff));  */
   4071         allocacc=(Unit *)malloc(need*sizeof(Unit));
   4072         if (allocacc==NULL) {           /* hopeless -- abandon  */
   4073           *status|=DEC_Insufficient_storage;
   4074           break;}
   4075         acc=allocacc;
   4076         }
   4077       }
   4078 
   4079     res->bits=(uByte)(bits&DECNEG);     /* it's now safe to overwrite..  */
   4080     res->exponent=lhs->exponent;        /* .. operands (even if aliased)  */
   4081 
   4082     #if DECTRACE
   4083       decDumpAr('A', lhs->lsu, D2U(lhs->digits));
   4084       decDumpAr('B', rhs->lsu, D2U(rhs->digits));
   4085       printf("  :h: %ld %ld\n", rhsshift, mult);
   4086     #endif
   4087 
   4088     /* add [A+B*m] or subtract [A+B*(-m)]  */
   4089     U_ASSERT(rhs->digits > 0);
   4090     U_ASSERT(lhs->digits > 0);
   4091     res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
   4092                               rhs->lsu, D2U(rhs->digits),
   4093                               rhsshift, acc, mult)
   4094                *DECDPUN;           /* [units -> digits]  */
   4095     if (res->digits<0) {           /* borrowed...  */
   4096       res->digits=-res->digits;
   4097       res->bits^=DECNEG;           /* flip the sign  */
   4098       }
   4099     #if DECTRACE
   4100       decDumpAr('+', acc, D2U(res->digits));
   4101     #endif
   4102 
   4103     /* If a buffer was used the result must be copied back, possibly  */
   4104     /* shortening.  (If no buffer was used then the result must have  */
   4105     /* fit, so can't need rounding and residue must be 0.)  */
   4106     residue=0;                     /* clear accumulator  */
   4107     if (acc!=res->lsu) {
   4108       #if DECSUBSET
   4109       if (set->extended) {         /* round from first significant digit  */
   4110       #endif
   4111         /* remove leading zeros that were added due to rounding up to  */
   4112         /* integral Units -- before the test for rounding.  */
   4113         if (res->digits>reqdigits)
   4114           res->digits=decGetDigits(acc, D2U(res->digits));
   4115         decSetCoeff(res, set, acc, res->digits, &residue, status);
   4116       #if DECSUBSET
   4117         }
   4118        else { /* subset arithmetic rounds from original significant digit  */
   4119         /* May have an underestimate.  This only occurs when both  */
   4120         /* numbers fit in DECDPUN digits and are padding with a  */
   4121         /* negative multiple (-10, -100...) and the top digit(s) become  */
   4122         /* 0.  (This only matters when using X3.274 rules where the  */
   4123         /* leading zero could be included in the rounding.)  */
   4124         if (res->digits<maxdigits) {
   4125           *(acc+D2U(res->digits))=0; /* ensure leading 0 is there  */
   4126           res->digits=maxdigits;
   4127           }
   4128          else {
   4129           /* remove leading zeros that added due to rounding up to  */
   4130           /* integral Units (but only those in excess of the original  */
   4131           /* maxdigits length, unless extended) before test for rounding.  */
   4132           if (res->digits>reqdigits) {
   4133             res->digits=decGetDigits(acc, D2U(res->digits));
   4134             if (res->digits<maxdigits) res->digits=maxdigits;
   4135             }
   4136           }
   4137         decSetCoeff(res, set, acc, res->digits, &residue, status);
   4138         /* Now apply rounding if needed before removing leading zeros.  */
   4139         /* This is safe because subnormals are not a possibility  */
   4140         if (residue!=0) {
   4141           decApplyRound(res, set, residue, status);
   4142           residue=0;                 /* did what needed to be done  */
   4143           }
   4144         } /* subset  */
   4145       #endif
   4146       } /* used buffer  */
   4147 
   4148     /* strip leading zeros [these were left on in case of subset subtract]  */
   4149     res->digits=decGetDigits(res->lsu, D2U(res->digits));
   4150 
   4151     /* apply checks and rounding  */
   4152     decFinish(res, set, &residue, status);
   4153 
   4154     /* "When the sum of two operands with opposite signs is exactly  */
   4155     /* zero, the sign of that sum shall be '+' in all rounding modes  */
   4156     /* except round toward -Infinity, in which mode that sign shall be  */
   4157     /* '-'."  [Subset zeros also never have '-', set by decFinish.]  */
   4158     if (ISZERO(res) && diffsign
   4159      #if DECSUBSET
   4160      && set->extended
   4161      #endif
   4162      && (*status&DEC_Inexact)==0) {
   4163       if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign -  */
   4164                                   else res->bits&=~DECNEG;  /* sign +  */
   4165       }
   4166     } while(0);                              /* end protected  */
   4167 
   4168   if (allocacc!=NULL) free(allocacc);        /* drop any storage used  */
   4169   #if DECSUBSET
   4170   if (allocrhs!=NULL) free(allocrhs);        /* ..  */
   4171   if (alloclhs!=NULL) free(alloclhs);        /* ..  */
   4172   #endif
   4173   return res;
   4174   } /* decAddOp  */
   4175 
   4176 /* ------------------------------------------------------------------ */
   4177 /* decDivideOp -- division operation                                  */
   4178 /*                                                                    */
   4179 /*  This routine performs the calculations for all four division      */
   4180 /*  operators (divide, divideInteger, remainder, remainderNear).      */
   4181 /*                                                                    */
   4182 /*  C=A op B                                                          */
   4183 /*                                                                    */
   4184 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)         */
   4185 /*   lhs is A                                                         */
   4186 /*   rhs is B                                                         */
   4187 /*   set is the context                                               */
   4188 /*   op  is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
   4189 /*   status is the usual accumulator                                  */
   4190 /*                                                                    */
   4191 /* C must have space for set->digits digits.                          */
   4192 /*                                                                    */
   4193 /* ------------------------------------------------------------------ */
   4194 /*   The underlying algorithm of this routine is the same as in the   */
   4195 /*   1981 S/370 implementation, that is, non-restoring long division  */
   4196 /*   with bi-unit (rather than bi-digit) estimation for each unit     */
   4197 /*   multiplier.  In this pseudocode overview, complications for the  */
   4198 /*   Remainder operators and division residues for exact rounding are */
   4199 /*   omitted for clarity.                                             */
   4200 /*                                                                    */
   4201 /*     Prepare operands and handle special values                     */
   4202 /*     Test for x/0 and then 0/x                                      */
   4203 /*     Exp =Exp1 - Exp2                                               */
   4204 /*     Exp =Exp +len(var1) -len(var2)                                 */
   4205 /*     Sign=Sign1 * Sign2                                             */
   4206 /*     Pad accumulator (Var1) to double-length with 0's (pad1)        */
   4207 /*     Pad Var2 to same length as Var1                                */
   4208 /*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
   4209 /*     have=0                                                         */
   4210 /*     Do until (have=digits+1 OR residue=0)                          */
   4211 /*       if exp<0 then if integer divide/residue then leave           */
   4212 /*       this_unit=0                                                  */
   4213 /*       Do forever                                                   */
   4214 /*          compare numbers                                           */
   4215 /*          if <0 then leave inner_loop                               */
   4216 /*          if =0 then (* quick exit without subtract *) do           */
   4217 /*             this_unit=this_unit+1; output this_unit                */
   4218 /*             leave outer_loop; end                                  */
   4219 /*          Compare lengths of numbers (mantissae):                   */
   4220 /*          If same then tops2=msu2pair -- {units 1&2 of var2}        */
   4221 /*                  else tops2=msu2plus -- {0, unit 1 of var2}        */
   4222 /*          tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
   4223 /*          mult=tops1/tops2  -- Good and safe guess at divisor       */
   4224 /*          if mult=0 then mult=1                                     */
   4225 /*          this_unit=this_unit+mult                                  */
   4226 /*          subtract                                                  */
   4227 /*          end inner_loop                                            */
   4228 /*        if have\=0 | this_unit\=0 then do                           */
   4229 /*          output this_unit                                          */
   4230 /*          have=have+1; end                                          */
   4231 /*        var2=var2/10                                                */
   4232 /*        exp=exp-1                                                   */
   4233 /*        end outer_loop                                              */
   4234 /*     exp=exp+1   -- set the proper exponent                         */
   4235 /*     if have=0 then generate answer=0                               */
   4236 /*     Return (Result is defined by Var1)                             */
   4237 /*                                                                    */
   4238 /* ------------------------------------------------------------------ */
   4239 /* Two working buffers are needed during the division; one (digits+   */
   4240 /* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
   4241 /* long subtractions.  These are acc and var1 respectively.           */
   4242 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
   4243 /* The static buffers may be larger than might be expected to allow   */
   4244 /* for calls from higher-level funtions (notable exp).                */
   4245 /* ------------------------------------------------------------------ */
   4246 static decNumber * decDivideOp(decNumber *res,
   4247                                const decNumber *lhs, const decNumber *rhs,
   4248                                decContext *set, Flag op, uInt *status) {
   4249   #if DECSUBSET
   4250   decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated  */
   4251   decNumber *allocrhs=NULL;        /* .., rhs  */
   4252   #endif
   4253   Unit  accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer  */
   4254   Unit  *acc=accbuff;              /* -> accumulator array for result  */
   4255   Unit  *allocacc=NULL;            /* -> allocated buffer, iff allocated  */
   4256   Unit  *accnext;                  /* -> where next digit will go  */
   4257   Int   acclength;                 /* length of acc needed [Units]  */
   4258   Int   accunits;                  /* count of units accumulated  */
   4259   Int   accdigits;                 /* count of digits accumulated  */
   4260 
   4261   Unit  varbuff[SD2U(DECBUFFER*2+DECDPUN)];  /* buffer for var1  */
   4262   Unit  *var1=varbuff;             /* -> var1 array for long subtraction  */
   4263   Unit  *varalloc=NULL;            /* -> allocated buffer, iff used  */
   4264   Unit  *msu1;                     /* -> msu of var1  */
   4265 
   4266   const Unit *var2;                /* -> var2 array  */
   4267   const Unit *msu2;                /* -> msu of var2  */
   4268   Int   msu2plus;                  /* msu2 plus one [does not vary]  */
   4269   eInt  msu2pair;                  /* msu2 pair plus one [does not vary]  */
   4270 
   4271   Int   var1units, var2units;      /* actual lengths  */
   4272   Int   var2ulen;                  /* logical length (units)  */
   4273   Int   var1initpad=0;             /* var1 initial padding (digits)  */
   4274   Int   maxdigits;                 /* longest LHS or required acc length  */
   4275   Int   mult;                      /* multiplier for subtraction  */
   4276   Unit  thisunit;                  /* current unit being accumulated  */
   4277   Int   residue;                   /* for rounding  */
   4278   Int   reqdigits=set->digits;     /* requested DIGITS  */
   4279   Int   exponent;                  /* working exponent  */
   4280   Int   maxexponent=0;             /* DIVIDE maximum exponent if unrounded  */
   4281   uByte bits;                      /* working sign  */
   4282   Unit  *target;                   /* work  */
   4283   const Unit *source;              /* ..  */
   4284   uInt  const *pow;                /* ..  */
   4285   Int   shift, cut;                /* ..  */
   4286   #if DECSUBSET
   4287   Int   dropped;                   /* work  */
   4288   #endif
   4289 
   4290   #if DECCHECK
   4291   if (decCheckOperands(res, lhs, rhs, set)) return res;
   4292   #endif
   4293 
   4294   do {                             /* protect allocated storage  */
   4295     #if DECSUBSET
   4296     if (!set->extended) {
   4297       /* reduce operands and set lostDigits status, as needed  */
   4298       if (lhs->digits>reqdigits) {
   4299         alloclhs=decRoundOperand(lhs, set, status);
   4300         if (alloclhs==NULL) break;
   4301         lhs=alloclhs;
   4302         }
   4303       if (rhs->digits>reqdigits) {
   4304         allocrhs=decRoundOperand(rhs, set, status);
   4305         if (allocrhs==NULL) break;
   4306         rhs=allocrhs;
   4307         }
   4308       }
   4309     #endif
   4310     /* [following code does not require input rounding]  */
   4311 
   4312     bits=(lhs->bits^rhs->bits)&DECNEG;  /* assumed sign for divisions  */
   4313 
   4314     /* handle infinities and NaNs  */
   4315     if (SPECIALARGS) {                  /* a special bit set  */
   4316       if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs  */
   4317         decNaNs(res, lhs, rhs, set, status);
   4318         break;
   4319         }
   4320       /* one or two infinities  */
   4321       if (decNumberIsInfinite(lhs)) {   /* LHS (dividend) is infinite  */
   4322         if (decNumberIsInfinite(rhs) || /* two infinities are invalid ..  */
   4323             op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity  */
   4324           *status|=DEC_Invalid_operation;
   4325           break;
   4326           }
   4327         /* [Note that infinity/0 raises no exceptions]  */
   4328         uprv_decNumberZero(res);
   4329         res->bits=bits|DECINF;          /* set +/- infinity  */
   4330         break;
   4331         }
   4332        else {                           /* RHS (divisor) is infinite  */
   4333         residue=0;
   4334         if (op&(REMAINDER|REMNEAR)) {
   4335           /* result is [finished clone of] lhs  */
   4336           decCopyFit(res, lhs, set, &residue, status);
   4337           }
   4338          else {  /* a division  */
   4339           uprv_decNumberZero(res);
   4340           res->bits=bits;               /* set +/- zero  */
   4341           /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result  */
   4342           /* is a 0 with infinitely negative exponent, clamped to minimum  */
   4343           if (op&DIVIDE) {
   4344             res->exponent=set->emin-set->digits+1;
   4345             *status|=DEC_Clamped;
   4346             }
   4347           }
   4348         decFinish(res, set, &residue, status);
   4349         break;
   4350         }
   4351       }
   4352 
   4353     /* handle 0 rhs (x/0)  */
   4354     if (ISZERO(rhs)) {                  /* x/0 is always exceptional  */
   4355       if (ISZERO(lhs)) {
   4356         uprv_decNumberZero(res);             /* [after lhs test]  */
   4357         *status|=DEC_Division_undefined;/* 0/0 will become NaN  */
   4358         }
   4359        else {
   4360         uprv_decNumberZero(res);
   4361         if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
   4362          else {
   4363           *status|=DEC_Division_by_zero; /* x/0  */
   4364           res->bits=bits|DECINF;         /* .. is +/- Infinity  */
   4365           }
   4366         }
   4367       break;}
   4368 
   4369     /* handle 0 lhs (0/x)  */
   4370     if (ISZERO(lhs)) {                  /* 0/x [x!=0]  */
   4371       #if DECSUBSET
   4372       if (!set->extended) uprv_decNumberZero(res);
   4373        else {
   4374       #endif
   4375         if (op&DIVIDE) {
   4376           residue=0;
   4377           exponent=lhs->exponent-rhs->exponent; /* ideal exponent  */
   4378           uprv_decNumberCopy(res, lhs);      /* [zeros always fit]  */
   4379           res->bits=bits;               /* sign as computed  */
   4380           res->exponent=exponent;       /* exponent, too  */
   4381           decFinalize(res, set, &residue, status);   /* check exponent  */
   4382           }
   4383          else if (op&DIVIDEINT) {
   4384           uprv_decNumberZero(res);           /* integer 0  */
   4385           res->bits=bits;               /* sign as computed  */
   4386           }
   4387          else {                         /* a remainder  */
   4388           exponent=rhs->exponent;       /* [save in case overwrite]  */
   4389           uprv_decNumberCopy(res, lhs);      /* [zeros always fit]  */
   4390           if (exponent<res->exponent) res->exponent=exponent; /* use lower  */
   4391           }
   4392       #if DECSUBSET
   4393         }
   4394       #endif
   4395       break;}
   4396 
   4397     /* Precalculate exponent.  This starts off adjusted (and hence fits  */
   4398     /* in 31 bits) and becomes the usual unadjusted exponent as the  */
   4399     /* division proceeds.  The order of evaluation is important, here,  */
   4400     /* to avoid wrap.  */
   4401     exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
   4402 
   4403     /* If the working exponent is -ve, then some quick exits are  */
   4404     /* possible because the quotient is known to be <1  */
   4405     /* [for REMNEAR, it needs to be < -1, as -0.5 could need work]  */
   4406     if (exponent<0 && !(op==DIVIDE)) {
   4407       if (op&DIVIDEINT) {
   4408         uprv_decNumberZero(res);                  /* integer part is 0  */
   4409         #if DECSUBSET
   4410         if (set->extended)
   4411         #endif
   4412           res->bits=bits;                    /* set +/- zero  */
   4413         break;}
   4414       /* fastpath remainders so long as the lhs has the smaller  */
   4415       /* (or equal) exponent  */
   4416       if (lhs->exponent<=rhs->exponent) {
   4417         if (op&REMAINDER || exponent<-1) {
   4418           /* It is REMAINDER or safe REMNEAR; result is [finished  */
   4419           /* clone of] lhs  (r = x - 0*y)  */
   4420           residue=0;
   4421           decCopyFit(res, lhs, set, &residue, status);
   4422           decFinish(res, set, &residue, status);
   4423           break;
   4424           }
   4425         /* [unsafe REMNEAR drops through]  */
   4426         }
   4427       } /* fastpaths  */
   4428 
   4429     /* Long (slow) division is needed; roll up the sleeves... */
   4430 
   4431     /* The accumulator will hold the quotient of the division.  */
   4432     /* If it needs to be too long for stack storage, then allocate.  */
   4433     acclength=D2U(reqdigits+DECDPUN);   /* in Units  */
   4434     if (acclength*sizeof(Unit)>sizeof(accbuff)) {
   4435       /* printf("malloc dvacc %ld units\n", acclength);  */
   4436       allocacc=(Unit *)malloc(acclength*sizeof(Unit));
   4437       if (allocacc==NULL) {             /* hopeless -- abandon  */
   4438         *status|=DEC_Insufficient_storage;
   4439         break;}
   4440       acc=allocacc;                     /* use the allocated space  */
   4441       }
   4442 
   4443     /* var1 is the padded LHS ready for subtractions.  */
   4444     /* If it needs to be too long for stack storage, then allocate.  */
   4445     /* The maximum units needed for var1 (long subtraction) is:  */
   4446     /* Enough for  */
   4447     /*     (rhs->digits+reqdigits-1) -- to allow full slide to right  */
   4448     /* or  (lhs->digits)             -- to allow for long lhs  */
   4449     /* whichever is larger  */
   4450     /*   +1                -- for rounding of slide to right  */
   4451     /*   +1                -- for leading 0s  */
   4452     /*   +1                -- for pre-adjust if a remainder or DIVIDEINT  */
   4453     /* [Note: unused units do not participate in decUnitAddSub data]  */
   4454     maxdigits=rhs->digits+reqdigits-1;
   4455     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
   4456     var1units=D2U(maxdigits)+2;
   4457     /* allocate a guard unit above msu1 for REMAINDERNEAR  */
   4458     if (!(op&DIVIDE)) var1units++;
   4459     if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
   4460       /* printf("malloc dvvar %ld units\n", var1units+1);  */
   4461       varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
   4462       if (varalloc==NULL) {             /* hopeless -- abandon  */
   4463         *status|=DEC_Insufficient_storage;
   4464         break;}
   4465       var1=varalloc;                    /* use the allocated space  */
   4466       }
   4467 
   4468     /* Extend the lhs and rhs to full long subtraction length.  The lhs  */
   4469     /* is truly extended into the var1 buffer, with 0 padding, so a  */
   4470     /* subtract in place is always possible.  The rhs (var2) has  */
   4471     /* virtual padding (implemented by decUnitAddSub).  */
   4472     /* One guard unit was allocated above msu1 for rem=rem+rem in  */
   4473     /* REMAINDERNEAR.  */
   4474     msu1=var1+var1units-1;              /* msu of var1  */
   4475     source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array  */
   4476     for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
   4477     for (; target>=var1; target--) *target=0;
   4478 
   4479     /* rhs (var2) is left-aligned with var1 at the start  */
   4480     var2ulen=var1units;                 /* rhs logical length (units)  */
   4481     var2units=D2U(rhs->digits);         /* rhs actual length (units)  */
   4482     var2=rhs->lsu;                      /* -> rhs array  */
   4483     msu2=var2+var2units-1;              /* -> msu of var2 [never changes]  */
   4484     /* now set up the variables which will be used for estimating the  */
   4485     /* multiplication factor.  If these variables are not exact, add  */
   4486     /* 1 to make sure that the multiplier is never overestimated.  */
   4487     msu2plus=*msu2;                     /* it's value ..  */
   4488     if (var2units>1) msu2plus++;        /* .. +1 if any more  */
   4489     msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair ..  */
   4490     if (var2units>1) {                  /* .. [else treat 2nd as 0]  */
   4491       msu2pair+=*(msu2-1);              /* ..  */
   4492       if (var2units>2) msu2pair++;      /* .. +1 if any more  */
   4493       }
   4494 
   4495     /* The calculation is working in units, which may have leading zeros,  */
   4496     /* but the exponent was calculated on the assumption that they are  */
   4497     /* both left-aligned.  Adjust the exponent to compensate: add the  */
   4498     /* number of leading zeros in var1 msu and subtract those in var2 msu.  */
   4499     /* [This is actually done by counting the digits and negating, as  */
   4500     /* lead1=DECDPUN-digits1, and similarly for lead2.]  */
   4501     for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
   4502     for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
   4503 
   4504     /* Now, if doing an integer divide or remainder, ensure that  */
   4505     /* the result will be Unit-aligned.  To do this, shift the var1  */
   4506     /* accumulator towards least if need be.  (It's much easier to  */
   4507     /* do this now than to reassemble the residue afterwards, if  */
   4508     /* doing a remainder.)  Also ensure the exponent is not negative.  */
   4509     if (!(op&DIVIDE)) {
   4510       Unit *u;                          /* work  */
   4511       /* save the initial 'false' padding of var1, in digits  */
   4512       var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
   4513       /* Determine the shift to do.  */
   4514       if (exponent<0) cut=-exponent;
   4515        else cut=DECDPUN-exponent%DECDPUN;
   4516       decShiftToLeast(var1, var1units, cut);
   4517       exponent+=cut;                    /* maintain numerical value  */
   4518       var1initpad-=cut;                 /* .. and reduce padding  */
   4519       /* clean any most-significant units which were just emptied  */
   4520       for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
   4521       } /* align  */
   4522      else { /* is DIVIDE  */
   4523       maxexponent=lhs->exponent-rhs->exponent;    /* save  */
   4524       /* optimization: if the first iteration will just produce 0,  */
   4525       /* preadjust to skip it [valid for DIVIDE only]  */
   4526       if (*msu1<*msu2) {
   4527         var2ulen--;                     /* shift down  */
   4528         exponent-=DECDPUN;              /* update the exponent  */
   4529         }
   4530       }
   4531 
   4532     /* ---- start the long-division loops ------------------------------  */
   4533     accunits=0;                         /* no units accumulated yet  */
   4534     accdigits=0;                        /* .. or digits  */
   4535     accnext=acc+acclength-1;            /* -> msu of acc [NB: allows digits+1]  */
   4536     for (;;) {                          /* outer forever loop  */
   4537       thisunit=0;                       /* current unit assumed 0  */
   4538       /* find the next unit  */
   4539       for (;;) {                        /* inner forever loop  */
   4540         /* strip leading zero units [from either pre-adjust or from  */
   4541         /* subtract last time around].  Leave at least one unit.  */
   4542         for (; *msu1==0 && msu1>var1; msu1--) var1units--;
   4543 
   4544         if (var1units<var2ulen) break;       /* var1 too low for subtract  */
   4545         if (var1units==var2ulen) {           /* unit-by-unit compare needed  */
   4546           /* compare the two numbers, from msu  */
   4547           const Unit *pv1, *pv2;
   4548           Unit v2;                           /* units to compare  */
   4549           pv2=msu2;                          /* -> msu  */
   4550           for (pv1=msu1; ; pv1--, pv2--) {
   4551             /* v1=*pv1 -- always OK  */
   4552             v2=0;                            /* assume in padding  */
   4553             if (pv2>=var2) v2=*pv2;          /* in range  */
   4554             if (*pv1!=v2) break;             /* no longer the same  */
   4555             if (pv1==var1) break;            /* done; leave pv1 as is  */
   4556             }
   4557           /* here when all inspected or a difference seen  */
   4558           if (*pv1<v2) break;                /* var1 too low to subtract  */
   4559           if (*pv1==v2) {                    /* var1 == var2  */
   4560             /* reach here if var1 and var2 are identical; subtraction  */
   4561             /* would increase digit by one, and the residue will be 0 so  */
   4562             /* the calculation is done; leave the loop with residue=0.  */
   4563             thisunit++;                      /* as though subtracted  */
   4564             *var1=0;                         /* set var1 to 0  */
   4565             var1units=1;                     /* ..  */
   4566             break;  /* from inner  */
   4567             } /* var1 == var2  */
   4568           /* *pv1>v2.  Prepare for real subtraction; the lengths are equal  */
   4569           /* Estimate the multiplier (there's always a msu1-1)...  */
   4570           /* Bring in two units of var2 to provide a good estimate.  */
   4571           mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
   4572           } /* lengths the same  */
   4573          else { /* var1units > var2ulen, so subtraction is safe  */
   4574           /* The var2 msu is one unit towards the lsu of the var1 msu,  */
   4575           /* so only one unit for var2 can be used.  */
   4576           mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
   4577           }
   4578         if (mult==0) mult=1;                 /* must always be at least 1  */
   4579         /* subtraction needed; var1 is > var2  */
   4580         thisunit=(Unit)(thisunit+mult);      /* accumulate  */
   4581         /* subtract var1-var2, into var1; only the overlap needs  */
   4582         /* processing, as this is an in-place calculation  */
   4583         shift=var2ulen-var2units;
   4584         #if DECTRACE
   4585           decDumpAr('1', &var1[shift], var1units-shift);
   4586           decDumpAr('2', var2, var2units);
   4587           printf("m=%ld\n", -mult);
   4588         #endif
   4589         decUnitAddSub(&var1[shift], var1units-shift,
   4590                       var2, var2units, 0,
   4591                       &var1[shift], -mult);
   4592         #if DECTRACE
   4593           decDumpAr('#', &var1[shift], var1units-shift);
   4594         #endif
   4595         /* var1 now probably has leading zeros; these are removed at the  */
   4596         /* top of the inner loop.  */
   4597         } /* inner loop  */
   4598 
   4599       /* The next unit has been calculated in full; unless it's a  */
   4600       /* leading zero, add to acc  */
   4601       if (accunits!=0 || thisunit!=0) {      /* is first or non-zero  */
   4602         *accnext=thisunit;                   /* store in accumulator  */
   4603         /* account exactly for the new digits  */
   4604         if (accunits==0) {
   4605           accdigits++;                       /* at least one  */
   4606           for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
   4607           }
   4608          else accdigits+=DECDPUN;
   4609         accunits++;                          /* update count  */
   4610         accnext--;                           /* ready for next  */
   4611         if (accdigits>reqdigits) break;      /* have enough digits  */
   4612         }
   4613 
   4614       /* if the residue is zero, the operation is done (unless divide  */
   4615       /* or divideInteger and still not enough digits yet)  */
   4616       if (*var1==0 && var1units==1) {        /* residue is 0  */
   4617         if (op&(REMAINDER|REMNEAR)) break;
   4618         if ((op&DIVIDE) && (exponent<=maxexponent)) break;
   4619         /* [drop through if divideInteger]  */
   4620         }
   4621       /* also done enough if calculating remainder or integer  */
   4622       /* divide and just did the last ('units') unit  */
   4623       if (exponent==0 && !(op&DIVIDE)) break;
   4624 
   4625       /* to get here, var1 is less than var2, so divide var2 by the per-  */
   4626       /* Unit power of ten and go for the next digit  */
   4627       var2ulen--;                            /* shift down  */
   4628       exponent-=DECDPUN;                     /* update the exponent  */
   4629       } /* outer loop  */
   4630 
   4631     /* ---- division is complete ---------------------------------------  */
   4632     /* here: acc      has at least reqdigits+1 of good results (or fewer  */
   4633     /*                if early stop), starting at accnext+1 (its lsu)  */
   4634     /*       var1     has any residue at the stopping point  */
   4635     /*       accunits is the number of digits collected in acc  */
   4636     if (accunits==0) {             /* acc is 0  */
   4637       accunits=1;                  /* show have a unit ..  */
   4638       accdigits=1;                 /* ..  */
   4639       *accnext=0;                  /* .. whose value is 0  */
   4640       }
   4641      else accnext++;               /* back to last placed  */
   4642     /* accnext now -> lowest unit of result  */
   4643 
   4644     residue=0;                     /* assume no residue  */
   4645     if (op&DIVIDE) {
   4646       /* record the presence of any residue, for rounding  */
   4647       if (*var1!=0 || var1units>1) residue=1;
   4648        else { /* no residue  */
   4649         /* Had an exact division; clean up spurious trailing 0s.  */
   4650         /* There will be at most DECDPUN-1, from the final multiply,  */
   4651         /* and then only if the result is non-0 (and even) and the  */
   4652         /* exponent is 'loose'.  */
   4653         #if DECDPUN>1
   4654         Unit lsu=*accnext;
   4655         if (!(lsu&0x01) && (lsu!=0)) {
   4656           /* count the trailing zeros  */
   4657           Int drop=0;
   4658           for (;; drop++) {    /* [will terminate because lsu!=0]  */
   4659             if (exponent>=maxexponent) break;     /* don't chop real 0s  */
   4660             #if DECDPUN<=4
   4661               if ((lsu-QUOT10(lsu, drop+1)
   4662                   *powers[drop+1])!=0) break;     /* found non-0 digit  */
   4663             #else
   4664               if (lsu%powers[drop+1]!=0) break;   /* found non-0 digit  */
   4665             #endif
   4666             exponent++;
   4667             }
   4668           if (drop>0) {
   4669             accunits=decShiftToLeast(accnext, accunits, drop);
   4670             accdigits=decGetDigits(accnext, accunits);
   4671             accunits=D2U(accdigits);
   4672             /* [exponent was adjusted in the loop]  */
   4673             }
   4674           } /* neither odd nor 0  */
   4675         #endif
   4676         } /* exact divide  */
   4677       } /* divide  */
   4678      else /* op!=DIVIDE */ {
   4679       /* check for coefficient overflow  */
   4680       if (accdigits+exponent>reqdigits) {
   4681         *status|=DEC_Division_impossible;
   4682         break;
   4683         }
   4684       if (op & (REMAINDER|REMNEAR)) {
   4685         /* [Here, the exponent will be 0, because var1 was adjusted  */
   4686         /* appropriately.]  */
   4687         Int postshift;                       /* work  */
   4688         Flag wasodd=0;                       /* integer was odd  */
   4689         Unit *quotlsu;                       /* for save  */
   4690         Int  quotdigits;                     /* ..  */
   4691 
   4692         bits=lhs->bits;                      /* remainder sign is always as lhs  */
   4693 
   4694         /* Fastpath when residue is truly 0 is worthwhile [and  */
   4695         /* simplifies the code below]  */
   4696         if (*var1==0 && var1units==1) {      /* residue is 0  */
   4697           Int exp=lhs->exponent;             /* save min(exponents)  */
   4698           if (rhs->exponent<exp) exp=rhs->exponent;
   4699           uprv_decNumberZero(res);                /* 0 coefficient  */
   4700           #if DECSUBSET
   4701           if (set->extended)
   4702           #endif
   4703           res->exponent=exp;                 /* .. with proper exponent  */
   4704           res->bits=(uByte)(bits&DECNEG);          /* [cleaned]  */
   4705           decFinish(res, set, &residue, status);   /* might clamp  */
   4706           break;
   4707           }
   4708         /* note if the quotient was odd  */
   4709         if (*accnext & 0x01) wasodd=1;       /* acc is odd  */
   4710         quotlsu=accnext;                     /* save in case need to reinspect  */
   4711         quotdigits=accdigits;                /* ..  */
   4712 
   4713         /* treat the residue, in var1, as the value to return, via acc  */
   4714         /* calculate the unused zero digits.  This is the smaller of:  */
   4715         /*   var1 initial padding (saved above)  */
   4716         /*   var2 residual padding, which happens to be given by:  */
   4717         postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
   4718         /* [the 'exponent' term accounts for the shifts during divide]  */
   4719         if (var1initpad<postshift) postshift=var1initpad;
   4720 
   4721         /* shift var1 the requested amount, and adjust its digits  */
   4722         var1units=decShiftToLeast(var1, var1units, postshift);
   4723         accnext=var1;
   4724         accdigits=decGetDigits(var1, var1units);
   4725         accunits=D2U(accdigits);
   4726 
   4727         exponent=lhs->exponent;         /* exponent is smaller of lhs & rhs  */
   4728         if (rhs->exponent<exponent) exponent=rhs->exponent;
   4729 
   4730         /* Now correct the result if doing remainderNear; if it  */
   4731         /* (looking just at coefficients) is > rhs/2, or == rhs/2 and  */
   4732         /* the integer was odd then the result should be rem-rhs.  */
   4733         if (op&REMNEAR) {
   4734           Int compare, tarunits;        /* work  */
   4735           Unit *up;                     /* ..  */
   4736           /* calculate remainder*2 into the var1 buffer (which has  */
   4737           /* 'headroom' of an extra unit and hence enough space)  */
   4738           /* [a dedicated 'double' loop would be faster, here]  */
   4739           tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
   4740                                  0, accnext, 1);
   4741           /* decDumpAr('r', accnext, tarunits);  */
   4742 
   4743           /* Here, accnext (var1) holds tarunits Units with twice the  */
   4744           /* remainder's coefficient, which must now be compared to the  */
   4745           /* RHS.  The remainder's exponent may be smaller than the RHS's.  */
   4746           compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
   4747                                  rhs->exponent-exponent);
   4748           if (compare==BADINT) {             /* deep trouble  */
   4749             *status|=DEC_Insufficient_storage;
   4750             break;}
   4751 
   4752           /* now restore the remainder by dividing by two; the lsu  */
   4753           /* is known to be even.  */
   4754           for (up=accnext; up<accnext+tarunits; up++) {
   4755             Int half;              /* half to add to lower unit  */
   4756             half=*up & 0x01;
   4757             *up/=2;                /* [shift]  */
   4758             if (!half) continue;
   4759             *(up-1)+=(DECDPUNMAX+1)/2;
   4760             }
   4761           /* [accunits still describes the original remainder length]  */
   4762 
   4763           if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed  */
   4764             Int exp, expunits, exprem;       /* work  */
   4765             /* This is effectively causing round-up of the quotient,  */
   4766             /* so if it was the rare case where it was full and all  */
   4767             /* nines, it would overflow and hence division-impossible  */
   4768             /* should be raised  */
   4769             Flag allnines=0;                 /* 1 if quotient all nines  */
   4770             if (quotdigits==reqdigits) {     /* could be borderline  */
   4771               for (up=quotlsu; ; up++) {
   4772                 if (quotdigits>DECDPUN) {
   4773                   if (*up!=DECDPUNMAX) break;/* non-nines  */
   4774                   }
   4775                  else {                      /* this is the last Unit  */
   4776                   if (*up==powers[quotdigits]-1) allnines=1;
   4777                   break;
   4778                   }
   4779                 quotdigits-=DECDPUN;         /* checked those digits  */
   4780                 } /* up  */
   4781               } /* borderline check  */
   4782             if (allnines) {
   4783               *status|=DEC_Division_impossible;
   4784               break;}
   4785 
   4786             /* rem-rhs is needed; the sign will invert.  Again, var1  */
   4787             /* can safely be used for the working Units array.  */
   4788             exp=rhs->exponent-exponent;      /* RHS padding needed  */
   4789             /* Calculate units and remainder from exponent.  */
   4790             expunits=exp/DECDPUN;
   4791             exprem=exp%DECDPUN;
   4792             /* subtract [A+B*(-m)]; the result will always be negative  */
   4793             accunits=-decUnitAddSub(accnext, accunits,
   4794                                     rhs->lsu, D2U(rhs->digits),
   4795                                     expunits, accnext, -(Int)powers[exprem]);
   4796             accdigits=decGetDigits(accnext, accunits); /* count digits exactly  */
   4797             accunits=D2U(accdigits);    /* and recalculate the units for copy  */
   4798             /* [exponent is as for original remainder]  */
   4799             bits^=DECNEG;               /* flip the sign  */
   4800             }
   4801           } /* REMNEAR  */
   4802         } /* REMAINDER or REMNEAR  */
   4803       } /* not DIVIDE  */
   4804 
   4805     /* Set exponent and bits  */
   4806     res->exponent=exponent;
   4807     res->bits=(uByte)(bits&DECNEG);          /* [cleaned]  */
   4808 
   4809     /* Now the coefficient.  */
   4810     decSetCoeff(res, set, accnext, accdigits, &residue, status);
   4811 
   4812     decFinish(res, set, &residue, status);   /* final cleanup  */
   4813 
   4814     #if DECSUBSET
   4815     /* If a divide then strip trailing zeros if subset [after round]  */
   4816     if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, 1, &dropped);
   4817     #endif
   4818     } while(0);                              /* end protected  */
   4819 
   4820   if (varalloc!=NULL) free(varalloc);   /* drop any storage used  */
   4821   if (allocacc!=NULL) free(allocacc);   /* ..  */
   4822   #if DECSUBSET
   4823   if (allocrhs!=NULL) free(allocrhs);   /* ..  */
   4824   if (alloclhs!=NULL) free(alloclhs);   /* ..  */
   4825   #endif
   4826   return res;
   4827   } /* decDivideOp  */
   4828 
   4829 /* ------------------------------------------------------------------ */
   4830 /* decMultiplyOp -- multiplication operation                          */
   4831 /*                                                                    */
   4832 /*  This routine performs the multiplication C=A x B.                 */
   4833 /*                                                                    */
   4834 /*   res is C, the result.  C may be A and/or B (e.g., X=X*X)         */
   4835 /*   lhs is A                                                         */
   4836 /*   rhs is B                                                         */
   4837 /*   set is the context                                               */
   4838 /*   status is the usual accumulator                                  */
   4839 /*                                                                    */
   4840 /* C must have space for set->digits digits.                          */
   4841 /*                                                                    */
   4842 /* ------------------------------------------------------------------ */
   4843 /* 'Classic' multiplication is used rather than Karatsuba, as the     */
   4844 /* latter would give only a minor improvement for the short numbers   */
   4845 /* expected to be handled most (and uses much more memory).           */
   4846 /*                                                                    */
   4847 /* There are two major paths here: the general-purpose ('old code')   */
   4848 /* path which handles all DECDPUN values, and a fastpath version      */
   4849 /* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
   4850 /* than two calls to decUnitAddSub would be made.                     */
   4851 /*                                                                    */
   4852 /* The fastpath version lumps units together into 8-digit or 9-digit  */
   4853 /* chunks, and also uses a lazy carry strategy to minimise expensive  */
   4854 /* 64-bit divisions.  The chunks are then broken apart again into     */
   4855 /* units for continuing processing.  Despite this overhead, the       */
   4856 /* fastpath can speed up some 16-digit operations by 10x (and much    */
   4857 /* more for higher-precision calculations).                           */
   4858 /*                                                                    */
   4859 /* A buffer always has to be used for the accumulator; in the         */
   4860 /* fastpath, buffers are also always needed for the chunked copies of */
   4861 /* of the operand coefficients.                                       */
   4862 /* Static buffers are larger than needed just for multiply, to allow  */
   4863 /* for calls from other operations (notably exp).                     */
   4864 /* ------------------------------------------------------------------ */
   4865 #define FASTMUL (DECUSE64 && DECDPUN<5)
   4866 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
   4867                                  const decNumber *rhs, decContext *set,
   4868                                  uInt *status) {
   4869   Int    accunits;                 /* Units of accumulator in use  */
   4870   Int    exponent;                 /* work  */
   4871   Int    residue=0;                /* rounding residue  */
   4872   uByte  bits;                     /* result sign  */
   4873   Unit  *acc;                      /* -> accumulator Unit array  */
   4874   Int    needbytes;                /* size calculator  */
   4875   void  *allocacc=NULL;            /* -> allocated accumulator, iff allocated  */
   4876   Unit  accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0,  */
   4877                                    /* *4 for calls from other operations)  */
   4878   const Unit *mer, *mermsup;       /* work  */
   4879   Int   madlength;                 /* Units in multiplicand  */
   4880   Int   shift;                     /* Units to shift multiplicand by  */
   4881 
   4882   #if FASTMUL
   4883     /* if DECDPUN is 1 or 3 work in base 10**9, otherwise  */
   4884     /* (DECDPUN is 2 or 4) then work in base 10**8  */
   4885     #if DECDPUN & 1                /* odd  */
   4886       #define FASTBASE 1000000000  /* base  */
   4887       #define FASTDIGS          9  /* digits in base  */
   4888       #define FASTLAZY         18  /* carry resolution point [1->18]  */
   4889     #else
   4890       #define FASTBASE  100000000
   4891       #define FASTDIGS          8
   4892       #define FASTLAZY       1844  /* carry resolution point [1->1844]  */
   4893     #endif
   4894     /* three buffers are used, two for chunked copies of the operands  */
   4895     /* (base 10**8 or base 10**9) and one base 2**64 accumulator with  */
   4896     /* lazy carry evaluation  */
   4897     uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0)  */
   4898     uInt  *zlhi=zlhibuff;                 /* -> lhs array  */
   4899     uInt  *alloclhi=NULL;                 /* -> allocated buffer, iff allocated  */
   4900     uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0)  */
   4901     uInt  *zrhi=zrhibuff;                 /* -> rhs array  */
   4902     uInt  *allocrhi=NULL;                 /* -> allocated buffer, iff allocated  */
   4903     uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0)  */
   4904     /* [allocacc is shared for both paths, as only one will run]  */
   4905     uLong *zacc=zaccbuff;          /* -> accumulator array for exact result  */
   4906     #if DECDPUN==1
   4907     Int    zoff;                   /* accumulator offset  */
   4908     #endif
   4909     uInt  *lip, *rip;              /* item pointers  */
   4910     uInt  *lmsi, *rmsi;            /* most significant items  */
   4911     Int    ilhs, irhs, iacc;       /* item counts in the arrays  */
   4912     Int    lazy;                   /* lazy carry counter  */
   4913     uLong  lcarry;                 /* uLong carry  */
   4914     uInt   carry;                  /* carry (NB not uLong)  */
   4915     Int    count;                  /* work  */
   4916     const  Unit *cup;              /* ..  */
   4917     Unit  *up;                     /* ..  */
   4918     uLong *lp;                     /* ..  */
   4919     Int    p;                      /* ..  */
   4920   #endif
   4921 
   4922   #if DECSUBSET
   4923     decNumber *alloclhs=NULL;      /* -> allocated buffer, iff allocated  */
   4924     decNumber *allocrhs=NULL;      /* -> allocated buffer, iff allocated  */
   4925   #endif
   4926 
   4927   #if DECCHECK
   4928   if (decCheckOperands(res, lhs, rhs, set)) return res;
   4929   #endif
   4930 
   4931   /* precalculate result sign  */
   4932   bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
   4933 
   4934   /* handle infinities and NaNs  */
   4935   if (SPECIALARGS) {               /* a special bit set  */
   4936     if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs  */
   4937       decNaNs(res, lhs, rhs, set, status);
   4938       return res;}
   4939     /* one or two infinities; Infinity * 0 is invalid  */
   4940     if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
   4941       ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
   4942       *status|=DEC_Invalid_operation;
   4943       return res;}
   4944     uprv_decNumberZero(res);
   4945     res->bits=bits|DECINF;         /* infinity  */
   4946     return res;}
   4947 
   4948   /* For best speed, as in DMSRCN [the original Rexx numerics  */
   4949   /* module], use the shorter number as the multiplier (rhs) and  */
   4950   /* the longer as the multiplicand (lhs) to minimise the number of  */
   4951   /* adds (partial products)  */
   4952   if (lhs->digits<rhs->digits) {   /* swap...  */
   4953     const decNumber *hold=lhs;
   4954     lhs=rhs;
   4955     rhs=hold;
   4956     }
   4957 
   4958   do {                             /* protect allocated storage  */
   4959     #if DECSUBSET
   4960     if (!set->extended) {
   4961       /* reduce operands and set lostDigits status, as needed  */
   4962       if (lhs->digits>set->digits) {
   4963         alloclhs=decRoundOperand(lhs, set, status);
   4964         if (alloclhs==NULL) break;
   4965         lhs=alloclhs;
   4966         }
   4967       if (rhs->digits>set->digits) {
   4968         allocrhs=decRoundOperand(rhs, set, status);
   4969         if (allocrhs==NULL) break;
   4970         rhs=allocrhs;
   4971         }
   4972       }
   4973     #endif
   4974     /* [following code does not require input rounding]  */
   4975 
   4976     #if FASTMUL                    /* fastpath can be used  */
   4977     /* use the fast path if there are enough digits in the shorter  */
   4978     /* operand to make the setup and takedown worthwhile  */
   4979     #define NEEDTWO (DECDPUN*2)    /* within two decUnitAddSub calls  */
   4980     if (rhs->digits>NEEDTWO) {     /* use fastpath...  */
   4981       /* calculate the number of elements in each array  */
   4982       ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling]  */
   4983       irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* ..  */
   4984       iacc=ilhs+irhs;
   4985 
   4986       /* allocate buffers if required, as usual  */
   4987       needbytes=ilhs*sizeof(uInt);
   4988       if (needbytes>(Int)sizeof(zlhibuff)) {
   4989         alloclhi=(uInt *)malloc(needbytes);
   4990         zlhi=alloclhi;}
   4991       needbytes=irhs*sizeof(uInt);
   4992       if (needbytes>(Int)sizeof(zrhibuff)) {
   4993         allocrhi=(uInt *)malloc(needbytes);
   4994         zrhi=allocrhi;}
   4995 
   4996       /* Allocating the accumulator space needs a special case when  */
   4997       /* DECDPUN=1 because when converting the accumulator to Units  */
   4998       /* after the multiplication each 8-byte item becomes 9 1-byte  */
   4999       /* units.  Therefore iacc extra bytes are needed at the front  */
   5000       /* (rounded up to a multiple of 8 bytes), and the uLong  */
   5001       /* accumulator starts offset the appropriate number of units  */
   5002       /* to the right to avoid overwrite during the unchunking.  */
   5003 
   5004       /* Make sure no signed int overflow below. This is always true */
   5005       /* if the given numbers have less digits than DEC_MAX_DIGITS. */
   5006       U_ASSERT(iacc <= INT32_MAX/sizeof(uLong));
   5007       needbytes=iacc*sizeof(uLong);
   5008       #if DECDPUN==1
   5009       zoff=(iacc+7)/8;        /* items to offset by  */
   5010       needbytes+=zoff*8;
   5011       #endif
   5012       if (needbytes>(Int)sizeof(zaccbuff)) {
   5013         allocacc=(uLong *)malloc(needbytes);
   5014         zacc=(uLong *)allocacc;}
   5015       if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
   5016         *status|=DEC_Insufficient_storage;
   5017         break;}
   5018 
   5019       acc=(Unit *)zacc;       /* -> target Unit array  */
   5020       #if DECDPUN==1
   5021       zacc+=zoff;             /* start uLong accumulator to right  */
   5022       #endif
   5023 
   5024       /* assemble the chunked copies of the left and right sides  */
   5025       for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
   5026         for (p=0, *lip=0; p<FASTDIGS && count>0;
   5027              p+=DECDPUN, cup++, count-=DECDPUN)
   5028           *lip+=*cup*powers[p];
   5029       lmsi=lip-1;     /* save -> msi  */
   5030       for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
   5031         for (p=0, *rip=0; p<FASTDIGS && count>0;
   5032              p+=DECDPUN, cup++, count-=DECDPUN)
   5033           *rip+=*cup*powers[p];
   5034       rmsi=rip-1;     /* save -> msi  */
   5035 
   5036       /* zero the accumulator  */
   5037       for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
   5038 
   5039       /* Start the multiplication */
   5040       /* Resolving carries can dominate the cost of accumulating the  */
   5041       /* partial products, so this is only done when necessary.  */
   5042       /* Each uLong item in the accumulator can hold values up to  */
   5043       /* 2**64-1, and each partial product can be as large as  */
   5044       /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to  */
   5045       /* itself 18.4 times in a uLong without overflowing, so during  */
   5046       /* the main calculation resolution is carried out every 18th  */
   5047       /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the  */
   5048       /* partial products can be added to themselves 1844.6 times in  */
   5049       /* a uLong without overflowing, so intermediate carry  */
   5050       /* resolution occurs only every 14752 digits.  Hence for common  */
   5051       /* short numbers usually only the one final carry resolution  */
   5052       /* occurs.  */
   5053       /* (The count is set via FASTLAZY to simplify experiments to  */
   5054       /* measure the value of this approach: a 35% improvement on a  */
   5055       /* [34x34] multiply.)  */
   5056       lazy=FASTLAZY;                         /* carry delay count  */
   5057       for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs  */
   5058         lp=zacc+(rip-zrhi);                  /* where to add the lhs  */
   5059         for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs  */
   5060           *lp+=(uLong)(*lip)*(*rip);         /* [this should in-line]  */
   5061           } /* lip loop  */
   5062         lazy--;
   5063         if (lazy>0 && rip!=rmsi) continue;
   5064         lazy=FASTLAZY;                       /* reset delay count  */
   5065         /* spin up the accumulator resolving overflows  */
   5066         for (lp=zacc; lp<zacc+iacc; lp++) {
   5067           if (*lp<FASTBASE) continue;        /* it fits  */
   5068           lcarry=*lp/FASTBASE;               /* top part [slow divide]  */
   5069           /* lcarry can exceed 2**32-1, so check again; this check  */
   5070           /* and occasional extra divide (slow) is well worth it, as  */
   5071           /* it allows FASTLAZY to be increased to 18 rather than 4  */
   5072           /* in the FASTDIGS=9 case  */
   5073           if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual]  */
   5074            else { /* two-place carry [fairly rare]  */
   5075             uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part  */
   5076             *(lp+2)+=carry2;                        /* add to item+2  */
   5077             *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow]  */
   5078             carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline]  */
   5079             }
   5080           *(lp+1)+=carry;                    /* add to item above [inline]  */
   5081           *lp-=((uLong)FASTBASE*carry);      /* [inline]  */
   5082           } /* carry resolution  */
   5083         } /* rip loop  */
   5084 
   5085       /* The multiplication is complete; time to convert back into  */
   5086       /* units.  This can be done in-place in the accumulator and in  */
   5087       /* 32-bit operations, because carries were resolved after the  */
   5088       /* final add.  This needs N-1 divides and multiplies for  */
   5089       /* each item in the accumulator (which will become up to N  */
   5090       /* units, where 2<=N<=9).  */
   5091       for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
   5092         uInt item=(uInt)*lp;                 /* decapitate to uInt  */
   5093         for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
   5094           uInt part=item/(DECDPUNMAX+1);
   5095           *up=(Unit)(item-(part*(DECDPUNMAX+1)));
   5096           item=part;
   5097           } /* p  */
   5098         *up=(Unit)item; up++;                /* [final needs no division]  */
   5099         } /* lp  */
   5100       accunits=up-acc;                       /* count of units  */
   5101       }
   5102      else { /* here to use units directly, without chunking ['old code']  */
   5103     #endif
   5104 
   5105       /* if accumulator will be too long for local storage, then allocate  */
   5106       acc=accbuff;                 /* -> assume buffer for accumulator  */
   5107       needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
   5108       if (needbytes>(Int)sizeof(accbuff)) {
   5109         allocacc=(Unit *)malloc(needbytes);
   5110         if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
   5111         acc=(Unit *)allocacc;                /* use the allocated space  */
   5112         }
   5113 
   5114       /* Now the main long multiplication loop */
   5115       /* Unlike the equivalent in the IBM Java implementation, there  */
   5116       /* is no advantage in calculating from msu to lsu.  So, do it  */
   5117       /* by the book, as it were.  */
   5118       /* Each iteration calculates ACC=ACC+MULTAND*MULT  */
   5119       accunits=1;                  /* accumulator starts at '0'  */
   5120       *acc=0;                      /* .. (lsu=0)  */
   5121       shift=0;                     /* no multiplicand shift at first  */
   5122       madlength=D2U(lhs->digits);  /* this won't change  */
   5123       mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier  */
   5124 
   5125       for (mer=rhs->lsu; mer<mermsup; mer++) {
   5126         /* Here, *mer is the next Unit in the multiplier to use  */
   5127         /* If non-zero [optimization] add it...  */
   5128         if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
   5129                                             lhs->lsu, madlength, 0,
   5130                                             &acc[shift], *mer)
   5131                                             + shift;
   5132          else { /* extend acc with a 0; it will be used shortly  */
   5133           *(acc+accunits)=0;       /* [this avoids length of <=0 later]  */
   5134           accunits++;
   5135           }
   5136         /* multiply multiplicand by 10**DECDPUN for next Unit to left  */
   5137         shift++;                   /* add this for 'logical length'  */
   5138         } /* n  */
   5139     #if FASTMUL
   5140       } /* unchunked units  */
   5141     #endif
   5142     /* common end-path  */
   5143     #if DECTRACE
   5144       decDumpAr('*', acc, accunits);         /* Show exact result  */
   5145     #endif
   5146 
   5147     /* acc now contains the exact result of the multiplication,  */
   5148     /* possibly with a leading zero unit; build the decNumber from  */
   5149     /* it, noting if any residue  */
   5150     res->bits=bits;                          /* set sign  */
   5151     res->digits=decGetDigits(acc, accunits); /* count digits exactly  */
   5152 
   5153     /* There can be a 31-bit wrap in calculating the exponent.  */
   5154     /* This can only happen if both input exponents are negative and  */
   5155     /* both their magnitudes are large.  If there was a wrap, set a  */
   5156     /* safe very negative exponent, from which decFinalize() will  */
   5157     /* raise a hard underflow shortly.  */
   5158     exponent=lhs->exponent+rhs->exponent;    /* calculate exponent  */
   5159     if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
   5160       exponent=-2*DECNUMMAXE;                /* force underflow  */
   5161     res->exponent=exponent;                  /* OK to overwrite now  */
   5162 
   5163 
   5164     /* Set the coefficient.  If any rounding, residue records  */
   5165     decSetCoeff(res, set, acc, res->digits, &residue, status);
   5166     decFinish(res, set, &residue, status);   /* final cleanup  */
   5167     } while(0);                         /* end protected  */
   5168 
   5169   if (allocacc!=NULL) free(allocacc);   /* drop any storage used  */
   5170   #if DECSUBSET
   5171   if (allocrhs!=NULL) free(allocrhs);   /* ..  */
   5172   if (alloclhs!=NULL) free(alloclhs);   /* ..  */
   5173   #endif
   5174   #if FASTMUL
   5175   if (allocrhi!=NULL) free(allocrhi);   /* ..  */
   5176   if (alloclhi!=NULL) free(alloclhi);   /* ..  */
   5177   #endif
   5178   return res;
   5179   } /* decMultiplyOp  */
   5180 
   5181 /* ------------------------------------------------------------------ */
   5182 /* decExpOp -- effect exponentiation                                  */
   5183 /*                                                                    */
   5184 /*   This computes C = exp(A)                                         */
   5185 /*                                                                    */
   5186 /*   res is C, the result.  C may be A                                */
   5187 /*   rhs is A                                                         */
   5188 /*   set is the context; note that rounding mode has no effect        */
   5189 /*                                                                    */
   5190 /* C must have space for set->digits digits. status is updated but    */
   5191 /* not set.                                                           */
   5192 /*                                                                    */
   5193 /* Restrictions:                                                      */
   5194 /*                                                                    */
   5195 /*   digits, emax, and -emin in the context must be less than         */
   5196 /*   2*DEC_MAX_MATH (1999998), and the rhs must be within these       */
   5197 /*   bounds or a zero.  This is an internal routine, so these         */
   5198 /*   restrictions are contractual and not enforced.                   */
   5199 /*                                                                    */
   5200 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5201 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5202 /* error in rare cases.                                               */
   5203 /*                                                                    */
   5204 /* Finite results will always be full precision and Inexact, except   */
   5205 /* when A is a zero or -Infinity (giving 1 or 0 respectively).        */
   5206 /* ------------------------------------------------------------------ */
   5207 /* This approach used here is similar to the algorithm described in   */
   5208 /*                                                                    */
   5209 /*   Variable Precision Exponential Function, T. E. Hull and          */
   5210 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
   5211 /*   pp79-91, ACM, June 1986.                                         */
   5212 /*                                                                    */
   5213 /* with the main difference being that the iterations in the series   */
   5214 /* evaluation are terminated dynamically (which does not require the  */
   5215 /* extra variable-precision variables which are expensive in this     */
   5216 /* context).                                                          */
   5217 /*                                                                    */
   5218 /* The error analysis in Hull & Abrham's paper applies except for the */
   5219 /* round-off error accumulation during the series evaluation.  This   */
   5220 /* code does not precalculate the number of iterations and so cannot  */
   5221 /* use Horner's scheme.  Instead, the accumulation is done at double- */
   5222 /* precision, which ensures that the additions of the terms are exact */
   5223 /* and do not accumulate round-off (and any round-off errors in the   */
   5224 /* terms themselves move 'to the right' faster than they can          */
   5225 /* accumulate).  This code also extends the calculation by allowing,  */
   5226 /* in the spirit of other decNumber operators, the input to be more   */
   5227 /* precise than the result (the precision used is based on the more   */
   5228 /* precise of the input or requested result).                         */
   5229 /*                                                                    */
   5230 /* Implementation notes:                                              */
   5231 /*                                                                    */
   5232 /* 1. This is separated out as decExpOp so it can be called from      */
   5233 /*    other Mathematical functions (notably Ln) with a wider range    */
   5234 /*    than normal.  In particular, it can handle the slightly wider   */
   5235 /*    (double) range needed by Ln (which has to be able to calculate  */
   5236 /*    exp(-x) where x can be the tiniest number (Ntiny).              */
   5237 /*                                                                    */
   5238 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop         */
   5239 /*    iterations by appoximately a third with additional (although    */
   5240 /*    diminishing) returns as the range is reduced to even smaller    */
   5241 /*    fractions.  However, h (the power of 10 used to correct the     */
   5242 /*    result at the end, see below) must be kept <=8 as otherwise     */
   5243 /*    the final result cannot be computed.  Hence the leverage is a   */
   5244 /*    sliding value (8-h), where potentially the range is reduced     */
   5245 /*    more for smaller values.                                        */
   5246 /*                                                                    */
   5247 /*    The leverage that can be applied in this way is severely        */
   5248 /*    limited by the cost of the raise-to-the power at the end,       */
   5249 /*    which dominates when the number of iterations is small (less    */
   5250 /*    than ten) or when rhs is short.  As an example, the adjustment  */
   5251 /*    x**10,000,000 needs 31 multiplications, all but one full-width. */
   5252 /*                                                                    */
   5253 /* 3. The restrictions (especially precision) could be raised with    */
   5254 /*    care, but the full decNumber range seems very hard within the   */
   5255 /*    32-bit limits.                                                  */
   5256 /*                                                                    */
   5257 /* 4. The working precisions for the static buffers are twice the     */
   5258 /*    obvious size to allow for calls from decNumberPower.            */
   5259 /* ------------------------------------------------------------------ */
   5260 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
   5261                          decContext *set, uInt *status) {
   5262   uInt ignore=0;                   /* working status  */
   5263   Int h;                           /* adjusted exponent for 0.xxxx  */
   5264   Int p;                           /* working precision  */
   5265   Int residue;                     /* rounding residue  */
   5266   uInt needbytes;                  /* for space calculations  */
   5267   const decNumber *x=rhs;          /* (may point to safe copy later)  */
   5268   decContext aset, tset, dset;     /* working contexts  */
   5269   Int comp;                        /* work  */
   5270 
   5271   /* the argument is often copied to normalize it, so (unusually) it  */
   5272   /* is treated like other buffers, using DECBUFFER, +1 in case  */
   5273   /* DECBUFFER is 0  */
   5274   decNumber bufr[D2N(DECBUFFER*2+1)];
   5275   decNumber *allocrhs=NULL;        /* non-NULL if rhs buffer allocated  */
   5276 
   5277   /* the working precision will be no more than set->digits+8+1  */
   5278   /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER  */
   5279   /* is 0 (and twice that for the accumulator)  */
   5280 
   5281   /* buffer for t, term (working precision plus)  */
   5282   decNumber buft[D2N(DECBUFFER*2+9+1)];
   5283   decNumber *allocbuft=NULL;       /* -> allocated buft, iff allocated  */
   5284   decNumber *t=buft;               /* term  */
   5285   /* buffer for a, accumulator (working precision * 2), at least 9  */
   5286   decNumber bufa[D2N(DECBUFFER*4+18+1)];
   5287   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
   5288   decNumber *a=bufa;               /* accumulator  */
   5289   /* decNumber for the divisor term; this needs at most 9 digits  */
   5290   /* and so can be fixed size [16 so can use standard context]  */
   5291   decNumber bufd[D2N(16)];
   5292   decNumber *d=bufd;               /* divisor  */
   5293   decNumber numone;                /* constant 1  */
   5294 
   5295   #if DECCHECK
   5296   Int iterations=0;                /* for later sanity check  */
   5297   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5298   #endif
   5299 
   5300   do {                                  /* protect allocated storage  */
   5301     if (SPECIALARG) {                   /* handle infinities and NaNs  */
   5302       if (decNumberIsInfinite(rhs)) {   /* an infinity  */
   5303         if (decNumberIsNegative(rhs))   /* -Infinity -> +0  */
   5304           uprv_decNumberZero(res);
   5305          else uprv_decNumberCopy(res, rhs);  /* +Infinity -> self  */
   5306         }
   5307        else decNaNs(res, rhs, NULL, set, status); /* a NaN  */
   5308       break;}
   5309 
   5310     if (ISZERO(rhs)) {                  /* zeros -> exact 1  */
   5311       uprv_decNumberZero(res);               /* make clean 1  */
   5312       *res->lsu=1;                      /* ..  */
   5313       break;}                           /* [no status to set]  */
   5314 
   5315     /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path  */
   5316     /* positive and negative tiny cases which will result in inexact  */
   5317     /* 1.  This also allows the later add-accumulate to always be  */
   5318     /* exact (because its length will never be more than twice the  */
   5319     /* working precision).  */
   5320     /* The comparator (tiny) needs just one digit, so use the  */
   5321     /* decNumber d for it (reused as the divisor, etc., below); its  */
   5322     /* exponent is such that if x is positive it will have  */
   5323     /* set->digits-1 zeros between the decimal point and the digit,  */
   5324     /* which is 4, and if x is negative one more zero there as the  */
   5325     /* more precise result will be of the form 0.9999999 rather than  */
   5326     /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0  */
   5327     /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than  */
   5328     /* this then the result will be 1.000000  */
   5329     uprv_decNumberZero(d);                   /* clean  */
   5330     *d->lsu=4;                          /* set 4 ..  */
   5331     d->exponent=-set->digits;           /* * 10**(-d)  */
   5332     if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case  */
   5333     comp=decCompare(d, rhs, 1);         /* signless compare  */
   5334     if (comp==BADINT) {
   5335       *status|=DEC_Insufficient_storage;
   5336       break;}
   5337     if (comp>=0) {                      /* rhs < d  */
   5338       Int shift=set->digits-1;
   5339       uprv_decNumberZero(res);               /* set 1  */
   5340       *res->lsu=1;                      /* ..  */
   5341       res->digits=decShiftToMost(res->lsu, 1, shift);
   5342       res->exponent=-shift;                  /* make 1.0000...  */
   5343       *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly  */
   5344       break;} /* tiny  */
   5345 
   5346     /* set up the context to be used for calculating a, as this is  */
   5347     /* used on both paths below  */
   5348     uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64);
   5349     /* accumulator bounds are as requested (could underflow)  */
   5350     aset.emax=set->emax;                /* usual bounds  */
   5351     aset.emin=set->emin;                /* ..  */
   5352     aset.clamp=0;                       /* and no concrete format  */
   5353 
   5354     /* calculate the adjusted (Hull & Abrham) exponent (where the  */
   5355     /* decimal point is just to the left of the coefficient msd)  */
   5356     h=rhs->exponent+rhs->digits;
   5357     /* if h>8 then 10**h cannot be calculated safely; however, when  */
   5358     /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at  */
   5359     /* least 6.59E+4342944, so (due to the restriction on Emax/Emin)  */
   5360     /* overflow (or underflow to 0) is guaranteed -- so this case can  */
   5361     /* be handled by simply forcing the appropriate excess  */
   5362     if (h>8) {                          /* overflow/underflow  */
   5363       /* set up here so Power call below will over or underflow to  */
   5364       /* zero; set accumulator to either 2 or 0.02  */
   5365       /* [stack buffer for a is always big enough for this]  */
   5366       uprv_decNumberZero(a);
   5367       *a->lsu=2;                        /* not 1 but < exp(1)  */
   5368       if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02  */
   5369       h=8;                              /* clamp so 10**h computable  */
   5370       p=9;                              /* set a working precision  */
   5371       }
   5372      else {                             /* h<=8  */
   5373       Int maxlever=(rhs->digits>8?1:0);
   5374       /* [could/should increase this for precisions >40 or so, too]  */
   5375 
   5376       /* if h is 8, cannot normalize to a lower upper limit because  */
   5377       /* the final result will not be computable (see notes above),  */
   5378       /* but leverage can be applied whenever h is less than 8.  */
   5379       /* Apply as much as possible, up to a MAXLEVER digits, which  */
   5380       /* sets the tradeoff against the cost of the later a**(10**h).  */
   5381       /* As h is increased, the working precision below also  */
   5382       /* increases to compensate for the "constant digits at the  */
   5383       /* front" effect.  */
   5384       Int lever=MINI(8-h, maxlever);    /* leverage attainable  */
   5385       Int use=-rhs->digits-lever;       /* exponent to use for RHS  */
   5386       h+=lever;                         /* apply leverage selected  */
   5387       if (h<0) {                        /* clamp  */
   5388         use+=h;                         /* [may end up subnormal]  */
   5389         h=0;
   5390         }
   5391       /* Take a copy of RHS if it needs normalization (true whenever x>=1)  */
   5392       if (rhs->exponent!=use) {
   5393         decNumber *newrhs=bufr;         /* assume will fit on stack  */
   5394         needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
   5395         if (needbytes>sizeof(bufr)) {   /* need malloc space  */
   5396           allocrhs=(decNumber *)malloc(needbytes);
   5397           if (allocrhs==NULL) {         /* hopeless -- abandon  */
   5398             *status|=DEC_Insufficient_storage;
   5399             break;}
   5400           newrhs=allocrhs;              /* use the allocated space  */
   5401           }
   5402         uprv_decNumberCopy(newrhs, rhs);     /* copy to safe space  */
   5403         newrhs->exponent=use;           /* normalize; now <1  */
   5404         x=newrhs;                       /* ready for use  */
   5405         /* decNumberShow(x);  */
   5406         }
   5407 
   5408       /* Now use the usual power series to evaluate exp(x).  The  */
   5409       /* series starts as 1 + x + x^2/2 ... so prime ready for the  */
   5410       /* third term by setting the term variable t=x, the accumulator  */
   5411       /* a=1, and the divisor d=2.  */
   5412 
   5413       /* First determine the working precision.  From Hull & Abrham  */
   5414       /* this is set->digits+h+2.  However, if x is 'over-precise' we  */
   5415       /* need to allow for all its digits to potentially participate  */
   5416       /* (consider an x where all the excess digits are 9s) so in  */
   5417       /* this case use x->digits+h+2  */
   5418       p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8]  */
   5419 
   5420       /* a and t are variable precision, and depend on p, so space  */
   5421       /* must be allocated for them if necessary  */
   5422 
   5423       /* the accumulator needs to be able to hold 2p digits so that  */
   5424       /* the additions on the second and subsequent iterations are  */
   5425       /* sufficiently exact.  */
   5426       needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
   5427       if (needbytes>sizeof(bufa)) {     /* need malloc space  */
   5428         allocbufa=(decNumber *)malloc(needbytes);
   5429         if (allocbufa==NULL) {          /* hopeless -- abandon  */
   5430           *status|=DEC_Insufficient_storage;
   5431           break;}
   5432         a=allocbufa;                    /* use the allocated space  */
   5433         }
   5434       /* the term needs to be able to hold p digits (which is  */
   5435       /* guaranteed to be larger than x->digits, so the initial copy  */
   5436       /* is safe); it may also be used for the raise-to-power  */
   5437       /* calculation below, which needs an extra two digits  */
   5438       needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
   5439       if (needbytes>sizeof(buft)) {     /* need malloc space  */
   5440         allocbuft=(decNumber *)malloc(needbytes);
   5441         if (allocbuft==NULL) {          /* hopeless -- abandon  */
   5442           *status|=DEC_Insufficient_storage;
   5443           break;}
   5444         t=allocbuft;                    /* use the allocated space  */
   5445         }
   5446 
   5447       uprv_decNumberCopy(t, x);              /* term=x  */
   5448       uprv_decNumberZero(a); *a->lsu=1;      /* accumulator=1  */
   5449       uprv_decNumberZero(d); *d->lsu=2;      /* divisor=2  */
   5450       uprv_decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment  */
   5451 
   5452       /* set up the contexts for calculating a, t, and d  */
   5453       uprv_decContextDefault(&tset, DEC_INIT_DECIMAL64);
   5454       dset=tset;
   5455       /* accumulator bounds are set above, set precision now  */
   5456       aset.digits=p*2;                  /* double  */
   5457       /* term bounds avoid any underflow or overflow  */
   5458       tset.digits=p;
   5459       tset.emin=DEC_MIN_EMIN;           /* [emax is plenty]  */
   5460       /* [dset.digits=16, etc., are sufficient]  */
   5461 
   5462       /* finally ready to roll  */
   5463       for (;;) {
   5464         #if DECCHECK
   5465         iterations++;
   5466         #endif
   5467         /* only the status from the accumulation is interesting  */
   5468         /* [but it should remain unchanged after first add]  */
   5469         decAddOp(a, a, t, &aset, 0, status);           /* a=a+t  */
   5470         decMultiplyOp(t, t, x, &tset, &ignore);        /* t=t*x  */
   5471         decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d  */
   5472         /* the iteration ends when the term cannot affect the result,  */
   5473         /* if rounded to p digits, which is when its value is smaller  */
   5474         /* than the accumulator by p+1 digits.  There must also be  */
   5475         /* full precision in a.  */
   5476         if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
   5477             && (a->digits>=p)) break;
   5478         decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1  */
   5479         } /* iterate  */
   5480 
   5481       #if DECCHECK
   5482       /* just a sanity check; comment out test to show always  */
   5483       if (iterations>p+3)
   5484         printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5485                (LI)iterations, (LI)*status, (LI)p, (LI)x->digits);
   5486       #endif
   5487       } /* h<=8  */
   5488 
   5489     /* apply postconditioning: a=a**(10**h) -- this is calculated  */
   5490     /* at a slightly higher precision than Hull & Abrham suggest  */
   5491     if (h>0) {
   5492       Int seenbit=0;               /* set once a 1-bit is seen  */
   5493       Int i;                       /* counter  */
   5494       Int n=powers[h];             /* always positive  */
   5495       aset.digits=p+2;             /* sufficient precision  */
   5496       /* avoid the overhead and many extra digits of decNumberPower  */
   5497       /* as all that is needed is the short 'multipliers' loop; here  */
   5498       /* accumulate the answer into t  */
   5499       uprv_decNumberZero(t); *t->lsu=1; /* acc=1  */
   5500       for (i=1;;i++){              /* for each bit [top bit ignored]  */
   5501         /* abandon if have had overflow or terminal underflow  */
   5502         if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting?  */
   5503           if (*status&DEC_Overflow || ISZERO(t)) break;}
   5504         n=n<<1;                    /* move next bit to testable position  */
   5505         if (n<0) {                 /* top bit is set  */
   5506           seenbit=1;               /* OK, have a significant bit  */
   5507           decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x  */
   5508           }
   5509         if (i==31) break;          /* that was the last bit  */
   5510         if (!seenbit) continue;    /* no need to square 1  */
   5511         decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square]  */
   5512         } /*i*/ /* 32 bits  */
   5513       /* decNumberShow(t);  */
   5514       a=t;                         /* and carry on using t instead of a  */
   5515       }
   5516 
   5517     /* Copy and round the result to res  */
   5518     residue=1;                          /* indicate dirt to right ..  */
   5519     if (ISZERO(a)) residue=0;           /* .. unless underflowed to 0  */
   5520     aset.digits=set->digits;            /* [use default rounding]  */
   5521     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten  */
   5522     decFinish(res, set, &residue, status);       /* cleanup/set flags  */
   5523     } while(0);                         /* end protected  */
   5524 
   5525   if (allocrhs !=NULL) free(allocrhs);  /* drop any storage used  */
   5526   if (allocbufa!=NULL) free(allocbufa); /* ..  */
   5527   if (allocbuft!=NULL) free(allocbuft); /* ..  */
   5528   /* [status is handled by caller]  */
   5529   return res;
   5530   } /* decExpOp  */
   5531 
   5532 /* ------------------------------------------------------------------ */
   5533 /* Initial-estimate natural logarithm table                           */
   5534 /*                                                                    */
   5535 /*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
   5536 /*           The result is a 4-digit encode of the coefficient (c=the */
   5537 /*           top 14 bits encoding 0-9999) and a 2-digit encode of the */
   5538 /*           exponent (e=the bottom 2 bits encoding 0-3)              */
   5539 /*                                                                    */
   5540 /*           The resulting value is given by:                         */
   5541 /*                                                                    */
   5542 /*             v = -c * 10**(-e-3)                                    */
   5543 /*                                                                    */
   5544 /*           where e and c are extracted from entry k = LNnn[x-10]    */
   5545 /*           where x is truncated (NB) into the range 10 through 99,  */
   5546 /*           and then c = k>>2 and e = k&3.                           */
   5547 /* ------------------------------------------------------------------ */
   5548 static const uShort LNnn[90]={9016,  8652,  8316,  8008,  7724,  7456,  7208,
   5549   6972,  6748,  6540,  6340,  6148,  5968,  5792,  5628,  5464,  5312,
   5550   5164,  5020,  4884,  4748,  4620,  4496,  4376,  4256,  4144,  4032,
   5551  39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
   5552  29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
   5553  22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
   5554  15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
   5555  10197,  9685,  9177,  8677,  8185,  7697,  7213,  6737,  6269,  5801,
   5556   5341,  4889,  4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
   5557  10130,  6046, 20055};
   5558 
   5559 /* ------------------------------------------------------------------ */
   5560 /* decLnOp -- effect natural logarithm                                */
   5561 /*                                                                    */
   5562 /*   This computes C = ln(A)                                          */
   5563 /*                                                                    */
   5564 /*   res is C, the result.  C may be A                                */
   5565 /*   rhs is A                                                         */
   5566 /*   set is the context; note that rounding mode has no effect        */
   5567 /*                                                                    */
   5568 /* C must have space for set->digits digits.                          */
   5569 /*                                                                    */
   5570 /* Notable cases:                                                     */
   5571 /*   A<0 -> Invalid                                                   */
   5572 /*   A=0 -> -Infinity (Exact)                                         */
   5573 /*   A=+Infinity -> +Infinity (Exact)                                 */
   5574 /*   A=1 exactly -> 0 (Exact)                                         */
   5575 /*                                                                    */
   5576 /* Restrictions (as for Exp):                                         */
   5577 /*                                                                    */
   5578 /*   digits, emax, and -emin in the context must be less than         */
   5579 /*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
   5580 /*   bounds or a zero.  This is an internal routine, so these         */
   5581 /*   restrictions are contractual and not enforced.                   */
   5582 /*                                                                    */
   5583 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
   5584 /* almost always be correctly rounded, but may be up to 1 ulp in      */
   5585 /* error in rare cases.                                               */
   5586 /* ------------------------------------------------------------------ */
   5587 /* The result is calculated using Newton's method, with each          */
   5588 /* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
   5589 /* Epperson 1989.                                                     */
   5590 /*                                                                    */
   5591 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
   5592 /* This has to be calculated at the sum of the precision of x and the */
   5593 /* working precision.                                                 */
   5594 /*                                                                    */
   5595 /* Implementation notes:                                              */
   5596 /*                                                                    */
   5597 /* 1. This is separated out as decLnOp so it can be called from       */
   5598 /*    other Mathematical functions (e.g., Log 10) with a wider range  */
   5599 /*    than normal.  In particular, it can handle the slightly wider   */
   5600 /*    (+9+2) range needed by a power function.                        */
   5601 /*                                                                    */
   5602 /* 2. The speed of this function is about 10x slower than exp, as     */
   5603 /*    it typically needs 4-6 iterations for short numbers, and the    */
   5604 /*    extra precision needed adds a squaring effect, twice.           */
   5605 /*                                                                    */
   5606 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
   5607 /*    as these are common requests.  ln(10) is used by log10(x).      */
   5608 /*                                                                    */
   5609 /* 4. An iteration might be saved by widening the LNnn table, and     */
   5610 /*    would certainly save at least one if it were made ten times     */
   5611 /*    bigger, too (for truncated fractions 0.100 through 0.999).      */
   5612 /*    However, for most practical evaluations, at least four or five  */
   5613 /*    iterations will be neede -- so this would only speed up by      */
   5614 /*    20-25% and that probably does not justify increasing the table  */
   5615 /*    size.                                                           */
   5616 /*                                                                    */
   5617 /* 5. The static buffers are larger than might be expected to allow   */
   5618 /*    for calls from decNumberPower.                                  */
   5619 /* ------------------------------------------------------------------ */
   5620 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   5621 #pragma GCC diagnostic push
   5622 #pragma GCC diagnostic ignored "-Warray-bounds"
   5623 #endif
   5624 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
   5625                     decContext *set, uInt *status) {
   5626   uInt ignore=0;                   /* working status accumulator  */
   5627   uInt needbytes;                  /* for space calculations  */
   5628   Int residue;                     /* rounding residue  */
   5629   Int r;                           /* rhs=f*10**r [see below]  */
   5630   Int p;                           /* working precision  */
   5631   Int pp;                          /* precision for iteration  */
   5632   Int t;                           /* work  */
   5633 
   5634   /* buffers for a (accumulator, typically precision+2) and b  */
   5635   /* (adjustment calculator, same size)  */
   5636   decNumber bufa[D2N(DECBUFFER+12)];
   5637   decNumber *allocbufa=NULL;       /* -> allocated bufa, iff allocated  */
   5638   decNumber *a=bufa;               /* accumulator/work  */
   5639   decNumber bufb[D2N(DECBUFFER*2+2)];
   5640   decNumber *allocbufb=NULL;       /* -> allocated bufa, iff allocated  */
   5641   decNumber *b=bufb;               /* adjustment/work  */
   5642 
   5643   decNumber  numone;               /* constant 1  */
   5644   decNumber  cmp;                  /* work  */
   5645   decContext aset, bset;           /* working contexts  */
   5646 
   5647   #if DECCHECK
   5648   Int iterations=0;                /* for later sanity check  */
   5649   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
   5650   #endif
   5651 
   5652   do {                                  /* protect allocated storage  */
   5653     if (SPECIALARG) {                   /* handle infinities and NaNs  */
   5654       if (decNumberIsInfinite(rhs)) {   /* an infinity  */
   5655         if (decNumberIsNegative(rhs))   /* -Infinity -> error  */
   5656           *status|=DEC_Invalid_operation;
   5657          else uprv_decNumberCopy(res, rhs);  /* +Infinity -> self  */
   5658         }
   5659        else decNaNs(res, rhs, NULL, set, status); /* a NaN  */
   5660       break;}
   5661 
   5662     if (ISZERO(rhs)) {                  /* +/- zeros -> -Infinity  */
   5663       uprv_decNumberZero(res);               /* make clean  */
   5664       res->bits=DECINF|DECNEG;          /* set - infinity  */
   5665       break;}                           /* [no status to set]  */
   5666 
   5667     /* Non-zero negatives are bad...  */
   5668     if (decNumberIsNegative(rhs)) {     /* -x -> error  */
   5669       *status|=DEC_Invalid_operation;
   5670       break;}
   5671 
   5672     /* Here, rhs is positive, finite, and in range  */
   5673 
   5674     /* lookaside fastpath code for ln(2) and ln(10) at common lengths  */
   5675     if (rhs->exponent==0 && set->digits<=40) {
   5676       #if DECDPUN==1
   5677       if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10)  */
   5678       #else
   5679       if (rhs->lsu[0]==10 && rhs->digits==2) {                  /* ln(10)  */
   5680       #endif
   5681         aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5682         #define LN10 "2.302585092994045684017991454684364207601"
   5683         uprv_decNumberFromString(res, LN10, &aset);
   5684         *status|=(DEC_Inexact | DEC_Rounded); /* is inexact  */
   5685         break;}
   5686       if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2)  */
   5687         aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
   5688         #define LN2 "0.6931471805599453094172321214581765680755"
   5689         uprv_decNumberFromString(res, LN2, &aset);
   5690         *status|=(DEC_Inexact | DEC_Rounded);
   5691         break;}
   5692       } /* integer and short  */
   5693 
   5694     /* Determine the working precision.  This is normally the  */
   5695     /* requested precision + 2, with a minimum of 9.  However, if  */
   5696     /* the rhs is 'over-precise' then allow for all its digits to  */
   5697     /* potentially participate (consider an rhs where all the excess  */
   5698     /* digits are 9s) so in this case use rhs->digits+2.  */
   5699     p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
   5700 
   5701     /* Allocate space for the accumulator and the high-precision  */
   5702     /* adjustment calculator, if necessary.  The accumulator must  */
   5703     /* be able to hold p digits, and the adjustment up to  */
   5704     /* rhs->digits+p digits.  They are also made big enough for 16  */
   5705     /* digits so that they can be used for calculating the initial  */
   5706     /* estimate.  */
   5707     needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
   5708     if (needbytes>sizeof(bufa)) {     /* need malloc space  */
   5709       allocbufa=(decNumber *)malloc(needbytes);
   5710       if (allocbufa==NULL) {          /* hopeless -- abandon  */
   5711         *status|=DEC_Insufficient_storage;
   5712         break;}
   5713       a=allocbufa;                    /* use the allocated space  */
   5714       }
   5715     pp=p+rhs->digits;
   5716     needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
   5717     if (needbytes>sizeof(bufb)) {     /* need malloc space  */
   5718       allocbufb=(decNumber *)malloc(needbytes);
   5719       if (allocbufb==NULL) {          /* hopeless -- abandon  */
   5720         *status|=DEC_Insufficient_storage;
   5721         break;}
   5722       b=allocbufb;                    /* use the allocated space  */
   5723       }
   5724 
   5725     /* Prepare an initial estimate in acc. Calculate this by  */
   5726     /* considering the coefficient of x to be a normalized fraction,  */
   5727     /* f, with the decimal point at far left and multiplied by  */
   5728     /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and  */
   5729     /*   ln(x) = ln(f) + ln(10)*r  */
   5730     /* Get the initial estimate for ln(f) from a small lookup  */
   5731     /* table (see above) indexed by the first two digits of f,  */
   5732     /* truncated.  */
   5733 
   5734     uprv_decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended  */
   5735     r=rhs->exponent+rhs->digits;        /* 'normalised' exponent  */
   5736     uprv_decNumberFromInt32(a, r);           /* a=r  */
   5737     uprv_decNumberFromInt32(b, 2302585);     /* b=ln(10) (2.302585)  */
   5738     b->exponent=-6;                     /*  ..  */
   5739     decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b  */
   5740     /* now get top two digits of rhs into b by simple truncate and  */
   5741     /* force to integer  */
   5742     residue=0;                          /* (no residue)  */
   5743     aset.digits=2; aset.round=DEC_ROUND_DOWN;
   5744     decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten  */
   5745     b->exponent=0;                      /* make integer  */
   5746     t=decGetInt(b);                     /* [cannot fail]  */
   5747     if (t<10) t=X10(t);                 /* adjust single-digit b  */
   5748     t=LNnn[t-10];                       /* look up ln(b)  */
   5749     uprv_decNumberFromInt32(b, t>>2);        /* b=ln(b) coefficient  */
   5750     b->exponent=-(t&3)-3;               /* set exponent  */
   5751     b->bits=DECNEG;                     /* ln(0.10)->ln(0.99) always -ve  */
   5752     aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore  */
   5753     decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b  */
   5754     /* the initial estimate is now in a, with up to 4 digits correct.  */
   5755     /* When rhs is at or near Nmax the estimate will be low, so we  */
   5756     /* will approach it from below, avoiding overflow when calling exp.  */
   5757 
   5758     uprv_decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment  */
   5759 
   5760     /* accumulator bounds are as requested (could underflow, but  */
   5761     /* cannot overflow)  */
   5762     aset.emax=set->emax;
   5763     aset.emin=set->emin;
   5764     aset.clamp=0;                       /* no concrete format  */
   5765     /* set up a context to be used for the multiply and subtract  */
   5766     bset=aset;
   5767     bset.emax=DEC_MAX_MATH*2;           /* use double bounds for the  */
   5768     bset.emin=-DEC_MAX_MATH*2;          /* adjustment calculation  */
   5769                                         /* [see decExpOp call below]  */
   5770     /* for each iteration double the number of digits to calculate,  */
   5771     /* up to a maximum of p  */
   5772     pp=9;                               /* initial precision  */
   5773     /* [initially 9 as then the sequence starts 7+2, 16+2, and  */
   5774     /* 34+2, which is ideal for standard-sized numbers]  */
   5775     aset.digits=pp;                     /* working context  */
   5776     bset.digits=pp+rhs->digits;         /* wider context  */
   5777     for (;;) {                          /* iterate  */
   5778       #if DECCHECK
   5779       iterations++;
   5780       if (iterations>24) break;         /* consider 9 * 2**24  */
   5781       #endif
   5782       /* calculate the adjustment (exp(-a)*x-1) into b.  This is a  */
   5783       /* catastrophic subtraction but it really is the difference  */
   5784       /* from 1 that is of interest.  */
   5785       /* Use the internal entry point to Exp as it allows the double  */
   5786       /* range for calculating exp(-a) when a is the tiniest subnormal.  */
   5787       a->bits^=DECNEG;                  /* make -a  */
   5788       decExpOp(b, a, &bset, &ignore);   /* b=exp(-a)  */
   5789       a->bits^=DECNEG;                  /* restore sign of a  */
   5790       /* now multiply by rhs and subtract 1, at the wider precision  */
   5791       decMultiplyOp(b, b, rhs, &bset, &ignore);        /* b=b*rhs  */
   5792       decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1  */
   5793 
   5794       /* the iteration ends when the adjustment cannot affect the  */
   5795       /* result by >=0.5 ulp (at the requested digits), which  */
   5796       /* is when its value is smaller than the accumulator by  */
   5797       /* set->digits+1 digits (or it is zero) -- this is a looser  */
   5798       /* requirement than for Exp because all that happens to the  */
   5799       /* accumulator after this is the final rounding (but note that  */
   5800       /* there must also be full precision in a, or a=0).  */
   5801 
   5802       if (decNumberIsZero(b) ||
   5803           (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
   5804         if (a->digits==p) break;
   5805         if (decNumberIsZero(a)) {
   5806           decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ?  */
   5807           if (cmp.lsu[0]==0) a->exponent=0;            /* yes, exact 0  */
   5808            else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact  */
   5809           break;
   5810           }
   5811         /* force padding if adjustment has gone to 0 before full length  */
   5812         if (decNumberIsZero(b)) b->exponent=a->exponent-p;
   5813         }
   5814 
   5815       /* not done yet ...  */
   5816       decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate  */
   5817       if (pp==p) continue;                   /* precision is at maximum  */
   5818       /* lengthen the next calculation  */
   5819       pp=pp*2;                               /* double precision  */
   5820       if (pp>p) pp=p;                        /* clamp to maximum  */
   5821       aset.digits=pp;                        /* working context  */
   5822       bset.digits=pp+rhs->digits;            /* wider context  */
   5823       } /* Newton's iteration  */
   5824 
   5825     #if DECCHECK
   5826     /* just a sanity check; remove the test to show always  */
   5827     if (iterations>24)
   5828       printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
   5829             (LI)iterations, (LI)*status, (LI)p, (LI)rhs->digits);
   5830     #endif
   5831 
   5832     /* Copy and round the result to res  */
   5833     residue=1;                          /* indicate dirt to right  */
   5834     if (ISZERO(a)) residue=0;           /* .. unless underflowed to 0  */
   5835     aset.digits=set->digits;            /* [use default rounding]  */
   5836     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten  */
   5837     decFinish(res, set, &residue, status);       /* cleanup/set flags  */
   5838     } while(0);                         /* end protected  */
   5839 
   5840   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used  */
   5841   if (allocbufb!=NULL) free(allocbufb); /* ..  */
   5842   /* [status is handled by caller]  */
   5843   return res;
   5844   } /* decLnOp  */
   5845 #if defined(__clang__) || U_GCC_MAJOR_MINOR >= 406
   5846 #pragma GCC diagnostic pop
   5847 #endif
   5848 
   5849 /* ------------------------------------------------------------------ */
   5850 /* decQuantizeOp  -- force exponent to requested value                */
   5851 /*                                                                    */
   5852 /*   This computes C = op(A, B), where op adjusts the coefficient     */
   5853 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
   5854 /*   of C has the value B or matches the exponent of B.               */
   5855 /*   The numerical value of C will equal A, except for the effects of */
   5856 /*   any rounding that occurred.                                      */
   5857 /*                                                                    */
   5858 /*   res is C, the result.  C may be A or B                           */
   5859 /*   lhs is A, the number to adjust                                   */
   5860 /*   rhs is B, the requested exponent                                 */
   5861 /*   set is the context                                               */
   5862 /*   quant is 1 for quantize or 0 for rescale                         */
   5863 /*   status is the status accumulator (this can be called without     */
   5864 /*          risk of control loss)                                     */
   5865 /*                                                                    */
   5866 /* C must have space for set->digits digits.                          */
   5867 /*                                                                    */
   5868 /* Unless there is an error or the result is infinite, the exponent   */
   5869 /* after the operation is guaranteed to be that requested.            */
   5870 /* ------------------------------------------------------------------ */
   5871 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
   5872                                  const decNumber *rhs, decContext *set,
   5873                                  Flag quant, uInt *status) {
   5874   #if DECSUBSET
   5875   decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated  */
   5876   decNumber *allocrhs=NULL;        /* .., rhs  */
   5877   #endif
   5878   const decNumber *inrhs=rhs;      /* save original rhs  */
   5879   Int   reqdigits=set->digits;     /* requested DIGITS  */
   5880   Int   reqexp;                    /* requested exponent [-scale]  */
   5881   Int   residue=0;                 /* rounding residue  */
   5882   Int   etiny=set->emin-(reqdigits-1);
   5883 
   5884   #if DECCHECK
   5885   if (decCheckOperands(res, lhs, rhs, set)) return res;
   5886   #endif
   5887 
   5888   do {                             /* protect allocated storage  */
   5889     #if DECSUBSET
   5890     if (!set->extended) {
   5891       /* reduce operands and set lostDigits status, as needed  */
   5892       if (lhs->digits>reqdigits) {
   5893         alloclhs=decRoundOperand(lhs, set, status);
   5894         if (alloclhs==NULL) break;
   5895         lhs=alloclhs;
   5896         }
   5897       if (rhs->digits>reqdigits) { /* [this only checks lostDigits]  */
   5898         allocrhs=decRoundOperand(rhs, set, status);
   5899         if (allocrhs==NULL) break;
   5900         rhs=allocrhs;
   5901         }
   5902       }
   5903     #endif
   5904     /* [following code does not require input rounding]  */
   5905 
   5906     /* Handle special values  */
   5907     if (SPECIALARGS) {
   5908       /* NaNs get usual processing  */
   5909       if (SPECIALARGS & (DECSNAN | DECNAN))
   5910         decNaNs(res, lhs, rhs, set, status);
   5911       /* one infinity but not both is bad  */
   5912       else if ((lhs->bits ^ rhs->bits) & DECINF)
   5913         *status|=DEC_Invalid_operation;
   5914       /* both infinity: return lhs  */
   5915       else uprv_decNumberCopy(res, lhs);          /* [nop if in place]  */
   5916       break;
   5917       }
   5918 
   5919     /* set requested exponent  */
   5920     if (quant) reqexp=inrhs->exponent;  /* quantize -- match exponents  */
   5921      else {                             /* rescale -- use value of rhs  */
   5922       /* Original rhs must be an integer that fits and is in range,  */
   5923       /* which could be from -1999999997 to +999999999, thanks to  */
   5924       /* subnormals  */
   5925       reqexp=decGetInt(inrhs);               /* [cannot fail]  */
   5926       }
   5927 
   5928     #if DECSUBSET
   5929     if (!set->extended) etiny=set->emin;     /* no subnormals  */
   5930     #endif
   5931 
   5932     if (reqexp==BADINT                       /* bad (rescale only) or ..  */
   5933      || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or ..  */
   5934      || (reqexp<etiny)                       /* < lowest  */
   5935      || (reqexp>set->emax)) {                /* > emax  */
   5936       *status|=DEC_Invalid_operation;
   5937       break;}
   5938 
   5939     /* the RHS has been processed, so it can be overwritten now if necessary  */
   5940     if (ISZERO(lhs)) {                       /* zero coefficient unchanged  */
   5941       uprv_decNumberCopy(res, lhs);               /* [nop if in place]  */
   5942       res->exponent=reqexp;                  /* .. just set exponent  */
   5943       #if DECSUBSET
   5944       if (!set->extended) res->bits=0;       /* subset specification; no -0  */
   5945       #endif
   5946       }
   5947      else {                                  /* non-zero lhs  */
   5948       Int adjust=reqexp-lhs->exponent;       /* digit adjustment needed  */
   5949       /* if adjusted coefficient will definitely not fit, give up now  */
   5950       if ((lhs->digits-adjust)>reqdigits) {
   5951         *status|=DEC_Invalid_operation;
   5952         break;
   5953         }
   5954 
   5955       if (adjust>0) {                        /* increasing exponent  */
   5956         /* this will decrease the length of the coefficient by adjust  */
   5957         /* digits, and must round as it does so  */
   5958         decContext workset;                  /* work  */
   5959         workset=*set;                        /* clone rounding, etc.  */
   5960         workset.digits=lhs->digits-adjust;   /* set requested length  */
   5961         /* [note that the latter can be <1, here]  */
   5962         decCopyFit(res, lhs, &workset, &residue, status); /* fit to result  */
   5963         decApplyRound(res, &workset, residue, status);    /* .. and round  */
   5964         residue=0;                                        /* [used]  */
   5965         /* If just rounded a 999s case, exponent will be off by one;  */
   5966         /* adjust back (after checking space), if so.  */
   5967         if (res->exponent>reqexp) {
   5968           /* re-check needed, e.g., for quantize(0.9999, 0.001) under  */
   5969           /* set->digits==3  */
   5970           if (res->digits==reqdigits) {      /* cannot shift by 1  */
   5971             *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these]  */
   5972             *status|=DEC_Invalid_operation;
   5973             break;
   5974             }
   5975           res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift  */
   5976           res->exponent--;                   /* (re)adjust the exponent.  */
   5977           }
   5978         #if DECSUBSET
   5979         if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0  */
   5980         #endif
   5981         } /* increase  */
   5982        else /* adjust<=0 */ {                /* decreasing or = exponent  */
   5983         /* this will increase the length of the coefficient by -adjust  */
   5984         /* digits, by adding zero or more trailing zeros; this is  */
   5985         /* already checked for fit, above  */
   5986         uprv_decNumberCopy(res, lhs);             /* [it will fit]  */
   5987         /* if padding needed (adjust<0), add it now...  */
   5988         if (adjust<0) {
   5989           res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
   5990           res->exponent+=adjust;             /* adjust the exponent  */
   5991           }
   5992         } /* decrease  */
   5993       } /* non-zero  */
   5994 
   5995     /* Check for overflow [do not use Finalize in this case, as an  */
   5996     /* overflow here is a "don't fit" situation]  */
   5997     if (res->exponent>set->emax-res->digits+1) {  /* too big  */
   5998       *status|=DEC_Invalid_operation;
   5999       break;
   6000       }
   6001      else {
   6002       decFinalize(res, set, &residue, status);    /* set subnormal flags  */
   6003       *status&=~DEC_Underflow;          /* suppress Underflow [as per 754]  */
   6004       }
   6005     } while(0);                         /* end protected  */
   6006 
   6007   #if DECSUBSET
   6008   if (allocrhs!=NULL) free(allocrhs);   /* drop any storage used  */
   6009   if (alloclhs!=NULL) free(alloclhs);   /* ..  */
   6010   #endif
   6011   return res;
   6012   } /* decQuantizeOp  */
   6013 
   6014 /* ------------------------------------------------------------------ */
   6015 /* decCompareOp -- compare, min, or max two Numbers                   */
   6016 /*                                                                    */
   6017 /*   This computes C = A ? B and carries out one of four operations:  */
   6018 /*     COMPARE    -- returns the signum (as a number) giving the      */
   6019 /*                   result of a comparison unless one or both        */
   6020 /*                   operands is a NaN (in which case a NaN results)  */
   6021 /*     COMPSIG    -- as COMPARE except that a quiet NaN raises        */
   6022 /*                   Invalid operation.                               */
   6023 /*     COMPMAX    -- returns the larger of the operands, using the    */
   6024 /*                   754 maxnum operation                             */
   6025 /*     COMPMAXMAG -- ditto, comparing absolute values                 */
   6026 /*     COMPMIN    -- the 754 minnum operation                         */
   6027 /*     COMPMINMAG -- ditto, comparing absolute values                 */
   6028 /*     COMTOTAL   -- returns the signum (as a number) giving the      */
   6029 /*                   result of a comparison using 754 total ordering  */
   6030 /*                                                                    */
   6031 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)         */
   6032 /*   lhs is A                                                         */
   6033 /*   rhs is B                                                         */
   6034 /*   set is the context                                               */
   6035 /*   op  is the operation flag                                        */
   6036 /*   status is the usual accumulator                                  */
   6037 /*                                                                    */
   6038 /* C must have space for one digit for COMPARE or set->digits for     */
   6039 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.                       */
   6040 /* ------------------------------------------------------------------ */
   6041 /* The emphasis here is on speed for common cases, and avoiding       */
   6042 /* coefficient comparison if possible.                                */
   6043 /* ------------------------------------------------------------------ */
   6044 static decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
   6045                          const decNumber *rhs, decContext *set,
   6046                          Flag op, uInt *status) {
   6047   #if DECSUBSET
   6048   decNumber *alloclhs=NULL;        /* non-NULL if rounded lhs allocated  */
   6049   decNumber *allocrhs=NULL;        /* .., rhs  */
   6050   #endif
   6051   Int   result=0;                  /* default result value  */
   6052   uByte merged;                    /* work  */
   6053 
   6054   #if DECCHECK
   6055   if (decCheckOperands(res, lhs, rhs, set)) return res;
   6056   #endif
   6057 
   6058   do {                             /* protect allocated storage  */
   6059     #if DECSUBSET
   6060     if (!set->extended) {
   6061       /* reduce operands and set lostDigits status, as needed  */
   6062       if (lhs->digits>set->digits) {
   6063         alloclhs=decRoundOperand(lhs, set, status);
   6064         if (alloclhs==NULL) {result=BADINT; break;}
   6065         lhs=alloclhs;
   6066         }
   6067       if (rhs->digits>set->digits) {
   6068         allocrhs=decRoundOperand(rhs, set, status);
   6069         if (allocrhs==NULL) {result=BADINT; break;}
   6070         rhs=allocrhs;
   6071         }
   6072       }
   6073     #endif
   6074     /* [following code does not require input rounding]  */
   6075 
   6076     /* If total ordering then handle differing signs 'up front'  */
   6077     if (op==COMPTOTAL) {                /* total ordering  */
   6078       if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
   6079         result=-1;
   6080         break;
   6081         }
   6082       if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
   6083         result=+1;
   6084         break;
   6085         }
   6086       }
   6087 
   6088     /* handle NaNs specially; let infinities drop through  */
   6089     /* This assumes sNaN (even just one) leads to NaN.  */
   6090     merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
   6091     if (merged) {                       /* a NaN bit set  */
   6092       if (op==COMPARE);                 /* result will be NaN  */
   6093        else if (op==COMPSIG)            /* treat qNaN as sNaN  */
   6094         *status|=DEC_Invalid_operation | DEC_sNaN;
   6095        else if (op==COMPTOTAL) {        /* total ordering, always finite  */
   6096         /* signs are known to be the same; compute the ordering here  */
   6097         /* as if the signs are both positive, then invert for negatives  */
   6098         if (!decNumberIsNaN(lhs)) result=-1;
   6099          else if (!decNumberIsNaN(rhs)) result=+1;
   6100          /* here if both NaNs  */
   6101          else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
   6102          else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
   6103          else { /* both NaN or both sNaN  */
   6104           /* now it just depends on the payload  */
   6105           result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6106                                 rhs->lsu, D2U(rhs->digits), 0);
   6107           /* [Error not possible, as these are 'aligned']  */
   6108           } /* both same NaNs  */
   6109         if (decNumberIsNegative(lhs)) result=-result;
   6110         break;
   6111         } /* total order  */
   6112 
   6113        else if (merged & DECSNAN);           /* sNaN -> qNaN  */
   6114        else { /* here if MIN or MAX and one or two quiet NaNs  */
   6115         /* min or max -- 754 rules ignore single NaN  */
   6116         if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
   6117           /* just one NaN; force choice to be the non-NaN operand  */
   6118           op=COMPMAX;
   6119           if (lhs->bits & DECNAN) result=-1; /* pick rhs  */
   6120                              else result=+1; /* pick lhs  */
   6121           break;
   6122           }
   6123         } /* max or min  */
   6124       op=COMPNAN;                            /* use special path  */
   6125       decNaNs(res, lhs, rhs, set, status);   /* propagate NaN  */
   6126       break;
   6127       }
   6128     /* have numbers  */
   6129     if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
   6130      else result=decCompare(lhs, rhs, 0);    /* sign matters  */
   6131     } while(0);                              /* end protected  */
   6132 
   6133   if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare  */
   6134    else {
   6135     if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum  */
   6136       if (op==COMPTOTAL && result==0) {
   6137         /* operands are numerically equal or same NaN (and same sign,  */
   6138         /* tested first); if identical, leave result 0  */
   6139         if (lhs->exponent!=rhs->exponent) {
   6140           if (lhs->exponent<rhs->exponent) result=-1;
   6141            else result=+1;
   6142           if (decNumberIsNegative(lhs)) result=-result;
   6143           } /* lexp!=rexp  */
   6144         } /* total-order by exponent  */
   6145       uprv_decNumberZero(res);               /* [always a valid result]  */
   6146       if (result!=0) {                  /* must be -1 or +1  */
   6147         *res->lsu=1;
   6148         if (result<0) res->bits=DECNEG;
   6149         }
   6150       }
   6151      else if (op==COMPNAN);             /* special, drop through  */
   6152      else {                             /* MAX or MIN, non-NaN result  */
   6153       Int residue=0;                    /* rounding accumulator  */
   6154       /* choose the operand for the result  */
   6155       const decNumber *choice;
   6156       if (result==0) { /* operands are numerically equal  */
   6157         /* choose according to sign then exponent (see 754)  */
   6158         uByte slhs=(lhs->bits & DECNEG);
   6159         uByte srhs=(rhs->bits & DECNEG);
   6160         #if DECSUBSET
   6161         if (!set->extended) {           /* subset: force left-hand  */
   6162           op=COMPMAX;
   6163           result=+1;
   6164           }
   6165         else
   6166         #endif
   6167         if (slhs!=srhs) {          /* signs differ  */
   6168           if (slhs) result=-1;     /* rhs is max  */
   6169                else result=+1;     /* lhs is max  */
   6170           }
   6171          else if (slhs && srhs) {  /* both negative  */
   6172           if (lhs->exponent<rhs->exponent) result=+1;
   6173                                       else result=-1;
   6174           /* [if equal, use lhs, technically identical]  */
   6175           }
   6176          else {                    /* both positive  */
   6177           if (lhs->exponent>rhs->exponent) result=+1;
   6178                                       else result=-1;
   6179           /* [ditto]  */
   6180           }
   6181         } /* numerically equal  */
   6182       /* here result will be non-0; reverse if looking for MIN  */
   6183       if (op==COMPMIN || op==COMPMINMAG) result=-result;
   6184       choice=(result>0 ? lhs : rhs);    /* choose  */
   6185       /* copy chosen to result, rounding if need be  */
   6186       decCopyFit(res, choice, set, &residue, status);
   6187       decFinish(res, set, &residue, status);
   6188       }
   6189     }
   6190   #if DECSUBSET
   6191   if (allocrhs!=NULL) free(allocrhs);   /* free any storage used  */
   6192   if (alloclhs!=NULL) free(alloclhs);   /* ..  */
   6193   #endif
   6194   return res;
   6195   } /* decCompareOp  */
   6196 
   6197 /* ------------------------------------------------------------------ */
   6198 /* decCompare -- compare two decNumbers by numerical value            */
   6199 /*                                                                    */
   6200 /*  This routine compares A ? B without altering them.                */
   6201 /*                                                                    */
   6202 /*  Arg1 is A, a decNumber which is not a NaN                         */
   6203 /*  Arg2 is B, a decNumber which is not a NaN                         */
   6204 /*  Arg3 is 1 for a sign-independent compare, 0 otherwise             */
   6205 /*                                                                    */
   6206 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6207 /*  (the only possible failure is an allocation error)                */
   6208 /* ------------------------------------------------------------------ */
   6209 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
   6210                       Flag abs_c) {
   6211   Int   result;                    /* result value  */
   6212   Int   sigr;                      /* rhs signum  */
   6213   Int   compare;                   /* work  */
   6214 
   6215   result=1;                                  /* assume signum(lhs)  */
   6216   if (ISZERO(lhs)) result=0;
   6217   if (abs_c) {
   6218     if (ISZERO(rhs)) return result;          /* LHS wins or both 0  */
   6219     /* RHS is non-zero  */
   6220     if (result==0) return -1;                /* LHS is 0; RHS wins  */
   6221     /* [here, both non-zero, result=1]  */
   6222     }
   6223    else {                                    /* signs matter  */
   6224     if (result && decNumberIsNegative(lhs)) result=-1;
   6225     sigr=1;                                  /* compute signum(rhs)  */
   6226     if (ISZERO(rhs)) sigr=0;
   6227      else if (decNumberIsNegative(rhs)) sigr=-1;
   6228     if (result > sigr) return +1;            /* L > R, return 1  */
   6229     if (result < sigr) return -1;            /* L < R, return -1  */
   6230     if (result==0) return 0;                   /* both 0  */
   6231     }
   6232 
   6233   /* signums are the same; both are non-zero  */
   6234   if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities  */
   6235     if (decNumberIsInfinite(rhs)) {
   6236       if (decNumberIsInfinite(lhs)) result=0;/* both infinite  */
   6237        else result=-result;                  /* only rhs infinite  */
   6238       }
   6239     return result;
   6240     }
   6241   /* must compare the coefficients, allowing for exponents  */
   6242   if (lhs->exponent>rhs->exponent) {         /* LHS exponent larger  */
   6243     /* swap sides, and sign  */
   6244     const decNumber *temp=lhs;
   6245     lhs=rhs;
   6246     rhs=temp;
   6247     result=-result;
   6248     }
   6249   compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
   6250                          rhs->lsu, D2U(rhs->digits),
   6251                          rhs->exponent-lhs->exponent);
   6252   if (compare!=BADINT) compare*=result;      /* comparison succeeded  */
   6253   return compare;
   6254   } /* decCompare  */
   6255 
   6256 /* ------------------------------------------------------------------ */
   6257 /* decUnitCompare -- compare two >=0 integers in Unit arrays          */
   6258 /*                                                                    */
   6259 /*  This routine compares A ? B*10**E where A and B are unit arrays   */
   6260 /*  A is a plain integer                                              */
   6261 /*  B has an exponent of E (which must be non-negative)               */
   6262 /*                                                                    */
   6263 /*  Arg1 is A first Unit (lsu)                                        */
   6264 /*  Arg2 is A length in Units                                         */
   6265 /*  Arg3 is B first Unit (lsu)                                        */
   6266 /*  Arg4 is B length in Units                                         */
   6267 /*  Arg5 is E (0 if the units are aligned)                            */
   6268 /*                                                                    */
   6269 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
   6270 /*  (the only possible failure is an allocation error, which can      */
   6271 /*  only occur if E!=0)                                               */
   6272 /* ------------------------------------------------------------------ */
   6273 static Int decUnitCompare(const Unit *a, Int alength,
   6274                           const Unit *b, Int blength, Int exp) {
   6275   Unit  *acc;                      /* accumulator for result  */
   6276   Unit  accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer  */
   6277   Unit  *allocacc=NULL;            /* -> allocated acc buffer, iff allocated  */
   6278   Int   accunits, need;            /* units in use or needed for acc  */
   6279   const Unit *l, *r, *u;           /* work  */
   6280   Int   expunits, exprem, result;  /* ..  */
   6281 
   6282   if (exp==0) {                    /* aligned; fastpath  */
   6283     if (alength>blength) return 1;
   6284     if (alength<blength) return -1;
   6285     /* same number of units in both -- need unit-by-unit compare  */
   6286     l=a+alength-1;
   6287     r=b+alength-1;
   6288     for (;l>=a; l--, r--) {
   6289       if (*l>*r) return 1;
   6290       if (*l<*r) return -1;
   6291       }
   6292     return 0;                      /* all units match  */
   6293     } /* aligned  */
   6294 
   6295   /* Unaligned.  If one is >1 unit longer than the other, padded  */
   6296   /* approximately, then can return easily  */
   6297   if (alength>blength+(Int)D2U(exp)) return 1;
   6298   if (alength+1<blength+(Int)D2U(exp)) return -1;
   6299 
   6300   /* Need to do a real subtract.  For this, a result buffer is needed  */
   6301   /* even though only the sign is of interest.  Its length needs  */
   6302   /* to be the larger of alength and padded blength, +2  */
   6303   need=blength+D2U(exp);                /* maximum real length of B  */
   6304   if (need<alength) need=alength;
   6305   need+=2;
   6306   acc=accbuff;                          /* assume use local buffer  */
   6307   if (need*sizeof(Unit)>sizeof(accbuff)) {
   6308     allocacc=(Unit *)malloc(need*sizeof(Unit));
   6309     if (allocacc==NULL) return BADINT;  /* hopeless -- abandon  */
   6310     acc=allocacc;
   6311     }
   6312   /* Calculate units and remainder from exponent.  */
   6313   expunits=exp/DECDPUN;
   6314   exprem=exp%DECDPUN;
   6315   /* subtract [A+B*(-m)]  */
   6316   accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
   6317                          -(Int)powers[exprem]);
   6318   /* [UnitAddSub result may have leading zeros, even on zero]  */
   6319   if (accunits<0) result=-1;            /* negative result  */
   6320    else {                               /* non-negative result  */
   6321     /* check units of the result before freeing any storage  */
   6322     for (u=acc; u<acc+accunits-1 && *u==0;) u++;
   6323     result=(*u==0 ? 0 : +1);
   6324     }
   6325   /* clean up and return the result  */
   6326   if (allocacc!=NULL) free(allocacc);   /* drop any storage used  */
   6327   return result;
   6328   } /* decUnitCompare  */
   6329 
   6330 /* ------------------------------------------------------------------ */
   6331 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
   6332 /*                                                                    */
   6333 /*  This routine performs the calculation:                            */
   6334 /*                                                                    */
   6335 /*  C=A+(B*M)                                                         */
   6336 /*                                                                    */
   6337 /*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.          */
   6338 /*                                                                    */
   6339 /*  A may be shorter or longer than B.                                */
   6340 /*                                                                    */
   6341 /*  Leading zeros are not removed after a calculation.  The result is */
   6342 /*  either the same length as the longer of A and B (adding any       */
   6343 /*  shift), or one Unit longer than that (if a Unit carry occurred).  */
   6344 /*                                                                    */
   6345 /*  A and B content are not altered unless C is also A or B.          */
   6346 /*  C may be the same array as A or B, but only if no zero padding is */
   6347 /*  requested (that is, C may be B only if bshift==0).                */
   6348 /*  C is filled from the lsu; only those units necessary to complete  */
   6349 /*  the calculation are referenced.                                   */
   6350 /*                                                                    */
   6351 /*  Arg1 is A first Unit (lsu)                                        */
   6352 /*  Arg2 is A length in Units                                         */
   6353 /*  Arg3 is B first Unit (lsu)                                        */
   6354 /*  Arg4 is B length in Units                                         */
   6355 /*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
   6356 /*  Arg6 is C first Unit (lsu)                                        */
   6357 /*  Arg7 is M, the multiplier                                         */
   6358 /*                                                                    */
   6359 /*  returns the count of Units written to C, which will be non-zero   */
   6360 /*  and negated if the result is negative.  That is, the sign of the  */
   6361 /*  returned Int is the sign of the result (positive for zero) and    */
   6362 /*  the absolute value of the Int is the count of Units.              */
   6363 /*                                                                    */
   6364 /*  It is the caller's responsibility to make sure that C size is     */
   6365 /*  safe, allowing space if necessary for a one-Unit carry.           */
   6366 /*                                                                    */
   6367 /*  This routine is severely performance-critical; *any* change here  */
   6368 /*  must be measured (timed) to assure no performance degradation.    */
   6369 /*  In particular, trickery here tends to be counter-productive, as   */
   6370 /*  increased complexity of code hurts register optimizations on      */
   6371 /*  register-poor architectures.  Avoiding divisions is nearly        */
   6372 /*  always a Good Idea, however.                                      */
   6373 /*                                                                    */
   6374 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
   6375 /* (IBM Warwick, UK) for some of the ideas used in this routine.      */
   6376 /* ------------------------------------------------------------------ */
   6377 static Int decUnitAddSub(const Unit *a, Int alength,
   6378                          const Unit *b, Int blength, Int bshift,
   6379                          Unit *c, Int m) {
   6380   const Unit *alsu=a;              /* A lsu [need to remember it]  */
   6381   Unit *clsu=c;                    /* C ditto  */
   6382   Unit *minC;                      /* low water mark for C  */
   6383   Unit *maxC;                      /* high water mark for C  */
   6384   eInt carry=0;                    /* carry integer (could be Long)  */
   6385   Int  add;                        /* work  */
   6386   #if DECDPUN<=4                   /* myriadal, millenary, etc.  */
   6387   Int  est;                        /* estimated quotient  */
   6388   #endif
   6389 
   6390   #if DECTRACE
   6391   if (alength<1 || blength<1)
   6392     printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
   6393   #endif
   6394 
   6395   maxC=c+alength;                  /* A is usually the longer  */
   6396   minC=c+blength;                  /* .. and B the shorter  */
   6397   if (bshift!=0) {                 /* B is shifted; low As copy across  */
   6398     minC+=bshift;
   6399     /* if in place [common], skip copy unless there's a gap [rare]  */
   6400     if (a==c && bshift<=alength) {
   6401       c+=bshift;
   6402       a+=bshift;
   6403       }
   6404      else for (; c<clsu+bshift; a++, c++) {  /* copy needed  */
   6405       if (a<alsu+alength) *c=*a;
   6406        else *c=0;
   6407       }
   6408     }
   6409   if (minC>maxC) { /* swap  */
   6410     Unit *hold=minC;
   6411     minC=maxC;
   6412     maxC=hold;
   6413     }
   6414 
   6415   /* For speed, do the addition as two loops; the first where both A  */
   6416   /* and B contribute, and the second (if necessary) where only one or  */
   6417   /* other of the numbers contribute.  */
   6418   /* Carry handling is the same (i.e., duplicated) in each case.  */
   6419   for (; c<minC; c++) {
   6420     carry+=*a;
   6421     a++;
   6422     carry+=((eInt)*b)*m;                /* [special-casing m=1/-1  */
   6423     b++;                                /* here is not a win]  */
   6424     /* here carry is new Unit of digits; it could be +ve or -ve  */
   6425     if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX  */
   6426       *c=(Unit)carry;
   6427       carry=0;
   6428       continue;
   6429       }
   6430     #if DECDPUN==4                           /* use divide-by-multiply  */
   6431       if (carry>=0) {
   6432         est=(((ueInt)carry>>11)*53687)>>18;
   6433         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6434         carry=est;                           /* likely quotient [89%]  */
   6435         if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
   6436         carry++;
   6437         *c-=DECDPUNMAX+1;
   6438         continue;
   6439         }
   6440       /* negative case  */
   6441       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6442       est=(((ueInt)carry>>11)*53687)>>18;
   6443       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6444       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6445       if (*c<DECDPUNMAX+1) continue;         /* was OK  */
   6446       carry++;
   6447       *c-=DECDPUNMAX+1;
   6448     #elif DECDPUN==3
   6449       if (carry>=0) {
   6450         est=(((ueInt)carry>>3)*16777)>>21;
   6451         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6452         carry=est;                           /* likely quotient [99%]  */
   6453         if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
   6454         carry++;
   6455         *c-=DECDPUNMAX+1;
   6456         continue;
   6457         }
   6458       /* negative case  */
   6459       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6460       est=(((ueInt)carry>>3)*16777)>>21;
   6461       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6462       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6463       if (*c<DECDPUNMAX+1) continue;         /* was OK  */
   6464       carry++;
   6465       *c-=DECDPUNMAX+1;
   6466     #elif DECDPUN<=2
   6467       /* Can use QUOT10 as carry <= 4 digits  */
   6468       if (carry>=0) {
   6469         est=QUOT10(carry, DECDPUN);
   6470         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6471         carry=est;                           /* quotient  */
   6472         continue;
   6473         }
   6474       /* negative case  */
   6475       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6476       est=QUOT10(carry, DECDPUN);
   6477       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6478       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6479     #else
   6480       /* remainder operator is undefined if negative, so must test  */
   6481       if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1  */
   6482         *c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions]  */
   6483         carry=1;
   6484         continue;
   6485         }
   6486       if (carry>=0) {
   6487         *c=(Unit)(carry%(DECDPUNMAX+1));
   6488         carry=carry/(DECDPUNMAX+1);
   6489         continue;
   6490         }
   6491       /* negative case  */
   6492       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6493       *c=(Unit)(carry%(DECDPUNMAX+1));
   6494       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6495     #endif
   6496     } /* c  */
   6497 
   6498   /* now may have one or other to complete  */
   6499   /* [pretest to avoid loop setup/shutdown]  */
   6500   if (c<maxC) for (; c<maxC; c++) {
   6501     if (a<alsu+alength) {               /* still in A  */
   6502       carry+=*a;
   6503       a++;
   6504       }
   6505      else {                             /* inside B  */
   6506       carry+=((eInt)*b)*m;
   6507       b++;
   6508       }
   6509     /* here carry is new Unit of digits; it could be +ve or -ve and  */
   6510     /* magnitude up to DECDPUNMAX squared  */
   6511     if ((ueInt)carry<=DECDPUNMAX) {     /* fastpath 0-DECDPUNMAX  */
   6512       *c=(Unit)carry;
   6513       carry=0;
   6514       continue;
   6515       }
   6516     /* result for this unit is negative or >DECDPUNMAX  */
   6517     #if DECDPUN==4                           /* use divide-by-multiply  */
   6518       if (carry>=0) {
   6519         est=(((ueInt)carry>>11)*53687)>>18;
   6520         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6521         carry=est;                           /* likely quotient [79.7%]  */
   6522         if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
   6523         carry++;
   6524         *c-=DECDPUNMAX+1;
   6525         continue;
   6526         }
   6527       /* negative case  */
   6528       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6529       est=(((ueInt)carry>>11)*53687)>>18;
   6530       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6531       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6532       if (*c<DECDPUNMAX+1) continue;         /* was OK  */
   6533       carry++;
   6534       *c-=DECDPUNMAX+1;
   6535     #elif DECDPUN==3
   6536       if (carry>=0) {
   6537         est=(((ueInt)carry>>3)*16777)>>21;
   6538         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6539         carry=est;                           /* likely quotient [99%]  */
   6540         if (*c<DECDPUNMAX+1) continue;       /* estimate was correct  */
   6541         carry++;
   6542         *c-=DECDPUNMAX+1;
   6543         continue;
   6544         }
   6545       /* negative case  */
   6546       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6547       est=(((ueInt)carry>>3)*16777)>>21;
   6548       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6549       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6550       if (*c<DECDPUNMAX+1) continue;         /* was OK  */
   6551       carry++;
   6552       *c-=DECDPUNMAX+1;
   6553     #elif DECDPUN<=2
   6554       if (carry>=0) {
   6555         est=QUOT10(carry, DECDPUN);
   6556         *c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder  */
   6557         carry=est;                           /* quotient  */
   6558         continue;
   6559         }
   6560       /* negative case  */
   6561       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6562       est=QUOT10(carry, DECDPUN);
   6563       *c=(Unit)(carry-est*(DECDPUNMAX+1));
   6564       carry=est-(DECDPUNMAX+1);              /* correctly negative  */
   6565     #else
   6566       if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1  */
   6567         *c=(Unit)(carry-(DECDPUNMAX+1));
   6568         carry=1;
   6569         continue;
   6570         }
   6571       /* remainder operator is undefined if negative, so must test  */
   6572       if (carry>=0) {
   6573         *c=(Unit)(carry%(DECDPUNMAX+1));
   6574         carry=carry/(DECDPUNMAX+1);
   6575         continue;
   6576         }
   6577       /* negative case  */
   6578       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive  */
   6579       *c=(Unit)(carry%(DECDPUNMAX+1));
   6580       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
   6581     #endif
   6582     } /* c  */
   6583 
   6584   /* OK, all A and B processed; might still have carry or borrow  */
   6585   /* return number of Units in the result, negated if a borrow  */
   6586   if (carry==0) return c-clsu;     /* no carry, so no more to do  */
   6587   if (carry>0) {                   /* positive carry  */
   6588     *c=(Unit)carry;                /* place as new unit  */
   6589     c++;                           /* ..  */
   6590     return c-clsu;
   6591     }
   6592   /* -ve carry: it's a borrow; complement needed  */
   6593   add=1;                           /* temporary carry...  */
   6594   for (c=clsu; c<maxC; c++) {
   6595     add=DECDPUNMAX+add-*c;
   6596     if (add<=DECDPUNMAX) {
   6597       *c=(Unit)add;
   6598       add=0;
   6599       }
   6600      else {
   6601       *c=0;
   6602       add=1;
   6603       }
   6604     }
   6605   /* add an extra unit iff it would be non-zero  */
   6606   #if DECTRACE
   6607     printf("UAS borrow: add %ld, carry %ld\n", add, carry);
   6608   #endif
   6609   if ((add-carry-1)!=0) {
   6610     *c=(Unit)(add-carry-1);
   6611     c++;                      /* interesting, include it  */
   6612     }
   6613   return clsu-c;              /* -ve result indicates borrowed  */
   6614   } /* decUnitAddSub  */
   6615 
   6616 /* ------------------------------------------------------------------ */
   6617 /* decTrim -- trim trailing zeros or normalize                        */
   6618 /*                                                                    */
   6619 /*   dn is the number to trim or normalize                            */
   6620 /*   set is the context to use to check for clamp                     */
   6621 /*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
   6622 /*   noclamp is 1 to unconditional (unclamped) trim                   */
   6623 /*   dropped returns the number of discarded trailing zeros           */
   6624 /*   returns dn                                                       */
   6625 /*                                                                    */
   6626 /* If clamp is set in the context then the number of zeros trimmed    */
   6627 /* may be limited if the exponent is high.                            */
   6628 /* All fields are updated as required.  This is a utility operation,  */
   6629 /* so special values are unchanged and no error is possible.          */
   6630 /* ------------------------------------------------------------------ */
   6631 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
   6632                            Flag noclamp, Int *dropped) {
   6633   Int   d, exp;                    /* work  */
   6634   uInt  cut;                       /* ..  */
   6635   Unit  *up;                       /* -> current Unit  */
   6636 
   6637   #if DECCHECK
   6638   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
   6639   #endif
   6640 
   6641   *dropped=0;                           /* assume no zeros dropped  */
   6642   if ((dn->bits & DECSPECIAL)           /* fast exit if special ..  */
   6643     || (*dn->lsu & 0x01)) return dn;    /* .. or odd  */
   6644   if (ISZERO(dn)) {                     /* .. or 0  */
   6645     dn->exponent=0;                     /* (sign is preserved)  */
   6646     return dn;
   6647     }
   6648 
   6649   /* have a finite number which is even  */
   6650   exp=dn->exponent;
   6651   cut=1;                           /* digit (1-DECDPUN) in Unit  */
   6652   up=dn->lsu;                      /* -> current Unit  */
   6653   for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit]  */
   6654     /* slice by powers  */
   6655     #if DECDPUN<=4
   6656       uInt quot=QUOT10(*up, cut);
   6657       if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit  */
   6658     #else
   6659       if (*up%powers[cut]!=0) break;         /* found non-0 digit  */
   6660     #endif
   6661     /* have a trailing 0  */
   6662     if (!all) {                    /* trimming  */
   6663       /* [if exp>0 then all trailing 0s are significant for trim]  */
   6664       if (exp<=0) {                /* if digit might be significant  */
   6665         if (exp==0) break;         /* then quit  */
   6666         exp++;                     /* next digit might be significant  */
   6667         }
   6668       }
   6669     cut++;                         /* next power  */
   6670     if (cut>DECDPUN) {             /* need new Unit  */
   6671       up++;
   6672       cut=1;
   6673       }
   6674     } /* d  */
   6675   if (d==0) return dn;             /* none to drop  */
   6676 
   6677   /* may need to limit drop if clamping  */
   6678   if (set->clamp && !noclamp) {
   6679     Int maxd=set->emax-set->digits+1-dn->exponent;
   6680     if (maxd<=0) return dn;        /* nothing possible  */
   6681     if (d>maxd) d=maxd;
   6682     }
   6683 
   6684   /* effect the drop  */
   6685   decShiftToLeast(dn->lsu, D2U(dn->digits), d);
   6686   dn->exponent+=d;                 /* maintain numerical value  */
   6687   dn->digits-=d;                   /* new length  */
   6688   *dropped=d;                      /* report the count  */
   6689   return dn;
   6690   } /* decTrim  */
   6691 
   6692 /* ------------------------------------------------------------------ */
   6693 /* decReverse -- reverse a Unit array in place                        */
   6694 /*                                                                    */
   6695 /*   ulo    is the start of the array                                 */
   6696 /*   uhi    is the end of the array (highest Unit to include)         */
   6697 /*                                                                    */
   6698 /* The units ulo through uhi are reversed in place (if the number     */
   6699 /* of units is odd, the middle one is untouched).  Note that the      */
   6700 /* digit(s) in each unit are unaffected.                              */
   6701 /* ------------------------------------------------------------------ */
   6702 static void decReverse(Unit *ulo, Unit *uhi) {
   6703   Unit temp;
   6704   for (; ulo<uhi; ulo++, uhi--) {
   6705     temp=*ulo;
   6706     *ulo=*uhi;
   6707     *uhi=temp;
   6708     }
   6709   return;
   6710   } /* decReverse  */
   6711 
   6712 /* ------------------------------------------------------------------ */
   6713 /* decShiftToMost -- shift digits in array towards most significant   */
   6714 /*                                                                    */
   6715 /*   uar    is the array                                              */
   6716 /*   digits is the count of digits in use in the array                */
   6717 /*   shift  is the number of zeros to pad with (least significant);   */
   6718 /*     it must be zero or positive                                    */
   6719 /*                                                                    */
   6720 /*   returns the new length of the integer in the array, in digits    */
   6721 /*                                                                    */
   6722 /* No overflow is permitted (that is, the uar array must be known to  */
   6723 /* be large enough to hold the result, after shifting).               */
   6724 /* ------------------------------------------------------------------ */
   6725 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
   6726   Unit  *target, *source, *first;  /* work  */
   6727   Int   cut;                       /* odd 0's to add  */
   6728   uInt  next;                      /* work  */
   6729 
   6730   if (shift==0) return digits;     /* [fastpath] nothing to do  */
   6731   if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case  */
   6732     *uar=(Unit)(*uar*powers[shift]);
   6733     return digits+shift;
   6734     }
   6735 
   6736   next=0;                          /* all paths  */
   6737   source=uar+D2U(digits)-1;        /* where msu comes from  */
   6738   target=source+D2U(shift);        /* where upper part of first cut goes  */
   6739   cut=DECDPUN-MSUDIGITS(shift);    /* where to slice  */
   6740   if (cut==0) {                    /* unit-boundary case  */
   6741     for (; source>=uar; source--, target--) *target=*source;
   6742     }
   6743    else {
   6744     first=uar+D2U(digits+shift)-1; /* where msu of source will end up  */
   6745     for (; source>=uar; source--, target--) {
   6746       /* split the source Unit and accumulate remainder for next  */
   6747       #if DECDPUN<=4
   6748         uInt quot=QUOT10(*source, cut);
   6749         uInt rem=*source-quot*powers[cut];
   6750         next+=quot;
   6751       #else
   6752         uInt rem=*source%powers[cut];
   6753         next+=*source/powers[cut];
   6754       #endif
   6755       if (target<=first) *target=(Unit)next;   /* write to target iff valid  */
   6756       next=rem*powers[DECDPUN-cut];            /* save remainder for next Unit  */
   6757       }
   6758     } /* shift-move  */
   6759 
   6760   /* propagate any partial unit to one below and clear the rest  */
   6761   for (; target>=uar; target--) {
   6762     *target=(Unit)next;
   6763     next=0;
   6764     }
   6765   return digits+shift;
   6766   } /* decShiftToMost  */
   6767 
   6768 /* ------------------------------------------------------------------ */
   6769 /* decShiftToLeast -- shift digits in array towards least significant */
   6770 /*                                                                    */
   6771 /*   uar   is the array                                               */
   6772 /*   units is length of the array, in units                           */
   6773 /*   shift is the number of digits to remove from the lsu end; it     */
   6774 /*     must be zero or positive and <= than units*DECDPUN.            */
   6775 /*                                                                    */
   6776 /*   returns the new length of the integer in the array, in units     */
   6777 /*                                                                    */
   6778 /* Removed digits are discarded (lost).  Units not required to hold   */
   6779 /* the final result are unchanged.                                    */
   6780 /* ------------------------------------------------------------------ */
   6781 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
   6782   Unit  *target, *up;              /* work  */
   6783   Int   cut, count;                /* work  */
   6784   Int   quot, rem;                 /* for division  */
   6785 
   6786   if (shift==0) return units;      /* [fastpath] nothing to do  */
   6787   if (shift==units*DECDPUN) {      /* [fastpath] little to do  */
   6788     *uar=0;                        /* all digits cleared gives zero  */
   6789     return 1;                      /* leaves just the one  */
   6790     }
   6791 
   6792   target=uar;                      /* both paths  */
   6793   cut=MSUDIGITS(shift);
   6794   if (cut==DECDPUN) {              /* unit-boundary case; easy  */
   6795     up=uar+D2U(shift);
   6796     for (; up<uar+units; target++, up++) *target=*up;
   6797     return target-uar;
   6798     }
   6799 
   6800   /* messier  */
   6801   up=uar+D2U(shift-cut);           /* source; correct to whole Units  */
   6802   count=units*DECDPUN-shift;       /* the maximum new length  */
   6803   #if DECDPUN<=4
   6804     quot=QUOT10(*up, cut);
   6805   #else
   6806     quot=*up/powers[cut];
   6807   #endif
   6808   for (; ; target++) {
   6809     *target=(Unit)quot;
   6810     count-=(DECDPUN-cut);
   6811     if (count<=0) break;
   6812     up++;
   6813     quot=*up;
   6814     #if DECDPUN<=4
   6815       quot=QUOT10(quot, cut);
   6816       rem=*up-quot*powers[cut];
   6817     #else
   6818       rem=quot%powers[cut];
   6819       quot=quot/powers[cut];
   6820     #endif
   6821     *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   6822     count-=cut;
   6823     if (count<=0) break;
   6824     }
   6825   return target-uar+1;
   6826   } /* decShiftToLeast  */
   6827 
   6828 #if DECSUBSET
   6829 /* ------------------------------------------------------------------ */
   6830 /* decRoundOperand -- round an operand  [used for subset only]        */
   6831 /*                                                                    */
   6832 /*   dn is the number to round (dn->digits is > set->digits)          */
   6833 /*   set is the relevant context                                      */
   6834 /*   status is the status accumulator                                 */
   6835 /*                                                                    */
   6836 /*   returns an allocated decNumber with the rounded result.          */
   6837 /*                                                                    */
   6838 /* lostDigits and other status may be set by this.                    */
   6839 /*                                                                    */
   6840 /* Since the input is an operand, it must not be modified.            */
   6841 /* Instead, return an allocated decNumber, rounded as required.       */
   6842 /* It is the caller's responsibility to free the allocated storage.   */
   6843 /*                                                                    */
   6844 /* If no storage is available then the result cannot be used, so NULL */
   6845 /* is returned.                                                       */
   6846 /* ------------------------------------------------------------------ */
   6847 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
   6848                                   uInt *status) {
   6849   decNumber *res;                       /* result structure  */
   6850   uInt newstatus=0;                     /* status from round  */
   6851   Int  residue=0;                       /* rounding accumulator  */
   6852 
   6853   /* Allocate storage for the returned decNumber, big enough for the  */
   6854   /* length specified by the context  */
   6855   res=(decNumber *)malloc(sizeof(decNumber)
   6856                           +(D2U(set->digits)-1)*sizeof(Unit));
   6857   if (res==NULL) {
   6858     *status|=DEC_Insufficient_storage;
   6859     return NULL;
   6860     }
   6861   decCopyFit(res, dn, set, &residue, &newstatus);
   6862   decApplyRound(res, set, residue, &newstatus);
   6863 
   6864   /* If that set Inexact then "lost digits" is raised...  */
   6865   if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
   6866   *status|=newstatus;
   6867   return res;
   6868   } /* decRoundOperand  */
   6869 #endif
   6870 
   6871 /* ------------------------------------------------------------------ */
   6872 /* decCopyFit -- copy a number, truncating the coefficient if needed  */
   6873 /*                                                                    */
   6874 /*   dest is the target decNumber                                     */
   6875 /*   src  is the source decNumber                                     */
   6876 /*   set is the context [used for length (digits) and rounding mode]  */
   6877 /*   residue is the residue accumulator                               */
   6878 /*   status contains the current status to be updated                 */
   6879 /*                                                                    */
   6880 /* (dest==src is allowed and will be a no-op if fits)                 */
   6881 /* All fields are updated as required.                                */
   6882 /* ------------------------------------------------------------------ */
   6883 static void decCopyFit(decNumber *dest, const decNumber *src,
   6884                        decContext *set, Int *residue, uInt *status) {
   6885   dest->bits=src->bits;
   6886   dest->exponent=src->exponent;
   6887   decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
   6888   } /* decCopyFit  */
   6889 
   6890 /* ------------------------------------------------------------------ */
   6891 /* decSetCoeff -- set the coefficient of a number                     */
   6892 /*                                                                    */
   6893 /*   dn    is the number whose coefficient array is to be set.        */
   6894 /*         It must have space for set->digits digits                  */
   6895 /*   set   is the context [for size]                                  */
   6896 /*   lsu   -> lsu of the source coefficient [may be dn->lsu]          */
   6897 /*   len   is digits in the source coefficient [may be dn->digits]    */
   6898 /*   residue is the residue accumulator.  This has values as in       */
   6899 /*         decApplyRound, and will be unchanged unless the            */
   6900 /*         target size is less than len.  In this case, the           */
   6901 /*         coefficient is truncated and the residue is updated to     */
   6902 /*         reflect the previous residue and the dropped digits.       */
   6903 /*   status is the status accumulator, as usual                       */
   6904 /*                                                                    */
   6905 /* The coefficient may already be in the number, or it can be an      */
   6906 /* external intermediate array.  If it is in the number, lsu must ==  */
   6907 /* dn->lsu and len must == dn->digits.                                */
   6908 /*                                                                    */
   6909 /* Note that the coefficient length (len) may be < set->digits, and   */
   6910 /* in this case this merely copies the coefficient (or is a no-op     */
   6911 /* if dn->lsu==lsu).                                                  */
   6912 /*                                                                    */
   6913 /* Note also that (only internally, from decQuantizeOp and            */
   6914 /* decSetSubnormal) the value of set->digits may be less than one,    */
   6915 /* indicating a round to left.  This routine handles that case        */
   6916 /* correctly; caller ensures space.                                   */
   6917 /*                                                                    */
   6918 /* dn->digits, dn->lsu (and as required), and dn->exponent are        */
   6919 /* updated as necessary.   dn->bits (sign) is unchanged.              */
   6920 /*                                                                    */
   6921 /* DEC_Rounded status is set if any digits are discarded.             */
   6922 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
   6923 /*                       incoming residue was non-0 (implies rounded) */
   6924 /* ------------------------------------------------------------------ */
   6925 /* mapping array: maps 0-9 to canonical residues, so that a residue  */
   6926 /* can be adjusted in the range [-1, +1] and achieve correct rounding  */
   6927 /*                             0  1  2  3  4  5  6  7  8  9  */
   6928 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
   6929 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
   6930                         Int len, Int *residue, uInt *status) {
   6931   Int   discard;              /* number of digits to discard  */
   6932   uInt  cut;                  /* cut point in Unit  */
   6933   const Unit *up;             /* work  */
   6934   Unit  *target;              /* ..  */
   6935   Int   count;                /* ..  */
   6936   #if DECDPUN<=4
   6937   uInt  temp;                 /* ..  */
   6938   #endif
   6939 
   6940   discard=len-set->digits;    /* digits to discard  */
   6941   if (discard<=0) {           /* no digits are being discarded  */
   6942     if (dn->lsu!=lsu) {       /* copy needed  */
   6943       /* copy the coefficient array to the result number; no shift needed  */
   6944       count=len;              /* avoids D2U  */
   6945       up=lsu;
   6946       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   6947         *target=*up;
   6948       dn->digits=len;         /* set the new length  */
   6949       }
   6950     /* dn->exponent and residue are unchanged, record any inexactitude  */
   6951     if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
   6952     return;
   6953     }
   6954 
   6955   /* some digits must be discarded ...  */
   6956   dn->exponent+=discard;      /* maintain numerical value  */
   6957   *status|=DEC_Rounded;       /* accumulate Rounded status  */
   6958   if (*residue>1) *residue=1; /* previous residue now to right, so reduce  */
   6959 
   6960   if (discard>len) {          /* everything, +1, is being discarded  */
   6961     /* guard digit is 0  */
   6962     /* residue is all the number [NB could be all 0s]  */
   6963     if (*residue<=0) {        /* not already positive  */
   6964       count=len;              /* avoids D2U  */
   6965       for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0  */
   6966         *residue=1;
   6967         break;                /* no need to check any others  */
   6968         }
   6969       }
   6970     if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude  */
   6971     *dn->lsu=0;               /* coefficient will now be 0  */
   6972     dn->digits=1;             /* ..  */
   6973     return;
   6974     } /* total discard  */
   6975 
   6976   /* partial discard [most common case]  */
   6977   /* here, at least the first (most significant) discarded digit exists  */
   6978 
   6979   /* spin up the number, noting residue during the spin, until get to  */
   6980   /* the Unit with the first discarded digit.  When reach it, extract  */
   6981   /* it and remember its position  */
   6982   count=0;
   6983   for (up=lsu;; up++) {
   6984     count+=DECDPUN;
   6985     if (count>=discard) break; /* full ones all checked  */
   6986     if (*up!=0) *residue=1;
   6987     } /* up  */
   6988 
   6989   /* here up -> Unit with first discarded digit  */
   6990   cut=discard-(count-DECDPUN)-1;
   6991   if (cut==DECDPUN-1) {       /* unit-boundary case (fast)  */
   6992     Unit half=(Unit)powers[DECDPUN]>>1;
   6993     /* set residue directly  */
   6994     if (*up>=half) {
   6995       if (*up>half) *residue=7;
   6996       else *residue+=5;       /* add sticky bit  */
   6997       }
   6998      else { /* <half  */
   6999       if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit]  */
   7000       }
   7001     if (set->digits<=0) {     /* special for Quantize/Subnormal :-(  */
   7002       *dn->lsu=0;             /* .. result is 0  */
   7003       dn->digits=1;           /* ..  */
   7004       }
   7005      else {                   /* shift to least  */
   7006       count=set->digits;      /* now digits to end up with  */
   7007       dn->digits=count;       /* set the new length  */
   7008       up++;                   /* move to next  */
   7009       /* on unit boundary, so shift-down copy loop is simple  */
   7010       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
   7011         *target=*up;
   7012       }
   7013     } /* unit-boundary case  */
   7014 
   7015    else { /* discard digit is in low digit(s), and not top digit  */
   7016     uInt  discard1;                /* first discarded digit  */
   7017     uInt  quot, rem;               /* for divisions  */
   7018     if (cut==0) quot=*up;          /* is at bottom of unit  */
   7019      else /* cut>0 */ {            /* it's not at bottom of unit  */
   7020       #if DECDPUN<=4
   7021         U_ASSERT(/* cut >= 0 &&*/ cut <= 4);
   7022         quot=QUOT10(*up, cut);
   7023         rem=*up-quot*powers[cut];
   7024       #else
   7025         rem=*up%powers[cut];
   7026         quot=*up/powers[cut];
   7027       #endif
   7028       if (rem!=0) *residue=1;
   7029       }
   7030     /* discard digit is now at bottom of quot  */
   7031     #if DECDPUN<=4
   7032       temp=(quot*6554)>>16;        /* fast /10  */
   7033       /* Vowels algorithm here not a win (9 instructions)  */
   7034       discard1=quot-X10(temp);
   7035       quot=temp;
   7036     #else
   7037       discard1=quot%10;
   7038       quot=quot/10;
   7039     #endif
   7040     /* here, discard1 is the guard digit, and residue is everything  */
   7041     /* else [use mapping array to accumulate residue safely]  */
   7042     *residue+=resmap[discard1];
   7043     cut++;                         /* update cut  */
   7044     /* here: up -> Unit of the array with bottom digit  */
   7045     /*       cut is the division point for each Unit  */
   7046     /*       quot holds the uncut high-order digits for the current unit  */
   7047     if (set->digits<=0) {          /* special for Quantize/Subnormal :-(  */
   7048       *dn->lsu=0;                  /* .. result is 0  */
   7049       dn->digits=1;                /* ..  */
   7050       }
   7051      else {                        /* shift to least needed  */
   7052       count=set->digits;           /* now digits to end up with  */
   7053       dn->digits=count;            /* set the new length  */
   7054       /* shift-copy the coefficient array to the result number  */
   7055       for (target=dn->lsu; ; target++) {
   7056         *target=(Unit)quot;
   7057         count-=(DECDPUN-cut);
   7058         if (count<=0) break;
   7059         up++;
   7060         quot=*up;
   7061         #if DECDPUN<=4
   7062           quot=QUOT10(quot, cut);
   7063           rem=*up-quot*powers[cut];
   7064         #else
   7065           rem=quot%powers[cut];
   7066           quot=quot/powers[cut];
   7067         #endif
   7068         *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
   7069         count-=cut;
   7070         if (count<=0) break;
   7071         } /* shift-copy loop  */
   7072       } /* shift to least  */
   7073     } /* not unit boundary  */
   7074 
   7075   if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude  */
   7076   return;
   7077   } /* decSetCoeff  */
   7078 
   7079 /* ------------------------------------------------------------------ */
   7080 /* decApplyRound -- apply pending rounding to a number                */
   7081 /*                                                                    */
   7082 /*   dn    is the number, with space for set->digits digits           */
   7083 /*   set   is the context [for size and rounding mode]                */
   7084 /*   residue indicates pending rounding, being any accumulated        */
   7085 /*         guard and sticky information.  It may be:                  */
   7086 /*         6-9: rounding digit is >5                                  */
   7087 /*         5:   rounding digit is exactly half-way                    */
   7088 /*         1-4: rounding digit is <5 and >0                           */
   7089 /*         0:   the coefficient is exact                              */
   7090 /*        -1:   as 1, but the hidden digits are subtractive, that     */
   7091 /*              is, of the opposite sign to dn.  In this case the     */
   7092 /*              coefficient must be non-0.  This case occurs when     */
   7093 /*              subtracting a small number (which can be reduced to   */
   7094 /*              a sticky bit); see decAddOp.                          */
   7095 /*   status is the status accumulator, as usual                       */
   7096 /*                                                                    */
   7097 /* This routine applies rounding while keeping the length of the      */
   7098 /* coefficient constant.  The exponent and status are unchanged       */
   7099 /* except if:                                                         */
   7100 /*                                                                    */
   7101 /*   -- the coefficient was increased and is all nines (in which      */
   7102 /*      case Overflow could occur, and is handled directly here so    */
   7103 /*      the caller does not need to re-test for overflow)             */
   7104 /*                                                                    */
   7105 /*   -- the coefficient was decreased and becomes all nines (in which */
   7106 /*      case Underflow could occur, and is also handled directly).    */
   7107 /*                                                                    */
   7108 /* All fields in dn are updated as required.                          */
   7109 /*                                                                    */
   7110 /* ------------------------------------------------------------------ */
   7111 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
   7112                           uInt *status) {
   7113   Int  bump;                  /* 1 if coefficient needs to be incremented  */
   7114                               /* -1 if coefficient needs to be decremented  */
   7115 
   7116   if (residue==0) return;     /* nothing to apply  */
   7117 
   7118   bump=0;                     /* assume a smooth ride  */
   7119 
   7120   /* now decide whether, and how, to round, depending on mode  */
   7121   switch (set->round) {
   7122     case DEC_ROUND_05UP: {    /* round zero or five up (for reround)  */
   7123       /* This is the same as DEC_ROUND_DOWN unless there is a  */
   7124       /* positive residue and the lsd of dn is 0 or 5, in which case  */
   7125       /* it is bumped; when residue is <0, the number is therefore  */
   7126       /* bumped down unless the final digit was 1 or 6 (in which  */
   7127       /* case it is bumped down and then up -- a no-op)  */
   7128       Int lsd5=*dn->lsu%5;     /* get lsd and quintate  */
   7129       if (residue<0 && lsd5!=1) bump=-1;
   7130        else if (residue>0 && lsd5==0) bump=1;
   7131       /* [bump==1 could be applied directly; use common path for clarity]  */
   7132       break;} /* r-05  */
   7133 
   7134     case DEC_ROUND_DOWN: {
   7135       /* no change, except if negative residue  */
   7136       if (residue<0) bump=-1;
   7137       break;} /* r-d  */
   7138 
   7139     case DEC_ROUND_HALF_DOWN: {
   7140       if (residue>5) bump=1;
   7141       break;} /* r-h-d  */
   7142 
   7143     case DEC_ROUND_HALF_EVEN: {
   7144       if (residue>5) bump=1;            /* >0.5 goes up  */
   7145        else if (residue==5) {           /* exactly 0.5000...  */
   7146         /* 0.5 goes up iff [new] lsd is odd  */
   7147         if (*dn->lsu & 0x01) bump=1;
   7148         }
   7149       break;} /* r-h-e  */
   7150 
   7151     case DEC_ROUND_HALF_UP: {
   7152       if (residue>=5) bump=1;
   7153       break;} /* r-h-u  */
   7154 
   7155     case DEC_ROUND_UP: {
   7156       if (residue>0) bump=1;
   7157       break;} /* r-u  */
   7158 
   7159     case DEC_ROUND_CEILING: {
   7160       /* same as _UP for positive numbers, and as _DOWN for negatives  */
   7161       /* [negative residue cannot occur on 0]  */
   7162       if (decNumberIsNegative(dn)) {
   7163         if (residue<0) bump=-1;
   7164         }
   7165        else {
   7166         if (residue>0) bump=1;
   7167         }
   7168       break;} /* r-c  */
   7169 
   7170     case DEC_ROUND_FLOOR: {
   7171       /* same as _UP for negative numbers, and as _DOWN for positive  */
   7172       /* [negative residue cannot occur on 0]  */
   7173       if (!decNumberIsNegative(dn)) {
   7174         if (residue<0) bump=-1;
   7175         }
   7176        else {
   7177         if (residue>0) bump=1;
   7178         }
   7179       break;} /* r-f  */
   7180 
   7181     default: {      /* e.g., DEC_ROUND_MAX  */
   7182       *status|=DEC_Invalid_context;
   7183       #if DECTRACE || (DECCHECK && DECVERB)
   7184       printf("Unknown rounding mode: %d\n", set->round);
   7185       #endif
   7186       break;}
   7187     } /* switch  */
   7188 
   7189   /* now bump the number, up or down, if need be  */
   7190   if (bump==0) return;                       /* no action required  */
   7191 
   7192   /* Simply use decUnitAddSub unless bumping up and the number is  */
   7193   /* all nines.  In this special case set to 100... explicitly  */
   7194   /* and adjust the exponent by one (as otherwise could overflow  */
   7195   /* the array)  */
   7196   /* Similarly handle all-nines result if bumping down.  */
   7197   if (bump>0) {
   7198     Unit *up;                                /* work  */
   7199     uInt count=dn->digits;                   /* digits to be checked  */
   7200     for (up=dn->lsu; ; up++) {
   7201       if (count<=DECDPUN) {
   7202         /* this is the last Unit (the msu)  */
   7203         if (*up!=powers[count]-1) break;     /* not still 9s  */
   7204         /* here if it, too, is all nines  */
   7205         *up=(Unit)powers[count-1];           /* here 999 -> 100 etc.  */
   7206         for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0  */
   7207         dn->exponent++;                      /* and bump exponent  */
   7208         /* [which, very rarely, could cause Overflow...]  */
   7209         if ((dn->exponent+dn->digits)>set->emax+1) {
   7210           decSetOverflow(dn, set, status);
   7211           }
   7212         return;                              /* done  */
   7213         }
   7214       /* a full unit to check, with more to come  */
   7215       if (*up!=DECDPUNMAX) break;            /* not still 9s  */
   7216       count-=DECDPUN;
   7217       } /* up  */
   7218     } /* bump>0  */
   7219    else {                                    /* -1  */
   7220     /* here checking for a pre-bump of 1000... (leading 1, all  */
   7221     /* other digits zero)  */
   7222     Unit *up, *sup;                          /* work  */
   7223     uInt count=dn->digits;                   /* digits to be checked  */
   7224     for (up=dn->lsu; ; up++) {
   7225       if (count<=DECDPUN) {
   7226         /* this is the last Unit (the msu)  */
   7227         if (*up!=powers[count-1]) break;     /* not 100..  */
   7228         /* here if have the 1000... case  */
   7229         sup=up;                              /* save msu pointer  */
   7230         *up=(Unit)powers[count]-1;           /* here 100 in msu -> 999  */
   7231         /* others all to all-nines, too  */
   7232         for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
   7233         dn->exponent--;                      /* and bump exponent  */
   7234 
   7235         /* iff the number was at the subnormal boundary (exponent=etiny)  */
   7236         /* then the exponent is now out of range, so it will in fact get  */
   7237         /* clamped to etiny and the final 9 dropped.  */
   7238         /* printf(">> emin=%d exp=%d sdig=%d\n", set->emin,  */
   7239         /*        dn->exponent, set->digits);  */
   7240         if (dn->exponent+1==set->emin-set->digits+1) {
   7241           if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9]  */
   7242            else {
   7243             *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99..  */
   7244             dn->digits--;
   7245             }
   7246           dn->exponent++;
   7247           *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7248           }
   7249         return;                              /* done  */
   7250         }
   7251 
   7252       /* a full unit to check, with more to come  */
   7253       if (*up!=0) break;                     /* not still 0s  */
   7254       count-=DECDPUN;
   7255       } /* up  */
   7256 
   7257     } /* bump<0  */
   7258 
   7259   /* Actual bump needed.  Do it.  */
   7260   decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
   7261   } /* decApplyRound  */
   7262 
   7263 #if DECSUBSET
   7264 /* ------------------------------------------------------------------ */
   7265 /* decFinish -- finish processing a number                            */
   7266 /*                                                                    */
   7267 /*   dn is the number                                                 */
   7268 /*   set is the context                                               */
   7269 /*   residue is the rounding accumulator (as in decApplyRound)        */
   7270 /*   status is the accumulator                                        */
   7271 /*                                                                    */
   7272 /* This finishes off the current number by:                           */
   7273 /*    1. If not extended:                                             */
   7274 /*       a. Converting a zero result to clean '0'                     */
   7275 /*       b. Reducing positive exponents to 0, if would fit in digits  */
   7276 /*    2. Checking for overflow and subnormals (always)                */
   7277 /* Note this is just Finalize when no subset arithmetic.              */
   7278 /* All fields are updated as required.                                */
   7279 /* ------------------------------------------------------------------ */
   7280 static void decFinish(decNumber *dn, decContext *set, Int *residue,
   7281                       uInt *status) {
   7282   if (!set->extended) {
   7283     if ISZERO(dn) {                /* value is zero  */
   7284       dn->exponent=0;              /* clean exponent ..  */
   7285       dn->bits=0;                  /* .. and sign  */
   7286       return;                      /* no error possible  */
   7287       }
   7288     if (dn->exponent>=0) {         /* non-negative exponent  */
   7289       /* >0; reduce to integer if possible  */
   7290       if (set->digits >= (dn->exponent+dn->digits)) {
   7291         dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
   7292         dn->exponent=0;
   7293         }
   7294       }
   7295     } /* !extended  */
   7296 
   7297   decFinalize(dn, set, residue, status);
   7298   } /* decFinish  */
   7299 #endif
   7300 
   7301 /* ------------------------------------------------------------------ */
   7302 /* decFinalize -- final check, clamp, and round of a number           */
   7303 /*                                                                    */
   7304 /*   dn is the number                                                 */
   7305 /*   set is the context                                               */
   7306 /*   residue is the rounding accumulator (as in decApplyRound)        */
   7307 /*   status is the status accumulator                                 */
   7308 /*                                                                    */
   7309 /* This finishes off the current number by checking for subnormal     */
   7310 /* results, applying any pending rounding, checking for overflow,     */
   7311 /* and applying any clamping.                                         */
   7312 /* Underflow and overflow conditions are raised as appropriate.       */
   7313 /* All fields are updated as required.                                */
   7314 /* ------------------------------------------------------------------ */
   7315 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
   7316                         uInt *status) {
   7317   Int shift;                            /* shift needed if clamping  */
   7318   Int tinyexp=set->emin-dn->digits+1;   /* precalculate subnormal boundary  */
   7319 
   7320   /* Must be careful, here, when checking the exponent as the  */
   7321   /* adjusted exponent could overflow 31 bits [because it may already  */
   7322   /* be up to twice the expected].  */
   7323 
   7324   /* First test for subnormal.  This must be done before any final  */
   7325   /* round as the result could be rounded to Nmin or 0.  */
   7326   if (dn->exponent<=tinyexp) {          /* prefilter  */
   7327     Int comp;
   7328     decNumber nmin;
   7329     /* A very nasty case here is dn == Nmin and residue<0  */
   7330     if (dn->exponent<tinyexp) {
   7331       /* Go handle subnormals; this will apply round if needed.  */
   7332       decSetSubnormal(dn, set, residue, status);
   7333       return;
   7334       }
   7335     /* Equals case: only subnormal if dn=Nmin and negative residue  */
   7336     uprv_decNumberZero(&nmin);
   7337     nmin.lsu[0]=1;
   7338     nmin.exponent=set->emin;
   7339     comp=decCompare(dn, &nmin, 1);                /* (signless compare)  */
   7340     if (comp==BADINT) {                           /* oops  */
   7341       *status|=DEC_Insufficient_storage;          /* abandon...  */
   7342       return;
   7343       }
   7344     if (*residue<0 && comp==0) {                  /* neg residue and dn==Nmin  */
   7345       decApplyRound(dn, set, *residue, status);   /* might force down  */
   7346       decSetSubnormal(dn, set, residue, status);
   7347       return;
   7348       }
   7349     }
   7350 
   7351   /* now apply any pending round (this could raise overflow).  */
   7352   if (*residue!=0) decApplyRound(dn, set, *residue, status);
   7353 
   7354   /* Check for overflow [redundant in the 'rare' case] or clamp  */
   7355   if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed  */
   7356 
   7357 
   7358   /* here when might have an overflow or clamp to do  */
   7359   if (dn->exponent>set->emax-dn->digits+1) {           /* too big  */
   7360     decSetOverflow(dn, set, status);
   7361     return;
   7362     }
   7363   /* here when the result is normal but in clamp range  */
   7364   if (!set->clamp) return;
   7365 
   7366   /* here when need to apply the IEEE exponent clamp (fold-down)  */
   7367   shift=dn->exponent-(set->emax-set->digits+1);
   7368 
   7369   /* shift coefficient (if non-zero)  */
   7370   if (!ISZERO(dn)) {
   7371     dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
   7372     }
   7373   dn->exponent-=shift;   /* adjust the exponent to match  */
   7374   *status|=DEC_Clamped;  /* and record the dirty deed  */
   7375   return;
   7376   } /* decFinalize  */
   7377 
   7378 /* ------------------------------------------------------------------ */
   7379 /* decSetOverflow -- set number to proper overflow value              */
   7380 /*                                                                    */
   7381 /*   dn is the number (used for sign [only] and result)               */
   7382 /*   set is the context [used for the rounding mode, etc.]            */
   7383 /*   status contains the current status to be updated                 */
   7384 /*                                                                    */
   7385 /* This sets the sign of a number and sets its value to either        */
   7386 /* Infinity or the maximum finite value, depending on the sign of     */
   7387 /* dn and the rounding mode, following IEEE 754 rules.                */
   7388 /* ------------------------------------------------------------------ */
   7389 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
   7390   Flag needmax=0;                  /* result is maximum finite value  */
   7391   uByte sign=dn->bits&DECNEG;      /* clean and save sign bit  */
   7392 
   7393   if (ISZERO(dn)) {                /* zero does not overflow magnitude  */
   7394     Int emax=set->emax;                      /* limit value  */
   7395     if (set->clamp) emax-=set->digits-1;     /* lower if clamping  */
   7396     if (dn->exponent>emax) {                 /* clamp required  */
   7397       dn->exponent=emax;
   7398       *status|=DEC_Clamped;
   7399       }
   7400     return;
   7401     }
   7402 
   7403   uprv_decNumberZero(dn);
   7404   switch (set->round) {
   7405     case DEC_ROUND_DOWN: {
   7406       needmax=1;                   /* never Infinity  */
   7407       break;} /* r-d  */
   7408     case DEC_ROUND_05UP: {
   7409       needmax=1;                   /* never Infinity  */
   7410       break;} /* r-05  */
   7411     case DEC_ROUND_CEILING: {
   7412       if (sign) needmax=1;         /* Infinity if non-negative  */
   7413       break;} /* r-c  */
   7414     case DEC_ROUND_FLOOR: {
   7415       if (!sign) needmax=1;        /* Infinity if negative  */
   7416       break;} /* r-f  */
   7417     default: break;                /* Infinity in all other cases  */
   7418     }
   7419   if (needmax) {
   7420     decSetMaxValue(dn, set);
   7421     dn->bits=sign;                 /* set sign  */
   7422     }
   7423    else dn->bits=sign|DECINF;      /* Value is +/-Infinity  */
   7424   *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
   7425   } /* decSetOverflow  */
   7426 
   7427 /* ------------------------------------------------------------------ */
   7428 /* decSetMaxValue -- set number to +Nmax (maximum normal value)       */
   7429 /*                                                                    */
   7430 /*   dn is the number to set                                          */
   7431 /*   set is the context [used for digits and emax]                    */
   7432 /*                                                                    */
   7433 /* This sets the number to the maximum positive value.                */
   7434 /* ------------------------------------------------------------------ */
   7435 static void decSetMaxValue(decNumber *dn, decContext *set) {
   7436   Unit *up;                        /* work  */
   7437   Int count=set->digits;           /* nines to add  */
   7438   dn->digits=count;
   7439   /* fill in all nines to set maximum value  */
   7440   for (up=dn->lsu; ; up++) {
   7441     if (count>DECDPUN) *up=DECDPUNMAX;  /* unit full o'nines  */
   7442      else {                             /* this is the msu  */
   7443       *up=(Unit)(powers[count]-1);
   7444       break;
   7445       }
   7446     count-=DECDPUN;                /* filled those digits  */
   7447     } /* up  */
   7448   dn->bits=0;                      /* + sign  */
   7449   dn->exponent=set->emax-set->digits+1;
   7450   } /* decSetMaxValue  */
   7451 
   7452 /* ------------------------------------------------------------------ */
   7453 /* decSetSubnormal -- process value whose exponent is <Emin           */
   7454 /*                                                                    */
   7455 /*   dn is the number (used as input as well as output; it may have   */
   7456 /*         an allowed subnormal value, which may need to be rounded)  */
   7457 /*   set is the context [used for the rounding mode]                  */
   7458 /*   residue is any pending residue                                   */
   7459 /*   status contains the current status to be updated                 */
   7460 /*                                                                    */
   7461 /* If subset mode, set result to zero and set Underflow flags.        */
   7462 /*                                                                    */
   7463 /* Value may be zero with a low exponent; this does not set Subnormal */
   7464 /* but the exponent will be clamped to Etiny.                         */
   7465 /*                                                                    */
   7466 /* Otherwise ensure exponent is not out of range, and round as        */
   7467 /* necessary.  Underflow is set if the result is Inexact.             */
   7468 /* ------------------------------------------------------------------ */
   7469 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
   7470                             uInt *status) {
   7471   decContext workset;         /* work  */
   7472   Int        etiny, adjust;   /* ..  */
   7473 
   7474   #if DECSUBSET
   7475   /* simple set to zero and 'hard underflow' for subset  */
   7476   if (!set->extended) {
   7477     uprv_decNumberZero(dn);
   7478     /* always full overflow  */
   7479     *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
   7480     return;
   7481     }
   7482   #endif
   7483 
   7484   /* Full arithmetic -- allow subnormals, rounded to minimum exponent  */
   7485   /* (Etiny) if needed  */
   7486   etiny=set->emin-(set->digits-1);      /* smallest allowed exponent  */
   7487 
   7488   if ISZERO(dn) {                       /* value is zero  */
   7489     /* residue can never be non-zero here  */
   7490     #if DECCHECK
   7491       if (*residue!=0) {
   7492         printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
   7493         *status|=DEC_Invalid_operation;
   7494         }
   7495     #endif
   7496     if (dn->exponent<etiny) {           /* clamp required  */
   7497       dn->exponent=etiny;
   7498       *status|=DEC_Clamped;
   7499       }
   7500     return;
   7501     }
   7502 
   7503   *status|=DEC_Subnormal;               /* have a non-zero subnormal  */
   7504   adjust=etiny-dn->exponent;            /* calculate digits to remove  */
   7505   if (adjust<=0) {                      /* not out of range; unrounded  */
   7506     /* residue can never be non-zero here, except in the Nmin-residue  */
   7507     /* case (which is a subnormal result), so can take fast-path here  */
   7508     /* it may already be inexact (from setting the coefficient)  */
   7509     if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7510     return;
   7511     }
   7512 
   7513   /* adjust>0, so need to rescale the result so exponent becomes Etiny  */
   7514   /* [this code is similar to that in rescale]  */
   7515   workset=*set;                         /* clone rounding, etc.  */
   7516   workset.digits=dn->digits-adjust;     /* set requested length  */
   7517   workset.emin-=adjust;                 /* and adjust emin to match  */
   7518   /* [note that the latter can be <1, here, similar to Rescale case]  */
   7519   decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
   7520   decApplyRound(dn, &workset, *residue, status);
   7521 
   7522   /* Use 754 default rule: Underflow is set iff Inexact  */
   7523   /* [independent of whether trapped]  */
   7524   if (*status&DEC_Inexact) *status|=DEC_Underflow;
   7525 
   7526   /* if rounded up a 999s case, exponent will be off by one; adjust  */
   7527   /* back if so [it will fit, because it was shortened earlier]  */
   7528   if (dn->exponent>etiny) {
   7529     dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
   7530     dn->exponent--;                     /* (re)adjust the exponent.  */
   7531     }
   7532 
   7533   /* if rounded to zero, it is by definition clamped...  */
   7534   if (ISZERO(dn)) *status|=DEC_Clamped;
   7535   } /* decSetSubnormal  */
   7536 
   7537 /* ------------------------------------------------------------------ */
   7538 /* decCheckMath - check entry conditions for a math function          */
   7539 /*                                                                    */
   7540 /*   This checks the context and the operand                          */
   7541 /*                                                                    */
   7542 /*   rhs is the operand to check                                      */
   7543 /*   set is the context to check                                      */
   7544 /*   status is unchanged if both are good                             */
   7545 /*                                                                    */
   7546 /* returns non-zero if status is changed, 0 otherwise                 */
   7547 /*                                                                    */
   7548 /* Restrictions enforced:                                             */
   7549 /*                                                                    */
   7550 /*   digits, emax, and -emin in the context must be less than         */
   7551 /*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
   7552 /*   non-zero.  Invalid_operation is set in the status if a           */
   7553 /*   restriction is violated.                                         */
   7554 /* ------------------------------------------------------------------ */
   7555 static uInt decCheckMath(const decNumber *rhs, decContext *set,
   7556                          uInt *status) {
   7557   uInt save=*status;                         /* record  */
   7558   if (set->digits>DEC_MAX_MATH
   7559    || set->emax>DEC_MAX_MATH
   7560    || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
   7561    else if ((rhs->digits>DEC_MAX_MATH
   7562      || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
   7563      || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
   7564      && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
   7565   return (*status!=save);
   7566   } /* decCheckMath  */
   7567 
   7568 /* ------------------------------------------------------------------ */
   7569 /* decGetInt -- get integer from a number                             */
   7570 /*                                                                    */
   7571 /*   dn is the number [which will not be altered]                     */
   7572 /*                                                                    */
   7573 /*   returns one of:                                                  */
   7574 /*     BADINT if there is a non-zero fraction                         */
   7575 /*     the converted integer                                          */
   7576 /*     BIGEVEN if the integer is even and magnitude > 2*10**9         */
   7577 /*     BIGODD  if the integer is odd  and magnitude > 2*10**9         */
   7578 /*                                                                    */
   7579 /* This checks and gets a whole number from the input decNumber.      */
   7580 /* The sign can be determined from dn by the caller when BIGEVEN or   */
   7581 /* BIGODD is returned.                                                */
   7582 /* ------------------------------------------------------------------ */
   7583 static Int decGetInt(const decNumber *dn) {
   7584   Int  theInt;                          /* result accumulator  */
   7585   const Unit *up;                       /* work  */
   7586   Int  got;                             /* digits (real or not) processed  */
   7587   Int  ilength=dn->digits+dn->exponent; /* integral length  */
   7588   Flag neg=decNumberIsNegative(dn);     /* 1 if -ve  */
   7589 
   7590   /* The number must be an integer that fits in 10 digits  */
   7591   /* Assert, here, that 10 is enough for any rescale Etiny  */
   7592   #if DEC_MAX_EMAX > 999999999
   7593     #error GetInt may need updating [for Emax]
   7594   #endif
   7595   #if DEC_MIN_EMIN < -999999999
   7596     #error GetInt may need updating [for Emin]
   7597   #endif
   7598   if (ISZERO(dn)) return 0;             /* zeros are OK, with any exponent  */
   7599 
   7600   up=dn->lsu;                           /* ready for lsu  */
   7601   theInt=0;                             /* ready to accumulate  */
   7602   if (dn->exponent>=0) {                /* relatively easy  */
   7603     /* no fractional part [usual]; allow for positive exponent  */
   7604     got=dn->exponent;
   7605     }
   7606    else { /* -ve exponent; some fractional part to check and discard  */
   7607     Int count=-dn->exponent;            /* digits to discard  */
   7608     /* spin up whole units until reach the Unit with the unit digit  */
   7609     for (; count>=DECDPUN; up++) {
   7610       if (*up!=0) return BADINT;        /* non-zero Unit to discard  */
   7611       count-=DECDPUN;
   7612       }
   7613     if (count==0) got=0;                /* [a multiple of DECDPUN]  */
   7614      else {                             /* [not multiple of DECDPUN]  */
   7615       Int rem;                          /* work  */
   7616       /* slice off fraction digits and check for non-zero  */
   7617       #if DECDPUN<=4
   7618         theInt=QUOT10(*up, count);
   7619         rem=*up-theInt*powers[count];
   7620       #else
   7621         rem=*up%powers[count];          /* slice off discards  */
   7622         theInt=*up/powers[count];
   7623       #endif
   7624       if (rem!=0) return BADINT;        /* non-zero fraction  */
   7625       /* it looks good  */
   7626       got=DECDPUN-count;                /* number of digits so far  */
   7627       up++;                             /* ready for next  */
   7628       }
   7629     }
   7630   /* now it's known there's no fractional part  */
   7631 
   7632   /* tricky code now, to accumulate up to 9.3 digits  */
   7633   if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there  */
   7634 
   7635   if (ilength<11) {
   7636     Int save=theInt;
   7637     /* collect any remaining unit(s)  */
   7638     for (; got<ilength; up++) {
   7639       theInt+=*up*powers[got];
   7640       got+=DECDPUN;
   7641       }
   7642     if (ilength==10) {                  /* need to check for wrap  */
   7643       if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
   7644          /* [that test also disallows the BADINT result case]  */
   7645        else if (neg && theInt>1999999997) ilength=11;
   7646        else if (!neg && theInt>999999999) ilength=11;
   7647       if (ilength==11) theInt=save;     /* restore correct low bit  */
   7648       }
   7649     }
   7650 
   7651   if (ilength>10) {                     /* too big  */
   7652     if (theInt&1) return BIGODD;        /* bottom bit 1  */
   7653     return BIGEVEN;                     /* bottom bit 0  */
   7654     }
   7655 
   7656   if (neg) theInt=-theInt;              /* apply sign  */
   7657   return theInt;
   7658   } /* decGetInt  */
   7659 
   7660 /* ------------------------------------------------------------------ */
   7661 /* decDecap -- decapitate the coefficient of a number                 */
   7662 /*                                                                    */
   7663 /*   dn   is the number to be decapitated                             */
   7664 /*   drop is the number of digits to be removed from the left of dn;  */
   7665 /*     this must be <= dn->digits (if equal, the coefficient is       */
   7666 /*     set to 0)                                                      */
   7667 /*                                                                    */
   7668 /* Returns dn; dn->digits will be <= the initial digits less drop     */
   7669 /* (after removing drop digits there may be leading zero digits       */
   7670 /* which will also be removed).  Only dn->lsu and dn->digits change.  */
   7671 /* ------------------------------------------------------------------ */
   7672 static decNumber *decDecap(decNumber *dn, Int drop) {
   7673   Unit *msu;                            /* -> target cut point  */
   7674   Int cut;                              /* work  */
   7675   if (drop>=dn->digits) {               /* losing the whole thing  */
   7676     #if DECCHECK
   7677     if (drop>dn->digits)
   7678       printf("decDecap called with drop>digits [%ld>%ld]\n",
   7679              (LI)drop, (LI)dn->digits);
   7680     #endif
   7681     dn->lsu[0]=0;
   7682     dn->digits=1;
   7683     return dn;
   7684     }
   7685   msu=dn->lsu+D2U(dn->digits-drop)-1;   /* -> likely msu  */
   7686   cut=MSUDIGITS(dn->digits-drop);       /* digits to be in use in msu  */
   7687   if (cut!=DECDPUN) *msu%=powers[cut];  /* clear left digits  */
   7688   /* that may have left leading zero digits, so do a proper count...  */
   7689   dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
   7690   return dn;
   7691   } /* decDecap  */
   7692 
   7693 /* ------------------------------------------------------------------ */
   7694 /* decBiStr -- compare string with pairwise options                   */
   7695 /*                                                                    */
   7696 /*   targ is the string to compare                                    */
   7697 /*   str1 is one of the strings to compare against (length may be 0)  */
   7698 /*   str2 is the other; it must be the same length as str1            */
   7699 /*                                                                    */
   7700 /*   returns 1 if strings compare equal, (that is, it is the same     */
   7701 /*   length as str1 and str2, and each character of targ is in either */
   7702 /*   str1 or str2 in the corresponding position), or 0 otherwise      */
   7703 /*                                                                    */
   7704 /* This is used for generic caseless compare, including the awkward   */
   7705 /* case of the Turkish dotted and dotless Is.  Use as (for example):  */
   7706 /*   if (decBiStr(test, "mike", "MIKE")) ...                          */
   7707 /* ------------------------------------------------------------------ */
   7708 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
   7709   for (;;targ++, str1++, str2++) {
   7710     if (*targ!=*str1 && *targ!=*str2) return 0;
   7711     /* *targ has a match in one (or both, if terminator)  */
   7712     if (*targ=='\0') break;
   7713     } /* forever  */
   7714   return 1;
   7715   } /* decBiStr  */
   7716 
   7717 /* ------------------------------------------------------------------ */
   7718 /* decNaNs -- handle NaN operand or operands                          */
   7719 /*                                                                    */
   7720 /*   res     is the result number                                     */
   7721 /*   lhs     is the first operand                                     */
   7722 /*   rhs     is the second operand, or NULL if none                   */
   7723 /*   context is used to limit payload length                          */
   7724 /*   status  contains the current status                              */
   7725 /*   returns res in case convenient                                   */
   7726 /*                                                                    */
   7727 /* Called when one or both operands is a NaN, and propagates the      */
   7728 /* appropriate result to res.  When an sNaN is found, it is changed   */
   7729 /* to a qNaN and Invalid operation is set.                            */
   7730 /* ------------------------------------------------------------------ */
   7731 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
   7732                            const decNumber *rhs, decContext *set,
   7733                            uInt *status) {
   7734   /* This decision tree ends up with LHS being the source pointer,  */
   7735   /* and status updated if need be  */
   7736   if (lhs->bits & DECSNAN)
   7737     *status|=DEC_Invalid_operation | DEC_sNaN;
   7738    else if (rhs==NULL);
   7739    else if (rhs->bits & DECSNAN) {
   7740     lhs=rhs;
   7741     *status|=DEC_Invalid_operation | DEC_sNaN;
   7742     }
   7743    else if (lhs->bits & DECNAN);
   7744    else lhs=rhs;
   7745 
   7746   /* propagate the payload  */
   7747   if (lhs->digits<=set->digits) uprv_decNumberCopy(res, lhs); /* easy  */
   7748    else { /* too long  */
   7749     const Unit *ul;
   7750     Unit *ur, *uresp1;
   7751     /* copy safe number of units, then decapitate  */
   7752     res->bits=lhs->bits;                /* need sign etc.  */
   7753     uresp1=res->lsu+D2U(set->digits);
   7754     for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
   7755     res->digits=D2U(set->digits)*DECDPUN;
   7756     /* maybe still too long  */
   7757     if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
   7758     }
   7759 
   7760   res->bits&=~DECSNAN;        /* convert any sNaN to NaN, while  */
   7761   res->bits|=DECNAN;          /* .. preserving sign  */
   7762   res->exponent=0;            /* clean exponent  */
   7763                               /* [coefficient was copied/decapitated]  */
   7764   return res;
   7765   } /* decNaNs  */
   7766 
   7767 /* ------------------------------------------------------------------ */
   7768 /* decStatus -- apply non-zero status                                 */
   7769 /*                                                                    */
   7770 /*   dn     is the number to set if error                             */
   7771 /*   status contains the current status (not yet in context)          */
   7772 /*   set    is the context                                            */
   7773 /*                                                                    */
   7774 /* If the status is an error status, the number is set to a NaN,      */
   7775 /* unless the error was an overflow, divide-by-zero, or underflow,    */
   7776 /* in which case the number will have already been set.               */
   7777 /*                                                                    */
   7778 /* The context status is then updated with the new status.  Note that */
   7779 /* this may raise a signal, so control may never return from this     */
   7780 /* routine (hence resources must be recovered before it is called).   */
   7781 /* ------------------------------------------------------------------ */
   7782 static void decStatus(decNumber *dn, uInt status, decContext *set) {
   7783   if (status & DEC_NaNs) {              /* error status -> NaN  */
   7784     /* if cause was an sNaN, clear and propagate [NaN is already set up]  */
   7785     if (status & DEC_sNaN) status&=~DEC_sNaN;
   7786      else {
   7787       uprv_decNumberZero(dn);                /* other error: clean throughout  */
   7788       dn->bits=DECNAN;                  /* and make a quiet NaN  */
   7789       }
   7790     }
   7791   uprv_decContextSetStatus(set, status);     /* [may not return]  */
   7792   return;
   7793   } /* decStatus  */
   7794 
   7795 /* ------------------------------------------------------------------ */
   7796 /* decGetDigits -- count digits in a Units array                      */
   7797 /*                                                                    */
   7798 /*   uar is the Unit array holding the number (this is often an       */
   7799 /*          accumulator of some sort)                                 */
   7800 /*   len is the length of the array in units [>=1]                    */
   7801 /*                                                                    */
   7802 /*   returns the number of (significant) digits in the array          */
   7803 /*                                                                    */
   7804 /* All leading zeros are excluded, except the last if the array has   */
   7805 /* only zero Units.                                                   */
   7806 /* ------------------------------------------------------------------ */
   7807 /* This may be called twice during some operations.  */
   7808 static Int decGetDigits(Unit *uar, Int len) {
   7809   Unit *up=uar+(len-1);            /* -> msu  */
   7810   Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu  */
   7811   #if DECDPUN>4
   7812   uInt const *pow;                 /* work  */
   7813   #endif
   7814                                    /* (at least 1 in final msu)  */
   7815   #if DECCHECK
   7816   if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
   7817   #endif
   7818 
   7819   for (; up>=uar; up--) {
   7820     if (*up==0) {                  /* unit is all 0s  */
   7821       if (digits==1) break;        /* a zero has one digit  */
   7822       digits-=DECDPUN;             /* adjust for 0 unit  */
   7823       continue;}
   7824     /* found the first (most significant) non-zero Unit  */
   7825     #if DECDPUN>1                  /* not done yet  */
   7826     if (*up<10) break;             /* is 1-9  */
   7827     digits++;
   7828     #if DECDPUN>2                  /* not done yet  */
   7829     if (*up<100) break;            /* is 10-99  */
   7830     digits++;
   7831     #if DECDPUN>3                  /* not done yet  */
   7832     if (*up<1000) break;           /* is 100-999  */
   7833     digits++;
   7834     #if DECDPUN>4                  /* count the rest ...  */
   7835     for (pow=&powers[4]; *up>=*pow; pow++) digits++;
   7836     #endif
   7837     #endif
   7838     #endif
   7839     #endif
   7840     break;
   7841     } /* up  */
   7842   return digits;
   7843   } /* decGetDigits  */
   7844 
   7845 #if DECTRACE | DECCHECK
   7846 /* ------------------------------------------------------------------ */
   7847 /* decNumberShow -- display a number [debug aid]                      */
   7848 /*   dn is the number to show                                         */
   7849 /*                                                                    */
   7850 /* Shows: sign, exponent, coefficient (msu first), digits             */
   7851 /*    or: sign, special-value                                         */
   7852 /* ------------------------------------------------------------------ */
   7853 /* this is public so other modules can use it  */
   7854 void uprv_decNumberShow(const decNumber *dn) {
   7855   const Unit *up;                  /* work  */
   7856   uInt u, d;                       /* ..  */
   7857   Int cut;                         /* ..  */
   7858   char isign='+';                  /* main sign  */
   7859   if (dn==NULL) {
   7860     printf("NULL\n");
   7861     return;}
   7862   if (decNumberIsNegative(dn)) isign='-';
   7863   printf(" >> %c ", isign);
   7864   if (dn->bits&DECSPECIAL) {       /* Is a special value  */
   7865     if (decNumberIsInfinite(dn)) printf("Infinity");
   7866      else {                                  /* a NaN  */
   7867       if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN  */
   7868        else printf("NaN");
   7869       }
   7870     /* if coefficient and exponent are 0, no more to do  */
   7871     if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
   7872       printf("\n");
   7873       return;}
   7874     /* drop through to report other information  */
   7875     printf(" ");
   7876     }
   7877 
   7878   /* now carefully display the coefficient  */
   7879   up=dn->lsu+D2U(dn->digits)-1;         /* msu  */
   7880   printf("%ld", (LI)*up);
   7881   for (up=up-1; up>=dn->lsu; up--) {
   7882     u=*up;
   7883     printf(":");
   7884     for (cut=DECDPUN-1; cut>=0; cut--) {
   7885       d=u/powers[cut];
   7886       u-=d*powers[cut];
   7887       printf("%ld", (LI)d);
   7888       } /* cut  */
   7889     } /* up  */
   7890   if (dn->exponent!=0) {
   7891     char esign='+';
   7892     if (dn->exponent<0) esign='-';
   7893     printf(" E%c%ld", esign, (LI)abs(dn->exponent));
   7894     }
   7895   printf(" [%ld]\n", (LI)dn->digits);
   7896   } /* decNumberShow  */
   7897 #endif
   7898 
   7899 #if DECTRACE || DECCHECK
   7900 /* ------------------------------------------------------------------ */
   7901 /* decDumpAr -- display a unit array [debug/check aid]                */
   7902 /*   name is a single-character tag name                              */
   7903 /*   ar   is the array to display                                     */
   7904 /*   len  is the length of the array in Units                         */
   7905 /* ------------------------------------------------------------------ */
   7906 static void decDumpAr(char name, const Unit *ar, Int len) {
   7907   Int i;
   7908   const char *spec;
   7909   #if DECDPUN==9
   7910     spec="%09d ";
   7911   #elif DECDPUN==8
   7912     spec="%08d ";
   7913   #elif DECDPUN==7
   7914     spec="%07d ";
   7915   #elif DECDPUN==6
   7916     spec="%06d ";
   7917   #elif DECDPUN==5
   7918     spec="%05d ";
   7919   #elif DECDPUN==4
   7920     spec="%04d ";
   7921   #elif DECDPUN==3
   7922     spec="%03d ";
   7923   #elif DECDPUN==2
   7924     spec="%02d ";
   7925   #else
   7926     spec="%d ";
   7927   #endif
   7928   printf("  :%c: ", name);
   7929   for (i=len-1; i>=0; i--) {
   7930     if (i==len-1) printf("%ld ", (LI)ar[i]);
   7931      else printf(spec, ar[i]);
   7932     }
   7933   printf("\n");
   7934   return;}
   7935 #endif
   7936 
   7937 #if DECCHECK
   7938 /* ------------------------------------------------------------------ */
   7939 /* decCheckOperands -- check operand(s) to a routine                  */
   7940 /*   res is the result structure (not checked; it will be set to      */
   7941 /*          quiet NaN if error found (and it is not NULL))            */
   7942 /*   lhs is the first operand (may be DECUNRESU)                      */
   7943 /*   rhs is the second (may be DECUNUSED)                             */
   7944 /*   set is the context (may be DECUNCONT)                            */
   7945 /*   returns 0 if both operands, and the context are clean, or 1      */
   7946 /*     otherwise (in which case the context will show an error,       */
   7947 /*     unless NULL).  Note that res is not cleaned; caller should     */
   7948 /*     handle this so res=NULL case is safe.                          */
   7949 /* The caller is expected to abandon immediately if 1 is returned.    */
   7950 /* ------------------------------------------------------------------ */
   7951 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
   7952                              const decNumber *rhs, decContext *set) {
   7953   Flag bad=0;
   7954   if (set==NULL) {                 /* oops; hopeless  */
   7955     #if DECTRACE || DECVERB
   7956     printf("Reference to context is NULL.\n");
   7957     #endif
   7958     bad=1;
   7959     return 1;}
   7960    else if (set!=DECUNCONT
   7961      && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
   7962     bad=1;
   7963     #if DECTRACE || DECVERB
   7964     printf("Bad context [digits=%ld round=%ld].\n",
   7965            (LI)set->digits, (LI)set->round);
   7966     #endif
   7967     }
   7968    else {
   7969     if (res==NULL) {
   7970       bad=1;
   7971       #if DECTRACE
   7972       /* this one not DECVERB as standard tests include NULL  */
   7973       printf("Reference to result is NULL.\n");
   7974       #endif
   7975       }
   7976     if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
   7977     if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
   7978     }
   7979   if (bad) {
   7980     if (set!=DECUNCONT) uprv_decContextSetStatus(set, DEC_Invalid_operation);
   7981     if (res!=DECUNRESU && res!=NULL) {
   7982       uprv_decNumberZero(res);
   7983       res->bits=DECNAN;       /* qNaN  */
   7984       }
   7985     }
   7986   return bad;
   7987   } /* decCheckOperands  */
   7988 
   7989 /* ------------------------------------------------------------------ */
   7990 /* decCheckNumber -- check a number                                   */
   7991 /*   dn is the number to check                                        */
   7992 /*   returns 0 if the number is clean, or 1 otherwise                 */
   7993 /*                                                                    */
   7994 /* The number is considered valid if it could be a result from some   */
   7995 /* operation in some valid context.                                   */
   7996 /* ------------------------------------------------------------------ */
   7997 static Flag decCheckNumber(const decNumber *dn) {
   7998   const Unit *up;             /* work  */
   7999   uInt maxuint;               /* ..  */
   8000   Int ae, d, digits;          /* ..  */
   8001   Int emin, emax;             /* ..  */
   8002 
   8003   if (dn==NULL) {             /* hopeless  */
   8004     #if DECTRACE
   8005     /* this one not DECVERB as standard tests include NULL  */
   8006     printf("Reference to decNumber is NULL.\n");
   8007     #endif
   8008     return 1;}
   8009 
   8010   /* check special values  */
   8011   if (dn->bits & DECSPECIAL) {
   8012     if (dn->exponent!=0) {
   8013       #if DECTRACE || DECVERB
   8014       printf("Exponent %ld (not 0) for a special value [%02x].\n",
   8015              (LI)dn->exponent, dn->bits);
   8016       #endif
   8017       return 1;}
   8018 
   8019     /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only  */
   8020     if (decNumberIsInfinite(dn)) {
   8021       if (dn->digits!=1) {
   8022         #if DECTRACE || DECVERB
   8023         printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
   8024         #endif
   8025         return 1;}
   8026       if (*dn->lsu!=0) {
   8027         #if DECTRACE || DECVERB
   8028         printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
   8029         #endif
   8030         decDumpAr('I', dn->lsu, D2U(dn->digits));
   8031         return 1;}
   8032       } /* Inf  */
   8033     /* 2002.12.26: negative NaNs can now appear through proposed IEEE  */
   8034     /*             concrete formats (decimal64, etc.).  */
   8035     return 0;
   8036     }
   8037 
   8038   /* check the coefficient  */
   8039   if (dn->digits<1 || dn->digits>DECNUMMAXP) {
   8040     #if DECTRACE || DECVERB
   8041     printf("Digits %ld in number.\n", (LI)dn->digits);
   8042     #endif
   8043     return 1;}
   8044 
   8045   d=dn->digits;
   8046 
   8047   for (up=dn->lsu; d>0; up++) {
   8048     if (d>DECDPUN) maxuint=DECDPUNMAX;
   8049      else {                   /* reached the msu  */
   8050       maxuint=powers[d]-1;
   8051       if (dn->digits>1 && *up<powers[d-1]) {
   8052         #if DECTRACE || DECVERB
   8053         printf("Leading 0 in number.\n");
   8054         uprv_decNumberShow(dn);
   8055         #endif
   8056         return 1;}
   8057       }
   8058     if (*up>maxuint) {
   8059       #if DECTRACE || DECVERB
   8060       printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
   8061               (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
   8062       #endif
   8063       return 1;}
   8064     d-=DECDPUN;
   8065     }
   8066 
   8067   /* check the exponent.  Note that input operands can have exponents  */
   8068   /* which are out of the set->emin/set->emax and set->digits range  */
   8069   /* (just as they can have more digits than set->digits).  */
   8070   ae=dn->exponent+dn->digits-1;    /* adjusted exponent  */
   8071   emax=DECNUMMAXE;
   8072   emin=DECNUMMINE;
   8073   digits=DECNUMMAXP;
   8074   if (ae<emin-(digits-1)) {
   8075     #if DECTRACE || DECVERB
   8076     printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
   8077     uprv_decNumberShow(dn);
   8078     #endif
   8079     return 1;}
   8080   if (ae>+emax) {
   8081     #if DECTRACE || DECVERB
   8082     printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
   8083     uprv_decNumberShow(dn);
   8084     #endif
   8085     return 1;}
   8086 
   8087   return 0;              /* it's OK  */
   8088   } /* decCheckNumber  */
   8089 
   8090 /* ------------------------------------------------------------------ */
   8091 /* decCheckInexact -- check a normal finite inexact result has digits */
   8092 /*   dn is the number to check                                        */
   8093 /*   set is the context (for status and precision)                    */
   8094 /*   sets Invalid operation, etc., if some digits are missing         */
   8095 /* [this check is not made for DECSUBSET compilation or when          */
   8096 /* subnormal is not set]                                              */
   8097 /* ------------------------------------------------------------------ */
   8098 static void decCheckInexact(const decNumber *dn, decContext *set) {
   8099   #if !DECSUBSET && DECEXTFLAG
   8100     if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
   8101      && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
   8102       #if DECTRACE || DECVERB
   8103       printf("Insufficient digits [%ld] on normal Inexact result.\n",
   8104              (LI)dn->digits);
   8105       uprv_decNumberShow(dn);
   8106       #endif
   8107       uprv_decContextSetStatus(set, DEC_Invalid_operation);
   8108       }
   8109   #else
   8110     /* next is a noop for quiet compiler  */
   8111     if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
   8112   #endif
   8113   return;
   8114   } /* decCheckInexact  */
   8115 #endif
   8116 
   8117 #if DECALLOC
   8118 #undef malloc
   8119 #undef free
   8120 /* ------------------------------------------------------------------ */
   8121 /* decMalloc -- accountable allocation routine                        */
   8122 /*   n is the number of bytes to allocate                             */
   8123 /*                                                                    */
   8124 /* Semantics is the same as the stdlib malloc routine, but bytes      */
   8125 /* allocated are accounted for globally, and corruption fences are    */
   8126 /* added before and after the 'actual' storage.                       */
   8127 /* ------------------------------------------------------------------ */
   8128 /* This routine allocates storage with an extra twelve bytes; 8 are   */
   8129 /* at the start and hold:                                             */
   8130 /*   0-3 the original length requested                                */
   8131 /*   4-7 buffer corruption detection fence (DECFENCE, x4)             */
   8132 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
   8133 /* ------------------------------------------------------------------ */
   8134 static void *decMalloc(size_t n) {
   8135   uInt  size=n+12;                 /* true size  */
   8136   void  *alloc;                    /* -> allocated storage  */
   8137   uByte *b, *b0;                   /* work  */
   8138   uInt  uiwork;                    /* for macros  */
   8139 
   8140   alloc=malloc(size);              /* -> allocated storage  */
   8141   if (alloc==NULL) return NULL;    /* out of strorage  */
   8142   b0=(uByte *)alloc;               /* as bytes  */
   8143   decAllocBytes+=n;                /* account for storage  */
   8144   UBFROMUI(alloc, n);              /* save n  */
   8145   /* printf(" alloc ++ dAB: %ld (%ld)\n", (LI)decAllocBytes, (LI)n);  */
   8146   for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
   8147   for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
   8148   return b0+8;                     /* -> play area  */
   8149   } /* decMalloc  */
   8150 
   8151 /* ------------------------------------------------------------------ */
   8152 /* decFree -- accountable free routine                                */
   8153 /*   alloc is the storage to free                                     */
   8154 /*                                                                    */
   8155 /* Semantics is the same as the stdlib malloc routine, except that    */
   8156 /* the global storage accounting is updated and the fences are        */
   8157 /* checked to ensure that no routine has written 'out of bounds'.     */
   8158 /* ------------------------------------------------------------------ */
   8159 /* This routine first checks that the fences have not been corrupted. */
   8160 /* It then frees the storage using the 'truw' storage address (that   */
   8161 /* is, offset by 8).                                                  */
   8162 /* ------------------------------------------------------------------ */
   8163 static void decFree(void *alloc) {
   8164   uInt  n;                         /* original length  */
   8165   uByte *b, *b0;                   /* work  */
   8166   uInt  uiwork;                    /* for macros  */
   8167 
   8168   if (alloc==NULL) return;         /* allowed; it's a nop  */
   8169   b0=(uByte *)alloc;               /* as bytes  */
   8170   b0-=8;                           /* -> true start of storage  */
   8171   n=UBTOUI(b0);                    /* lift length  */
   8172   for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
   8173     printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
   8174            b-b0-8, (LI)b0);
   8175   for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
   8176     printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
   8177            b-b0-8, (LI)b0, (LI)n);
   8178   free(b0);                        /* drop the storage  */
   8179   decAllocBytes-=n;                /* account for storage  */
   8180   /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n);  */
   8181   } /* decFree  */
   8182 #define malloc(a) decMalloc(a)
   8183 #define free(a) decFree(a)
   8184 #endif
   8185