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@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  */
188static 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
213static const Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing  */
214
215/* ------------------------------------------------------------------ */
216/* round-for-reround digits                                           */
217/* ------------------------------------------------------------------ */
218static 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/* ------------------------------------------------------------------ */
223static 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 */
247static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
248                              decContext *, uByte, uInt *);
249static Flag        decBiStr(const char *, const char *, const char *);
250static uInt        decCheckMath(const decNumber *, decContext *, uInt *);
251static void        decApplyRound(decNumber *, decContext *, Int, uInt *);
252static Int         decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
253static decNumber * decCompareOp(decNumber *, const decNumber *,
254                              const decNumber *, decContext *,
255                              Flag, uInt *);
256static void        decCopyFit(decNumber *, const decNumber *, decContext *,
257                              Int *, uInt *);
258static decNumber * decDecap(decNumber *, Int);
259static decNumber * decDivideOp(decNumber *, const decNumber *,
260                              const decNumber *, decContext *, Flag, uInt *);
261static decNumber * decExpOp(decNumber *, const decNumber *,
262                              decContext *, uInt *);
263static void        decFinalize(decNumber *, decContext *, Int *, uInt *);
264static Int         decGetDigits(Unit *, Int);
265static Int         decGetInt(const decNumber *);
266static decNumber * decLnOp(decNumber *, const decNumber *,
267                              decContext *, uInt *);
268static decNumber * decMultiplyOp(decNumber *, const decNumber *,
269                              const decNumber *, decContext *,
270                              uInt *);
271static decNumber * decNaNs(decNumber *, const decNumber *,
272                              const decNumber *, decContext *, uInt *);
273static decNumber * decQuantizeOp(decNumber *, const decNumber *,
274                              const decNumber *, decContext *, Flag,
275                              uInt *);
276static void        decReverse(Unit *, Unit *);
277static void        decSetCoeff(decNumber *, decContext *, const Unit *,
278                              Int, Int *, uInt *);
279static void        decSetMaxValue(decNumber *, decContext *);
280static void        decSetOverflow(decNumber *, decContext *, uInt *);
281static void        decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
282static Int         decShiftToLeast(Unit *, Int, Int);
283static Int         decShiftToMost(Unit *, Int, Int);
284static void        decStatus(decNumber *, uInt, decContext *);
285static void        decToString(const decNumber *, char[], Flag);
286static decNumber * decTrim(decNumber *, decContext *, Flag, Flag, Int *);
287static Int         decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
288                              Unit *, Int);
289static 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
295static void        decFinish(decNumber *, decContext *, Int *, uInt *);
296static 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:  */
317static void *decMalloc(size_t);
318static void  decFree(void *);
319uInt 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))
339static Flag decCheckOperands(decNumber *, const decNumber *,
340                             const decNumber *, decContext *);
341static Flag decCheckNumber(const decNumber *);
342static void decCheckInexact(const decNumber *, decContext *);
343#endif
344
345#if DECTRACE || DECCHECK
346/* Optional trace/debugging routines (may or may not be used)  */
347void decNumberShow(const decNumber *);  /* displays the components of a number  */
348static 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/* ------------------------------------------------------------------ */
364U_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
377U_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/* ------------------------------------------------------------------ */
399U_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
435U_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/* ------------------------------------------------------------------ */
478U_CAPI char * U_EXPORT2 uprv_decNumberToString(const decNumber *dn, char *string){
479  decToString(dn, string, 0);
480  return string;
481  } /* DecNumberToString  */
482
483U_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/* ------------------------------------------------------------------ */
508U_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/* ------------------------------------------------------------------ */
757U_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                   */
789U_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/* ------------------------------------------------------------------ */
815U_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/* ------------------------------------------------------------------ */
883U_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/* ------------------------------------------------------------------ */
903U_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/* ------------------------------------------------------------------ */
924U_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/* ------------------------------------------------------------------ */
945U_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/* ------------------------------------------------------------------ */
1010U_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/* ------------------------------------------------------------------ */
1033U_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/* ------------------------------------------------------------------ */
1066U_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/* ------------------------------------------------------------------ */
1122U_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/* ------------------------------------------------------------------ */
1213U_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/* ------------------------------------------------------------------ */
1286U_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/* ------------------------------------------------------------------ */
1352U_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
1412U_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/* ------------------------------------------------------------------ */
1563U_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/* ------------------------------------------------------------------ */
1586U_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/* ------------------------------------------------------------------ */
1609U_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/* ------------------------------------------------------------------ */
1632U_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/* ------------------------------------------------------------------ */
1657U_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/* ------------------------------------------------------------------ */
1687U_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/* ------------------------------------------------------------------ */
1723U_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/* ------------------------------------------------------------------ */
1763U_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/* ------------------------------------------------------------------ */
1831U_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/* ------------------------------------------------------------------ */
1901U_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/* ------------------------------------------------------------------ */
1931U_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/* ------------------------------------------------------------------ */
1968U_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/* ------------------------------------------------------------------ */
2313U_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  */
2333U_CAPI decNumber * U_EXPORT2 uprv_decNumberNormalize(decNumber *res, const decNumber *rhs,
2334                               decContext *set) {
2335  return uprv_decNumberReduce(res, rhs, set);
2336  } /* decNumberNormalize  */
2337
2338U_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/* ------------------------------------------------------------------ */
2402U_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/* ------------------------------------------------------------------ */
2422U_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/* ------------------------------------------------------------------ */
2445U_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/* ------------------------------------------------------------------ */
2481U_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/* ------------------------------------------------------------------ */
2602U_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/* ------------------------------------------------------------------ */
2637U_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/* ------------------------------------------------------------------ */
2694U_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
2827U_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/* ------------------------------------------------------------------ */
3172U_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/* ------------------------------------------------------------------ */
3205U_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
3235U_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/* ------------------------------------------------------------------ */
3261U_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/* ------------------------------------------------------------------ */
3326enum 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/* ------------------------------------------------------------------ */
3354const 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/* ------------------------------------------------------------------ */
3379U_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/* ------------------------------------------------------------------ */
3419U_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/* ------------------------------------------------------------------ */
3440U_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/* ------------------------------------------------------------------ */
3461U_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/* ------------------------------------------------------------------ */
3484U_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/* ------------------------------------------------------------------ */
3518U_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/* ------------------------------------------------------------------ */
3543Int 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/* ------------------------------------------------------------------ */
3563Int 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/* ------------------------------------------------------------------ */
3587U_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/* ------------------------------------------------------------------ */
3602const 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.  */
3615U_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.  */
3648static 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/* ------------------------------------------------------------------ */
3830static 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/* ------------------------------------------------------------------ */
4246static 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)
4866static 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/* ------------------------------------------------------------------ */
5260decNumber * 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/* ------------------------------------------------------------------ */
5548static 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
5624decNumber * 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/* ------------------------------------------------------------------ */
5871static 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/* ------------------------------------------------------------------ */
6044static 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/* ------------------------------------------------------------------ */
6209static 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/* ------------------------------------------------------------------ */
6273static 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/* ------------------------------------------------------------------ */
6377static 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/* ------------------------------------------------------------------ */
6631static 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/* ------------------------------------------------------------------ */
6702static 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/* ------------------------------------------------------------------ */
6725static 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/* ------------------------------------------------------------------ */
6781static 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/* ------------------------------------------------------------------ */
6847static 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/* ------------------------------------------------------------------ */
6883static 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  */
6928static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6929static 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/* ------------------------------------------------------------------ */
7111static 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/* ------------------------------------------------------------------ */
7280static 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/* ------------------------------------------------------------------ */
7315static 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/* ------------------------------------------------------------------ */
7389static 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/* ------------------------------------------------------------------ */
7435static 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/* ------------------------------------------------------------------ */
7469static 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/* ------------------------------------------------------------------ */
7555static 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/* ------------------------------------------------------------------ */
7583static 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/* ------------------------------------------------------------------ */
7672static 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/* ------------------------------------------------------------------ */
7708static 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/* ------------------------------------------------------------------ */
7731static 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/* ------------------------------------------------------------------ */
7782static 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.  */
7808static 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  */
7854void 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/* ------------------------------------------------------------------ */
7906static 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/* ------------------------------------------------------------------ */
7951static 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/* ------------------------------------------------------------------ */
7997static 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/* ------------------------------------------------------------------ */
8098static 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/* ------------------------------------------------------------------ */
8134static 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/* ------------------------------------------------------------------ */
8163static 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