xref: /openbmc/qemu/libdecnumber/decNumber.c (revision 10358b6a)
1 /* Decimal number arithmetic module for the decNumber C Library.
2    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
3    Contributed by IBM Corporation.  Author Mike Cowlishaw.
4 
5    This file is part of GCC.
6 
7    GCC is free software; you can redistribute it and/or modify it under
8    the terms of the GNU General Public License as published by the Free
9    Software Foundation; either version 2, or (at your option) any later
10    version.
11 
12    In addition to the permissions in the GNU General Public License,
13    the Free Software Foundation gives you unlimited permission to link
14    the compiled version of this file into combinations with other
15    programs, and to distribute those combinations without any
16    restriction coming from the use of this file.  (The General Public
17    License restrictions do apply in other respects; for example, they
18    cover modification of the file, and distribution when not linked
19    into a combine executable.)
20 
21    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
22    WARRANTY; without even the implied warranty of MERCHANTABILITY or
23    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
24    for more details.
25 
26    You should have received a copy of the GNU General Public License
27    along with GCC; see the file COPYING.  If not, write to the Free
28    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
29    02110-1301, USA.  */
30 
31 /* ------------------------------------------------------------------ */
32 /* Decimal Number arithmetic module				      */
33 /* ------------------------------------------------------------------ */
34 /* This module comprises the routines for General Decimal Arithmetic  */
35 /* as defined in the specification which may be found on the	      */
36 /* http://www2.hursley.ibm.com/decimal web pages.  It implements both */
37 /* the full ('extended') arithmetic and the simpler ('subset')	      */
38 /* arithmetic.							      */
39 /*								      */
40 /* Usage notes:							      */
41 /*								      */
42 /* 1. This code is ANSI C89 except:				      */
43 /*								      */
44 /*       If DECDPUN>4 or DECUSE64=1, the C99 64-bit int64_t and	      */
45 /*	 uint64_t types may be used.  To avoid these, set DECUSE64=0  */
46 /*	 and DECDPUN<=4 (see documentation).			      */
47 /*								      */
48 /* 2. The decNumber format which this library uses is optimized for   */
49 /*    efficient processing of relatively short numbers; in particular */
50 /*    it allows the use of fixed sized structures and minimizes copy  */
51 /*    and move operations.  It does, however, support arbitrary	      */
52 /*    precision (up to 999,999,999 digits) and arbitrary exponent     */
53 /*    range (Emax in the range 0 through 999,999,999 and Emin in the  */
54 /*    range -999,999,999 through 0).  Mathematical functions (for     */
55 /*    example decNumberExp) as identified below are restricted more   */
56 /*    tightly: digits, emax, and -emin in the context must be <=      */
57 /*    DEC_MAX_MATH (999999), and their operand(s) must be within      */
58 /*    these bounds.						      */
59 /*								      */
60 /* 3. Logical functions are further restricted; their operands must   */
61 /*    be finite, positive, have an exponent of zero, and all digits   */
62 /*    must be either 0 or 1.  The result will only contain digits     */
63 /*    which are 0 or 1 (and will have exponent=0 and a sign of 0).    */
64 /*								      */
65 /* 4. Operands to operator functions are never modified unless they   */
66 /*    are also specified to be the result number (which is always     */
67 /*    permitted).  Other than that case, operands must not overlap.   */
68 /*								      */
69 /* 5. Error handling: the type of the error is ORed into the status   */
70 /*    flags in the current context (decContext structure).  The	      */
71 /*    SIGFPE signal is then raised if the corresponding trap-enabler  */
72 /*    flag in the decContext is set (is 1).			      */
73 /*								      */
74 /*    It is the responsibility of the caller to clear the status      */
75 /*    flags as required.					      */
76 /*								      */
77 /*    The result of any routine which returns a number will always    */
78 /*    be a valid number (which may be a special value, such as an     */
79 /*    Infinity or NaN).						      */
80 /*								      */
81 /* 6. The decNumber format is not an exchangeable concrete	      */
82 /*    representation as it comprises fields which may be machine-     */
83 /*    dependent (packed or unpacked, or special length, for example). */
84 /*    Canonical conversions to and from strings are provided; other   */
85 /*    conversions are available in separate modules.		      */
86 /*								      */
87 /* 7. Normally, input operands are assumed to be valid.	 Set DECCHECK */
88 /*    to 1 for extended operand checking (including NULL operands).   */
89 /*    Results are undefined if a badly-formed structure (or a NULL    */
90 /*    pointer to a structure) is provided, though with DECCHECK	      */
91 /*    enabled the operator routines are protected against exceptions. */
92 /*    (Except if the result pointer is NULL, which is unrecoverable.) */
93 /*								      */
94 /*    However, the routines will never cause exceptions if they are   */
95 /*    given well-formed operands, even if the value of the operands   */
96 /*    is inappropriate for the operation and DECCHECK is not set.     */
97 /*    (Except for SIGFPE, as and where documented.)		      */
98 /*								      */
99 /* 8. Subset arithmetic is available only if DECSUBSET is set to 1.   */
100 /* ------------------------------------------------------------------ */
101 /* Implementation notes for maintenance of this module:		      */
102 /*								      */
103 /* 1. Storage leak protection:	Routines which use malloc are not     */
104 /*    permitted to use return for fastpath or error exits (i.e.,      */
105 /*    they follow strict structured programming conventions).	      */
106 /*    Instead they have a do{}while(0); construct surrounding the     */
107 /*    code which is protected -- break may be used to exit this.      */
108 /*    Other routines can safely use the return statement inline.      */
109 /*								      */
110 /*    Storage leak accounting can be enabled using DECALLOC.	      */
111 /*								      */
112 /* 2. All loops use the for(;;) construct.  Any do construct does     */
113 /*    not loop; it is for allocation protection as just described.    */
114 /*								      */
115 /* 3. Setting status in the context must always be the very last      */
116 /*    action in a routine, as non-0 status may raise a trap and hence */
117 /*    the call to set status may not return (if the handler uses long */
118 /*    jump).  Therefore all cleanup must be done first.	 In general,  */
119 /*    to achieve this status is accumulated and is only applied just  */
120 /*    before return by calling decContextSetStatus (via decStatus).   */
121 /*								      */
122 /*    Routines which allocate storage cannot, in general, use the     */
123 /*    'top level' routines which could cause a non-returning	      */
124 /*    transfer of control.  The decXxxxOp routines are safe (do not   */
125 /*    call decStatus even if traps are set in the context) and should */
126 /*    be used instead (they are also a little faster).		      */
127 /*								      */
128 /* 4. Exponent checking is minimized by allowing the exponent to      */
129 /*    grow outside its limits during calculations, provided that      */
130 /*    the decFinalize function is called later.	 Multiplication and   */
131 /*    division, and intermediate calculations in exponentiation,      */
132 /*    require more careful checks because of the risk of 31-bit	      */
133 /*    overflow (the most negative valid exponent is -1999999997, for  */
134 /*    a 999999999-digit number with adjusted exponent of -999999999). */
135 /*								      */
136 /* 5. Rounding is deferred until finalization of results, with any    */
137 /*    'off to the right' data being represented as a single digit     */
138 /*    residue (in the range -1 through 9).  This avoids any double-   */
139 /*    rounding when more than one shortening takes place (for	      */
140 /*    example, when a result is subnormal).			      */
141 /*								      */
142 /* 6. The digits count is allowed to rise to a multiple of DECDPUN    */
143 /*    during many operations, so whole Units are handled and exact    */
144 /*    accounting of digits is not needed.  The correct digits value   */
145 /*    is found by decGetDigits, which accounts for leading zeros.     */
146 /*    This must be called before any rounding if the number of digits */
147 /*    is not known exactly.					      */
148 /*								      */
149 /* 7. The multiply-by-reciprocal 'trick' is used for partitioning     */
150 /*    numbers up to four digits, using appropriate constants.  This   */
151 /*    is not useful for longer numbers because overflow of 32 bits    */
152 /*    would lead to 4 multiplies, which is almost as expensive as     */
153 /*    a divide (unless a floating-point or 64-bit multiply is	      */
154 /*    assumed to be available).					      */
155 /*								      */
156 /* 8. Unusual abbreviations that may be used in the commentary:	      */
157 /*	lhs -- left hand side (operand, of an operation)	      */
158 /*	lsd -- least significant digit (of coefficient)		      */
159 /*	lsu -- least significant Unit (of coefficient)		      */
160 /*	msd -- most significant digit (of coefficient)		      */
161 /*	msi -- most significant item (in an array)		      */
162 /*	msu -- most significant Unit (of coefficient)		      */
163 /*	rhs -- right hand side (operand, of an operation)	      */
164 /*	+ve -- positive						      */
165 /*	-ve -- negative						      */
166 /*	**  -- raise to the power				      */
167 /* ------------------------------------------------------------------ */
168 
169 #include <stdlib.h>		   /* for malloc, free, etc. */
170 #include <stdio.h>		   /* for printf [if needed] */
171 #include <string.h>		   /* for strcpy */
172 #include <ctype.h>		   /* for lower */
173 #include "libdecnumber/dconfig.h"
174 #include "libdecnumber/decNumber.h"
175 #include "libdecnumber/decNumberLocal.h"
176 
177 /* Constants */
178 /* Public lookup table used by the D2U macro */
179 const uByte d2utable[DECMAXD2U+1]=D2UTABLE;
180 
181 #define DECVERB	    1		   /* set to 1 for verbose DECCHECK */
182 #define powers	    DECPOWERS	   /* old internal name */
183 
184 /* Local constants */
185 #define DIVIDE	    0x80	   /* Divide operators */
186 #define REMAINDER   0x40	   /* .. */
187 #define DIVIDEINT   0x20	   /* .. */
188 #define REMNEAR	    0x10	   /* .. */
189 #define COMPARE	    0x01	   /* Compare operators */
190 #define COMPMAX	    0x02	   /* .. */
191 #define COMPMIN	    0x03	   /* .. */
192 #define COMPTOTAL   0x04	   /* .. */
193 #define COMPNAN	    0x05	   /* .. [NaN processing] */
194 #define COMPSIG	    0x06	   /* .. [signaling COMPARE] */
195 #define COMPMAXMAG  0x07	   /* .. */
196 #define COMPMINMAG  0x08	   /* .. */
197 
198 #define DEC_sNaN     0x40000000	   /* local status: sNaN signal */
199 #define BADINT	(Int)0x80000000	   /* most-negative Int; error indicator */
200 /* Next two indicate an integer >= 10**6, and its parity (bottom bit) */
201 #define BIGEVEN (Int)0x80000002
202 #define BIGODD	(Int)0x80000003
203 
204 static Unit uarrone[1]={1};   /* Unit array of 1, used for incrementing */
205 
206 /* Granularity-dependent code */
207 #if DECDPUN<=4
208   #define eInt	Int	      /* extended integer */
209   #define ueInt uInt	      /* unsigned extended integer */
210   /* Constant multipliers for divide-by-power-of five using reciprocal */
211   /* multiply, after removing powers of 2 by shifting, and final shift */
212   /* of 17 [we only need up to **4] */
213   static const uInt multies[]={131073, 26215, 5243, 1049, 210};
214   /* QUOT10 -- macro to return the quotient of unit u divided by 10**n */
215   #define QUOT10(u, n) ((((uInt)(u)>>(n))*multies[n])>>17)
216 #else
217   /* For DECDPUN>4 non-ANSI-89 64-bit types are needed. */
218   #if !DECUSE64
219     #error decNumber.c: DECUSE64 must be 1 when DECDPUN>4
220   #endif
221   #define eInt	Long	      /* extended integer */
222   #define ueInt uLong	      /* unsigned extended integer */
223 #endif
224 
225 /* Local routines */
226 static decNumber * decAddOp(decNumber *, const decNumber *, const decNumber *,
227 			      decContext *, uByte, uInt *);
228 static Flag	   decBiStr(const char *, const char *, const char *);
229 static uInt	   decCheckMath(const decNumber *, decContext *, uInt *);
230 static void	   decApplyRound(decNumber *, decContext *, Int, uInt *);
231 static Int	   decCompare(const decNumber *lhs, const decNumber *rhs, Flag);
232 static decNumber * decCompareOp(decNumber *, const decNumber *,
233 			      const decNumber *, decContext *,
234 			      Flag, uInt *);
235 static void	   decCopyFit(decNumber *, const decNumber *, decContext *,
236 			      Int *, uInt *);
237 static decNumber * decDecap(decNumber *, Int);
238 static decNumber * decDivideOp(decNumber *, const decNumber *,
239 			      const decNumber *, decContext *, Flag, uInt *);
240 static decNumber * decExpOp(decNumber *, const decNumber *,
241 			      decContext *, uInt *);
242 static void	   decFinalize(decNumber *, decContext *, Int *, uInt *);
243 static Int	   decGetDigits(Unit *, Int);
244 static Int	   decGetInt(const decNumber *);
245 static decNumber * decLnOp(decNumber *, const decNumber *,
246 			      decContext *, uInt *);
247 static decNumber * decMultiplyOp(decNumber *, const decNumber *,
248 			      const decNumber *, decContext *,
249 			      uInt *);
250 static decNumber * decNaNs(decNumber *, const decNumber *,
251 			      const decNumber *, decContext *, uInt *);
252 static decNumber * decQuantizeOp(decNumber *, const decNumber *,
253 			      const decNumber *, decContext *, Flag,
254 			      uInt *);
255 static void	   decReverse(Unit *, Unit *);
256 static void	   decSetCoeff(decNumber *, decContext *, const Unit *,
257 			      Int, Int *, uInt *);
258 static void	   decSetMaxValue(decNumber *, decContext *);
259 static void	   decSetOverflow(decNumber *, decContext *, uInt *);
260 static void	   decSetSubnormal(decNumber *, decContext *, Int *, uInt *);
261 static Int	   decShiftToLeast(Unit *, Int, Int);
262 static Int	   decShiftToMost(Unit *, Int, Int);
263 static void	   decStatus(decNumber *, uInt, decContext *);
264 static void	   decToString(const decNumber *, char[], Flag);
265 static decNumber * decTrim(decNumber *, decContext *, Flag, Int *);
266 static Int	   decUnitAddSub(const Unit *, Int, const Unit *, Int, Int,
267 			      Unit *, Int);
268 static Int	   decUnitCompare(const Unit *, Int, const Unit *, Int, Int);
269 
270 #if !DECSUBSET
271 /* decFinish == decFinalize when no subset arithmetic needed */
272 #define decFinish(a,b,c,d) decFinalize(a,b,c,d)
273 #else
274 static void	   decFinish(decNumber *, decContext *, Int *, uInt *);
275 static decNumber * decRoundOperand(const decNumber *, decContext *, uInt *);
276 #endif
277 
278 /* Local macros */
279 /* masked special-values bits */
280 #define SPECIALARG  (rhs->bits & DECSPECIAL)
281 #define SPECIALARGS ((lhs->bits | rhs->bits) & DECSPECIAL)
282 
283 /* Diagnostic macros, etc. */
284 #if DECALLOC
285 /* Handle malloc/free accounting.  If enabled, our accountable routines */
286 /* are used; otherwise the code just goes straight to the system malloc */
287 /* and free routines. */
288 #define malloc(a) decMalloc(a)
289 #define free(a) decFree(a)
290 #define DECFENCE 0x5a		   /* corruption detector */
291 /* 'Our' malloc and free: */
292 static void *decMalloc(size_t);
293 static void  decFree(void *);
294 uInt decAllocBytes=0;		   /* count of bytes allocated */
295 /* Note that DECALLOC code only checks for storage buffer overflow. */
296 /* To check for memory leaks, the decAllocBytes variable must be */
297 /* checked to be 0 at appropriate times (e.g., after the test */
298 /* harness completes a set of tests).  This checking may be unreliable */
299 /* if the testing is done in a multi-thread environment. */
300 #endif
301 
302 #if DECCHECK
303 /* Optional checking routines.	Enabling these means that decNumber */
304 /* and decContext operands to operator routines are checked for */
305 /* correctness.	 This roughly doubles the execution time of the */
306 /* fastest routines (and adds 600+ bytes), so should not normally be */
307 /* used in 'production'. */
308 /* decCheckInexact is used to check that inexact results have a full */
309 /* complement of digits (where appropriate -- this is not the case */
310 /* for Quantize, for example) */
311 #define DECUNRESU ((decNumber *)(void *)0xffffffff)
312 #define DECUNUSED ((const decNumber *)(void *)0xffffffff)
313 #define DECUNCONT ((decContext *)(void *)(0xffffffff))
314 static Flag decCheckOperands(decNumber *, const decNumber *,
315 			     const decNumber *, decContext *);
316 static Flag decCheckNumber(const decNumber *);
317 static void decCheckInexact(const decNumber *, decContext *);
318 #endif
319 
320 #if DECTRACE || DECCHECK
321 /* Optional trace/debugging routines (may or may not be used) */
322 void decNumberShow(const decNumber *);	/* displays the components of a number */
323 static void decDumpAr(char, const Unit *, Int);
324 #endif
325 
326 /* ================================================================== */
327 /* Conversions							      */
328 /* ================================================================== */
329 
330 /* ------------------------------------------------------------------ */
331 /* from-int32 -- conversion from Int or uInt			      */
332 /*								      */
333 /*  dn is the decNumber to receive the integer			      */
334 /*  in or uin is the integer to be converted			      */
335 /*  returns dn							      */
336 /*								      */
337 /* No error is possible.					      */
338 /* ------------------------------------------------------------------ */
339 decNumber * decNumberFromInt32(decNumber *dn, Int in) {
340   uInt unsig;
341   if (in>=0) unsig=in;
342    else {				/* negative (possibly BADINT) */
343     if (in==BADINT) unsig=(uInt)1073741824*2; /* special case */
344      else unsig=-in;			/* invert */
345     }
346   /* in is now positive */
347   decNumberFromUInt32(dn, unsig);
348   if (in<0) dn->bits=DECNEG;		/* sign needed */
349   return dn;
350   } /* decNumberFromInt32 */
351 
352 decNumber * decNumberFromUInt32(decNumber *dn, uInt uin) {
353   Unit *up;				/* work pointer */
354   decNumberZero(dn);			/* clean */
355   if (uin==0) return dn;		/* [or decGetDigits bad call] */
356   for (up=dn->lsu; uin>0; up++) {
357     *up=(Unit)(uin%(DECDPUNMAX+1));
358     uin=uin/(DECDPUNMAX+1);
359     }
360   dn->digits=decGetDigits(dn->lsu, up-dn->lsu);
361   return dn;
362   } /* decNumberFromUInt32 */
363 
364 /* ------------------------------------------------------------------ */
365 /* to-int32 -- conversion to Int or uInt			      */
366 /*								      */
367 /*  dn is the decNumber to convert				      */
368 /*  set is the context for reporting errors			      */
369 /*  returns the converted decNumber, or 0 if Invalid is set	      */
370 /*								      */
371 /* Invalid is set if the decNumber does not have exponent==0 or if    */
372 /* it is a NaN, Infinite, or out-of-range.			      */
373 /* ------------------------------------------------------------------ */
374 Int decNumberToInt32(const decNumber *dn, decContext *set) {
375   #if DECCHECK
376   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
377   #endif
378 
379   /* special or too many digits, or bad exponent */
380   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0) ; /* bad */
381    else { /* is a finite integer with 10 or fewer digits */
382     Int d;			   /* work */
383     const Unit *up;		   /* .. */
384     uInt hi=0, lo;		   /* .. */
385     up=dn->lsu;			   /* -> lsu */
386     lo=*up;			   /* get 1 to 9 digits */
387     #if DECDPUN>1		   /* split to higher */
388       hi=lo/10;
389       lo=lo%10;
390     #endif
391     up++;
392     /* collect remaining Units, if any, into hi */
393     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
394     /* now low has the lsd, hi the remainder */
395     if (hi>214748364 || (hi==214748364 && lo>7)) { /* out of range? */
396       /* most-negative is a reprieve */
397       if (dn->bits&DECNEG && hi==214748364 && lo==8) return 0x80000000;
398       /* bad -- drop through */
399       }
400      else { /* in-range always */
401       Int i=X10(hi)+lo;
402       if (dn->bits&DECNEG) return -i;
403       return i;
404       }
405     } /* integer */
406   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
407   return 0;
408   } /* decNumberToInt32 */
409 
410 uInt decNumberToUInt32(const decNumber *dn, decContext *set) {
411   #if DECCHECK
412   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
413   #endif
414   /* special or too many digits, or bad exponent, or negative (<0) */
415   if (dn->bits&DECSPECIAL || dn->digits>10 || dn->exponent!=0
416     || (dn->bits&DECNEG && !ISZERO(dn)));		    /* bad */
417    else { /* is a finite integer with 10 or fewer digits */
418     Int d;			   /* work */
419     const Unit *up;		   /* .. */
420     uInt hi=0, lo;		   /* .. */
421     up=dn->lsu;			   /* -> lsu */
422     lo=*up;			   /* get 1 to 9 digits */
423     #if DECDPUN>1		   /* split to higher */
424       hi=lo/10;
425       lo=lo%10;
426     #endif
427     up++;
428     /* collect remaining Units, if any, into hi */
429     for (d=DECDPUN; d<dn->digits; up++, d+=DECDPUN) hi+=*up*powers[d-1];
430 
431     /* now low has the lsd, hi the remainder */
432     if (hi>429496729 || (hi==429496729 && lo>5)) ; /* no reprieve possible */
433      else return X10(hi)+lo;
434     } /* integer */
435   decContextSetStatus(set, DEC_Invalid_operation); /* [may not return] */
436   return 0;
437   } /* decNumberToUInt32 */
438 
439 decNumber *decNumberFromInt64(decNumber *dn, int64_t in)
440 {
441     uint64_t unsig = in;
442     if (in < 0) {
443         unsig = -unsig;
444     }
445 
446     decNumberFromUInt64(dn, unsig);
447     if (in < 0) {
448         dn->bits = DECNEG;        /* sign needed */
449     }
450     return dn;
451 } /* decNumberFromInt64 */
452 
453 decNumber *decNumberFromUInt64(decNumber *dn, uint64_t uin)
454 {
455     Unit *up;                             /* work pointer */
456     decNumberZero(dn);                    /* clean */
457     if (uin == 0) {
458         return dn;                /* [or decGetDigits bad call] */
459     }
460     for (up = dn->lsu; uin > 0; up++) {
461         *up = (Unit)(uin % (DECDPUNMAX + 1));
462         uin = uin / (DECDPUNMAX + 1);
463     }
464     dn->digits = decGetDigits(dn->lsu, up-dn->lsu);
465     return dn;
466 } /* decNumberFromUInt64 */
467 
468 /* ------------------------------------------------------------------ */
469 /* to-int64 -- conversion to int64                                    */
470 /*                                                                    */
471 /*  dn is the decNumber to convert.  dn is assumed to have been       */
472 /*    rounded to a floating point integer value.                      */
473 /*  set is the context for reporting errors                           */
474 /*  returns the converted decNumber, or 0 if Invalid is set           */
475 /*                                                                    */
476 /* Invalid is set if the decNumber is a NaN, Infinite or is out of    */
477 /* range for a signed 64 bit integer.                                 */
478 /* ------------------------------------------------------------------ */
479 
480 int64_t decNumberIntegralToInt64(const decNumber *dn, decContext *set)
481 {
482     if (decNumberIsSpecial(dn) || (dn->exponent < 0) ||
483        (dn->digits + dn->exponent > 19)) {
484         goto Invalid;
485     } else {
486         int64_t d;        /* work */
487         const Unit *up;   /* .. */
488         uint64_t hi = 0;
489         up = dn->lsu;     /* -> lsu */
490 
491         for (d = 1; d <= dn->digits; up++, d += DECDPUN) {
492             uint64_t prev = hi;
493             hi += *up * powers[d-1];
494             if ((hi < prev) || (hi > INT64_MAX)) {
495                 goto Invalid;
496             }
497         }
498 
499         uint64_t prev = hi;
500         hi *= (uint64_t)powers[dn->exponent];
501         if ((hi < prev) || (hi > INT64_MAX)) {
502             goto Invalid;
503         }
504         return (decNumberIsNegative(dn)) ? -((int64_t)hi) : (int64_t)hi;
505     }
506 
507 Invalid:
508     decContextSetStatus(set, DEC_Invalid_operation);
509     return 0;
510 } /* decNumberIntegralToInt64 */
511 
512 
513 /* ------------------------------------------------------------------ */
514 /* to-scientific-string -- conversion to numeric string		      */
515 /* to-engineering-string -- conversion to numeric string	      */
516 /*								      */
517 /*   decNumberToString(dn, string);				      */
518 /*   decNumberToEngString(dn, string);				      */
519 /*								      */
520 /*  dn is the decNumber to convert				      */
521 /*  string is the string where the result will be laid out	      */
522 /*								      */
523 /*  string must be at least dn->digits+14 characters long	      */
524 /*								      */
525 /*  No error is possible, and no status can be set.		      */
526 /* ------------------------------------------------------------------ */
527 char * decNumberToString(const decNumber *dn, char *string){
528   decToString(dn, string, 0);
529   return string;
530   } /* DecNumberToString */
531 
532 char * decNumberToEngString(const decNumber *dn, char *string){
533   decToString(dn, string, 1);
534   return string;
535   } /* DecNumberToEngString */
536 
537 /* ------------------------------------------------------------------ */
538 /* to-number -- conversion from numeric string			      */
539 /*								      */
540 /* decNumberFromString -- convert string to decNumber		      */
541 /*   dn	       -- the number structure to fill			      */
542 /*   chars[]   -- the string to convert ('\0' terminated)	      */
543 /*   set       -- the context used for processing any error,	      */
544 /*		  determining the maximum precision available	      */
545 /*		  (set.digits), determining the maximum and minimum   */
546 /*		  exponent (set.emax and set.emin), determining if    */
547 /*		  extended values are allowed, and checking the	      */
548 /*		  rounding mode if overflow occurs or rounding is     */
549 /*		  needed.					      */
550 /*								      */
551 /* The length of the coefficient and the size of the exponent are     */
552 /* checked by this routine, so the correct error (Underflow or	      */
553 /* Overflow) can be reported or rounding applied, as necessary.	      */
554 /*								      */
555 /* If bad syntax is detected, the result will be a quiet NaN.	      */
556 /* ------------------------------------------------------------------ */
557 decNumber * decNumberFromString(decNumber *dn, const char chars[],
558 				decContext *set) {
559   Int	exponent=0;		   /* working exponent [assume 0] */
560   uByte bits=0;			   /* working flags [assume +ve] */
561   Unit	*res;			   /* where result will be built */
562   Unit	resbuff[SD2U(DECBUFFER+9)];/* local buffer in case need temporary */
563 				   /* [+9 allows for ln() constants] */
564   Unit	*allocres=NULL;		   /* -> allocated result, iff allocated */
565   Int	d=0;			   /* count of digits found in decimal part */
566   const char *dotchar=NULL;	   /* where dot was found */
567   const char *cfirst=chars;	   /* -> first character of decimal part */
568   const char *last=NULL;	   /* -> last digit of decimal part */
569   const char *c;		   /* work */
570   Unit	*up;			   /* .. */
571   #if DECDPUN>1
572   Int	cut, out;		   /* .. */
573   #endif
574   Int	residue;		   /* rounding residue */
575   uInt	status=0;		   /* error code */
576 
577   #if DECCHECK
578   if (decCheckOperands(DECUNRESU, DECUNUSED, DECUNUSED, set))
579     return decNumberZero(dn);
580   #endif
581 
582   do {				   /* status & malloc protection */
583     for (c=chars;; c++) {	   /* -> input character */
584       if (*c>='0' && *c<='9') {	   /* test for Arabic digit */
585 	last=c;
586 	d++;			   /* count of real digits */
587 	continue;		   /* still in decimal part */
588 	}
589       if (*c=='.' && dotchar==NULL) { /* first '.' */
590 	dotchar=c;		   /* record offset into decimal part */
591 	if (c==cfirst) cfirst++;   /* first digit must follow */
592 	continue;}
593       if (c==chars) {		   /* first in string... */
594 	if (*c=='-') {		   /* valid - sign */
595 	  cfirst++;
596 	  bits=DECNEG;
597 	  continue;}
598 	if (*c=='+') {		   /* valid + sign */
599 	  cfirst++;
600 	  continue;}
601 	}
602       /* *c is not a digit, or a valid +, -, or '.' */
603       break;
604       } /* c */
605 
606     if (last==NULL) {		   /* no digits yet */
607       status=DEC_Conversion_syntax;/* assume the worst */
608       if (*c=='\0') break;	   /* and no more to come... */
609       #if DECSUBSET
610       /* if subset then infinities and NaNs are not allowed */
611       if (!set->extended) break;   /* hopeless */
612       #endif
613       /* Infinities and NaNs are possible, here */
614       if (dotchar!=NULL) break;	   /* .. unless had a dot */
615       decNumberZero(dn);	   /* be optimistic */
616       if (decBiStr(c, "infinity", "INFINITY")
617        || decBiStr(c, "inf", "INF")) {
618 	dn->bits=bits | DECINF;
619 	status=0;		   /* is OK */
620 	break; /* all done */
621 	}
622       /* a NaN expected */
623       /* 2003.09.10 NaNs are now permitted to have a sign */
624       dn->bits=bits | DECNAN;	   /* assume simple NaN */
625       if (*c=='s' || *c=='S') {	   /* looks like an sNaN */
626 	c++;
627 	dn->bits=bits | DECSNAN;
628 	}
629       if (*c!='n' && *c!='N') break;	/* check caseless "NaN" */
630       c++;
631       if (*c!='a' && *c!='A') break;	/* .. */
632       c++;
633       if (*c!='n' && *c!='N') break;	/* .. */
634       c++;
635       /* now either nothing, or nnnn payload, expected */
636       /* -> start of integer and skip leading 0s [including plain 0] */
637       for (cfirst=c; *cfirst=='0';) cfirst++;
638       if (*cfirst=='\0') {	   /* "NaN" or "sNaN", maybe with all 0s */
639 	status=0;		   /* it's good */
640 	break;			   /* .. */
641 	}
642       /* something other than 0s; setup last and d as usual [no dots] */
643       for (c=cfirst;; c++, d++) {
644 	if (*c<'0' || *c>'9') break; /* test for Arabic digit */
645 	last=c;
646 	}
647       if (*c!='\0') break;	   /* not all digits */
648       if (d>set->digits-1) {
649 	/* [NB: payload in a decNumber can be full length unless */
650 	/* clamped, in which case can only be digits-1] */
651 	if (set->clamp) break;
652 	if (d>set->digits) break;
653 	} /* too many digits? */
654       /* good; drop through to convert the integer to coefficient */
655       status=0;			   /* syntax is OK */
656       bits=dn->bits;		   /* for copy-back */
657       } /* last==NULL */
658 
659      else if (*c!='\0') {	   /* more to process... */
660       /* had some digits; exponent is only valid sequence now */
661       Flag nege;		   /* 1=negative exponent */
662       const char *firstexp;	   /* -> first significant exponent digit */
663       status=DEC_Conversion_syntax;/* assume the worst */
664       if (*c!='e' && *c!='E') break;
665       /* Found 'e' or 'E' -- now process explicit exponent */
666       /* 1998.07.11: sign no longer required */
667       nege=0;
668       c++;			   /* to (possible) sign */
669       if (*c=='-') {nege=1; c++;}
670        else if (*c=='+') c++;
671       if (*c=='\0') break;
672 
673       for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros */
674       firstexp=c;			     /* save exponent digit place */
675       for (; ;c++) {
676 	if (*c<'0' || *c>'9') break;	     /* not a digit */
677 	exponent=X10(exponent)+(Int)*c-(Int)'0';
678 	} /* c */
679       /* if not now on a '\0', *c must not be a digit */
680       if (*c!='\0') break;
681 
682       /* (this next test must be after the syntax checks) */
683       /* if it was too long the exponent may have wrapped, so check */
684       /* carefully and set it to a certain overflow if wrap possible */
685       if (c>=firstexp+9+1) {
686 	if (c>firstexp+9+1 || *firstexp>'1') exponent=DECNUMMAXE*2;
687 	/* [up to 1999999999 is OK, for example 1E-1000000998] */
688 	}
689       if (nege) exponent=-exponent;	/* was negative */
690       status=0;				/* is OK */
691       } /* stuff after digits */
692 
693     /* Here when whole string has been inspected; syntax is good */
694     /* cfirst->first digit (never dot), last->last digit (ditto) */
695 
696     /* strip leading zeros/dot [leave final 0 if all 0's] */
697     if (*cfirst=='0') {			/* [cfirst has stepped over .] */
698       for (c=cfirst; c<last; c++, cfirst++) {
699 	if (*c=='.') continue;		/* ignore dots */
700 	if (*c!='0') break;		/* non-zero found */
701 	d--;				/* 0 stripped */
702 	} /* c */
703       #if DECSUBSET
704       /* make a rapid exit for easy zeros if !extended */
705       if (*cfirst=='0' && !set->extended) {
706 	decNumberZero(dn);		/* clean result */
707 	break;				/* [could be return] */
708 	}
709       #endif
710       } /* at least one leading 0 */
711 
712     /* Handle decimal point... */
713     if (dotchar!=NULL && dotchar<last)	/* non-trailing '.' found? */
714       exponent-=(last-dotchar);		/* adjust exponent */
715     /* [we can now ignore the .] */
716 
717     /* OK, the digits string is good.  Assemble in the decNumber, or in */
718     /* a temporary units array if rounding is needed */
719     if (d<=set->digits) res=dn->lsu;	/* fits into supplied decNumber */
720      else {				/* rounding needed */
721       Int needbytes=D2U(d)*sizeof(Unit);/* bytes needed */
722       res=resbuff;			/* assume use local buffer */
723       if (needbytes>(Int)sizeof(resbuff)) { /* too big for local */
724 	allocres=(Unit *)malloc(needbytes);
725 	if (allocres==NULL) {status|=DEC_Insufficient_storage; break;}
726 	res=allocres;
727 	}
728       }
729     /* res now -> number lsu, buffer, or allocated storage for Unit array */
730 
731     /* Place the coefficient into the selected Unit array */
732     /* [this is often 70% of the cost of this function when DECDPUN>1] */
733     #if DECDPUN>1
734     out=0;			   /* accumulator */
735     up=res+D2U(d)-1;		   /* -> msu */
736     cut=d-(up-res)*DECDPUN;	   /* digits in top unit */
737     for (c=cfirst;; c++) {	   /* along the digits */
738       if (*c=='.') continue;	   /* ignore '.' [don't decrement cut] */
739       out=X10(out)+(Int)*c-(Int)'0';
740       if (c==last) break;	   /* done [never get to trailing '.'] */
741       cut--;
742       if (cut>0) continue;	   /* more for this unit */
743       *up=(Unit)out;		   /* write unit */
744       up--;			   /* prepare for unit below.. */
745       cut=DECDPUN;		   /* .. */
746       out=0;			   /* .. */
747       } /* c */
748     *up=(Unit)out;		   /* write lsu */
749 
750     #else
751     /* DECDPUN==1 */
752     up=res;			   /* -> lsu */
753     for (c=last; c>=cfirst; c--) { /* over each character, from least */
754       if (*c=='.') continue;	   /* ignore . [don't step up] */
755       *up=(Unit)((Int)*c-(Int)'0');
756       up++;
757       } /* c */
758     #endif
759 
760     dn->bits=bits;
761     dn->exponent=exponent;
762     dn->digits=d;
763 
764     /* if not in number (too long) shorten into the number */
765     if (d>set->digits) {
766       residue=0;
767       decSetCoeff(dn, set, res, d, &residue, &status);
768       /* always check for overflow or subnormal and round as needed */
769       decFinalize(dn, set, &residue, &status);
770       }
771      else { /* no rounding, but may still have overflow or subnormal */
772       /* [these tests are just for performance; finalize repeats them] */
773       if ((dn->exponent-1<set->emin-dn->digits)
774        || (dn->exponent-1>set->emax-set->digits)) {
775 	residue=0;
776 	decFinalize(dn, set, &residue, &status);
777 	}
778       }
779     /* decNumberShow(dn); */
780     } while(0);				/* [for break] */
781 
782   if (allocres!=NULL) free(allocres);	/* drop any storage used */
783   if (status!=0) decStatus(dn, status, set);
784   return dn;
785   } /* decNumberFromString */
786 
787 /* ================================================================== */
788 /* Operators							      */
789 /* ================================================================== */
790 
791 /* ------------------------------------------------------------------ */
792 /* decNumberAbs -- absolute value operator			      */
793 /*								      */
794 /*   This computes C = abs(A)					      */
795 /*								      */
796 /*   res is C, the result.  C may be A				      */
797 /*   rhs is A							      */
798 /*   set is the context						      */
799 /*								      */
800 /* See also decNumberCopyAbs for a quiet bitwise version of this.     */
801 /* C must have space for set->digits digits.			      */
802 /* ------------------------------------------------------------------ */
803 /* This has the same effect as decNumberPlus unless A is negative,    */
804 /* in which case it has the same effect as decNumberMinus.	      */
805 /* ------------------------------------------------------------------ */
806 decNumber * decNumberAbs(decNumber *res, const decNumber *rhs,
807 			 decContext *set) {
808   decNumber dzero;			/* for 0 */
809   uInt status=0;			/* accumulator */
810 
811   #if DECCHECK
812   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
813   #endif
814 
815   decNumberZero(&dzero);		/* set 0 */
816   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
817   decAddOp(res, &dzero, rhs, set, (uByte)(rhs->bits & DECNEG), &status);
818   if (status!=0) decStatus(res, status, set);
819   #if DECCHECK
820   decCheckInexact(res, set);
821   #endif
822   return res;
823   } /* decNumberAbs */
824 
825 /* ------------------------------------------------------------------ */
826 /* decNumberAdd -- add two Numbers				      */
827 /*								      */
828 /*   This computes C = A + B					      */
829 /*								      */
830 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
831 /*   lhs is A							      */
832 /*   rhs is B							      */
833 /*   set is the context						      */
834 /*								      */
835 /* C must have space for set->digits digits.			      */
836 /* ------------------------------------------------------------------ */
837 /* This just calls the routine shared with Subtract		      */
838 decNumber * decNumberAdd(decNumber *res, const decNumber *lhs,
839 			 const decNumber *rhs, decContext *set) {
840   uInt status=0;			/* accumulator */
841   decAddOp(res, lhs, rhs, set, 0, &status);
842   if (status!=0) decStatus(res, status, set);
843   #if DECCHECK
844   decCheckInexact(res, set);
845   #endif
846   return res;
847   } /* decNumberAdd */
848 
849 /* ------------------------------------------------------------------ */
850 /* decNumberAnd -- AND two Numbers, digitwise			      */
851 /*								      */
852 /*   This computes C = A & B					      */
853 /*								      */
854 /*   res is C, the result.  C may be A and/or B (e.g., X=X&X)	      */
855 /*   lhs is A							      */
856 /*   rhs is B							      */
857 /*   set is the context (used for result length and error report)     */
858 /*								      */
859 /* C must have space for set->digits digits.			      */
860 /*								      */
861 /* Logical function restrictions apply (see above); a NaN is	      */
862 /* returned with Invalid_operation if a restriction is violated.      */
863 /* ------------------------------------------------------------------ */
864 decNumber * decNumberAnd(decNumber *res, const decNumber *lhs,
865 			 const decNumber *rhs, decContext *set) {
866   const Unit *ua, *ub;			/* -> operands */
867   const Unit *msua, *msub;		/* -> operand msus */
868   Unit *uc,  *msuc;			/* -> result and its msu */
869   Int	msudigs;			/* digits in res msu */
870   #if DECCHECK
871   if (decCheckOperands(res, lhs, rhs, set)) return res;
872   #endif
873 
874   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
875    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
876     decStatus(res, DEC_Invalid_operation, set);
877     return res;
878     }
879 
880   /* operands are valid */
881   ua=lhs->lsu;				/* bottom-up */
882   ub=rhs->lsu;				/* .. */
883   uc=res->lsu;				/* .. */
884   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
885   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
886   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
887   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
888   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
889     Unit a, b;				/* extract units */
890     if (ua>msua) a=0;
891      else a=*ua;
892     if (ub>msub) b=0;
893      else b=*ub;
894     *uc=0;				/* can now write back */
895     if (a|b) {				/* maybe 1 bits to examine */
896       Int i, j;
897       *uc=0;				/* can now write back */
898       /* This loop could be unrolled and/or use BIN2BCD tables */
899       for (i=0; i<DECDPUN; i++) {
900 	if (a&b&1) *uc=*uc+(Unit)powers[i];  /* effect AND */
901 	j=a%10;
902 	a=a/10;
903 	j|=b%10;
904 	b=b/10;
905 	if (j>1) {
906 	  decStatus(res, DEC_Invalid_operation, set);
907 	  return res;
908 	  }
909 	if (uc==msuc && i==msudigs-1) break; /* just did final digit */
910 	} /* each digit */
911       } /* both OK */
912     } /* each unit */
913   /* [here uc-1 is the msu of the result] */
914   res->digits=decGetDigits(res->lsu, uc-res->lsu);
915   res->exponent=0;			/* integer */
916   res->bits=0;				/* sign=0 */
917   return res;  /* [no status to set] */
918   } /* decNumberAnd */
919 
920 /* ------------------------------------------------------------------ */
921 /* decNumberCompare -- compare two Numbers			      */
922 /*								      */
923 /*   This computes C = A ? B					      */
924 /*								      */
925 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
926 /*   lhs is A							      */
927 /*   rhs is B							      */
928 /*   set is the context						      */
929 /*								      */
930 /* C must have space for one digit (or NaN).			      */
931 /* ------------------------------------------------------------------ */
932 decNumber * decNumberCompare(decNumber *res, const decNumber *lhs,
933 			     const decNumber *rhs, decContext *set) {
934   uInt status=0;			/* accumulator */
935   decCompareOp(res, lhs, rhs, set, COMPARE, &status);
936   if (status!=0) decStatus(res, status, set);
937   return res;
938   } /* decNumberCompare */
939 
940 /* ------------------------------------------------------------------ */
941 /* decNumberCompareSignal -- compare, signalling on all NaNs	      */
942 /*								      */
943 /*   This computes C = A ? B					      */
944 /*								      */
945 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
946 /*   lhs is A							      */
947 /*   rhs is B							      */
948 /*   set is the context						      */
949 /*								      */
950 /* C must have space for one digit (or NaN).			      */
951 /* ------------------------------------------------------------------ */
952 decNumber * decNumberCompareSignal(decNumber *res, const decNumber *lhs,
953 				   const decNumber *rhs, decContext *set) {
954   uInt status=0;			/* accumulator */
955   decCompareOp(res, lhs, rhs, set, COMPSIG, &status);
956   if (status!=0) decStatus(res, status, set);
957   return res;
958   } /* decNumberCompareSignal */
959 
960 /* ------------------------------------------------------------------ */
961 /* decNumberCompareTotal -- compare two Numbers, using total ordering */
962 /*								      */
963 /*   This computes C = A ? B, under total ordering		      */
964 /*								      */
965 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
966 /*   lhs is A							      */
967 /*   rhs is B							      */
968 /*   set is the context						      */
969 /*								      */
970 /* C must have space for one digit; the result will always be one of  */
971 /* -1, 0, or 1.							      */
972 /* ------------------------------------------------------------------ */
973 decNumber * decNumberCompareTotal(decNumber *res, const decNumber *lhs,
974 				  const decNumber *rhs, decContext *set) {
975   uInt status=0;			/* accumulator */
976   decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
977   if (status!=0) decStatus(res, status, set);
978   return res;
979   } /* decNumberCompareTotal */
980 
981 /* ------------------------------------------------------------------ */
982 /* decNumberCompareTotalMag -- compare, total ordering of magnitudes  */
983 /*								      */
984 /*   This computes C = |A| ? |B|, under total ordering		      */
985 /*								      */
986 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
987 /*   lhs is A							      */
988 /*   rhs is B							      */
989 /*   set is the context						      */
990 /*								      */
991 /* C must have space for one digit; the result will always be one of  */
992 /* -1, 0, or 1.							      */
993 /* ------------------------------------------------------------------ */
994 decNumber * decNumberCompareTotalMag(decNumber *res, const decNumber *lhs,
995 				     const decNumber *rhs, decContext *set) {
996   uInt status=0;		   /* accumulator */
997   uInt needbytes;		   /* for space calculations */
998   decNumber bufa[D2N(DECBUFFER+1)];/* +1 in case DECBUFFER=0 */
999   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1000   decNumber bufb[D2N(DECBUFFER+1)];
1001   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
1002   decNumber *a, *b;		   /* temporary pointers */
1003 
1004   #if DECCHECK
1005   if (decCheckOperands(res, lhs, rhs, set)) return res;
1006   #endif
1007 
1008   do {					/* protect allocated storage */
1009     /* if either is negative, take a copy and absolute */
1010     if (decNumberIsNegative(lhs)) {	/* lhs<0 */
1011       a=bufa;
1012       needbytes=sizeof(decNumber)+(D2U(lhs->digits)-1)*sizeof(Unit);
1013       if (needbytes>sizeof(bufa)) {	/* need malloc space */
1014 	allocbufa=(decNumber *)malloc(needbytes);
1015 	if (allocbufa==NULL) {		/* hopeless -- abandon */
1016 	  status|=DEC_Insufficient_storage;
1017 	  break;}
1018 	a=allocbufa;			/* use the allocated space */
1019 	}
1020       decNumberCopy(a, lhs);		/* copy content */
1021       a->bits&=~DECNEG;			/* .. and clear the sign */
1022       lhs=a;				/* use copy from here on */
1023       }
1024     if (decNumberIsNegative(rhs)) {	/* rhs<0 */
1025       b=bufb;
1026       needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
1027       if (needbytes>sizeof(bufb)) {	/* need malloc space */
1028 	allocbufb=(decNumber *)malloc(needbytes);
1029 	if (allocbufb==NULL) {		/* hopeless -- abandon */
1030 	  status|=DEC_Insufficient_storage;
1031 	  break;}
1032 	b=allocbufb;			/* use the allocated space */
1033 	}
1034       decNumberCopy(b, rhs);		/* copy content */
1035       b->bits&=~DECNEG;			/* .. and clear the sign */
1036       rhs=b;				/* use copy from here on */
1037       }
1038     decCompareOp(res, lhs, rhs, set, COMPTOTAL, &status);
1039     } while(0);				/* end protected */
1040 
1041   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1042   if (allocbufb!=NULL) free(allocbufb); /* .. */
1043   if (status!=0) decStatus(res, status, set);
1044   return res;
1045   } /* decNumberCompareTotalMag */
1046 
1047 /* ------------------------------------------------------------------ */
1048 /* decNumberDivide -- divide one number by another		      */
1049 /*								      */
1050 /*   This computes C = A / B					      */
1051 /*								      */
1052 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
1053 /*   lhs is A							      */
1054 /*   rhs is B							      */
1055 /*   set is the context						      */
1056 /*								      */
1057 /* C must have space for set->digits digits.			      */
1058 /* ------------------------------------------------------------------ */
1059 decNumber * decNumberDivide(decNumber *res, const decNumber *lhs,
1060 			    const decNumber *rhs, decContext *set) {
1061   uInt status=0;			/* accumulator */
1062   decDivideOp(res, lhs, rhs, set, DIVIDE, &status);
1063   if (status!=0) decStatus(res, status, set);
1064   #if DECCHECK
1065   decCheckInexact(res, set);
1066   #endif
1067   return res;
1068   } /* decNumberDivide */
1069 
1070 /* ------------------------------------------------------------------ */
1071 /* decNumberDivideInteger -- divide and return integer quotient	      */
1072 /*								      */
1073 /*   This computes C = A # B, where # is the integer divide operator  */
1074 /*								      */
1075 /*   res is C, the result.  C may be A and/or B (e.g., X=X#X)	      */
1076 /*   lhs is A							      */
1077 /*   rhs is B							      */
1078 /*   set is the context						      */
1079 /*								      */
1080 /* C must have space for set->digits digits.			      */
1081 /* ------------------------------------------------------------------ */
1082 decNumber * decNumberDivideInteger(decNumber *res, const decNumber *lhs,
1083 				   const decNumber *rhs, decContext *set) {
1084   uInt status=0;			/* accumulator */
1085   decDivideOp(res, lhs, rhs, set, DIVIDEINT, &status);
1086   if (status!=0) decStatus(res, status, set);
1087   return res;
1088   } /* decNumberDivideInteger */
1089 
1090 /* ------------------------------------------------------------------ */
1091 /* decNumberExp -- exponentiation				      */
1092 /*								      */
1093 /*   This computes C = exp(A)					      */
1094 /*								      */
1095 /*   res is C, the result.  C may be A				      */
1096 /*   rhs is A							      */
1097 /*   set is the context; note that rounding mode has no effect	      */
1098 /*								      */
1099 /* C must have space for set->digits digits.			      */
1100 /*								      */
1101 /* Mathematical function restrictions apply (see above); a NaN is     */
1102 /* returned with Invalid_operation if a restriction is violated.      */
1103 /*								      */
1104 /* Finite results will always be full precision and Inexact, except   */
1105 /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
1106 /*								      */
1107 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1108 /* almost always be correctly rounded, but may be up to 1 ulp in      */
1109 /* error in rare cases.						      */
1110 /* ------------------------------------------------------------------ */
1111 /* This is a wrapper for decExpOp which can handle the slightly wider */
1112 /* (double) range needed by Ln (which has to be able to calculate     */
1113 /* exp(-a) where a can be the tiniest number (Ntiny).		      */
1114 /* ------------------------------------------------------------------ */
1115 decNumber * decNumberExp(decNumber *res, const decNumber *rhs,
1116 			 decContext *set) {
1117   uInt status=0;			/* accumulator */
1118   #if DECSUBSET
1119   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1120   #endif
1121 
1122   #if DECCHECK
1123   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1124   #endif
1125 
1126   /* Check restrictions; these restrictions ensure that if h=8 (see */
1127   /* decExpOp) then the result will either overflow or underflow to 0. */
1128   /* Other math functions restrict the input range, too, for inverses. */
1129   /* If not violated then carry out the operation. */
1130   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1131     #if DECSUBSET
1132     if (!set->extended) {
1133       /* reduce operand and set lostDigits status, as needed */
1134       if (rhs->digits>set->digits) {
1135 	allocrhs=decRoundOperand(rhs, set, &status);
1136 	if (allocrhs==NULL) break;
1137 	rhs=allocrhs;
1138 	}
1139       }
1140     #endif
1141     decExpOp(res, rhs, set, &status);
1142     } while(0);				/* end protected */
1143 
1144   #if DECSUBSET
1145   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
1146   #endif
1147   /* apply significant status */
1148   if (status!=0) decStatus(res, status, set);
1149   #if DECCHECK
1150   decCheckInexact(res, set);
1151   #endif
1152   return res;
1153   } /* decNumberExp */
1154 
1155 /* ------------------------------------------------------------------ */
1156 /* decNumberFMA -- fused multiply add				      */
1157 /*								      */
1158 /*   This computes D = (A * B) + C with only one rounding	      */
1159 /*								      */
1160 /*   res is D, the result.  D may be A or B or C (e.g., X=FMA(X,X,X)) */
1161 /*   lhs is A							      */
1162 /*   rhs is B							      */
1163 /*   fhs is C [far hand side]					      */
1164 /*   set is the context						      */
1165 /*								      */
1166 /* Mathematical function restrictions apply (see above); a NaN is     */
1167 /* returned with Invalid_operation if a restriction is violated.      */
1168 /*								      */
1169 /* C must have space for set->digits digits.			      */
1170 /* ------------------------------------------------------------------ */
1171 decNumber * decNumberFMA(decNumber *res, const decNumber *lhs,
1172 			 const decNumber *rhs, const decNumber *fhs,
1173 			 decContext *set) {
1174   uInt status=0;		   /* accumulator */
1175   decContext dcmul;		   /* context for the multiplication */
1176   uInt needbytes;		   /* for space calculations */
1177   decNumber bufa[D2N(DECBUFFER*2+1)];
1178   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1179   decNumber *acc;		   /* accumulator pointer */
1180   decNumber dzero;		   /* work */
1181 
1182   #if DECCHECK
1183   if (decCheckOperands(res, lhs, rhs, set)) return res;
1184   if (decCheckOperands(res, fhs, DECUNUSED, set)) return res;
1185   #endif
1186 
1187   do {					/* protect allocated storage */
1188     #if DECSUBSET
1189     if (!set->extended) {		/* [undefined if subset] */
1190       status|=DEC_Invalid_operation;
1191       break;}
1192     #endif
1193     /* Check math restrictions [these ensure no overflow or underflow] */
1194     if ((!decNumberIsSpecial(lhs) && decCheckMath(lhs, set, &status))
1195      || (!decNumberIsSpecial(rhs) && decCheckMath(rhs, set, &status))
1196      || (!decNumberIsSpecial(fhs) && decCheckMath(fhs, set, &status))) break;
1197     /* set up context for multiply */
1198     dcmul=*set;
1199     dcmul.digits=lhs->digits+rhs->digits; /* just enough */
1200     /* [The above may be an over-estimate for subset arithmetic, but that's OK] */
1201     dcmul.emax=DEC_MAX_EMAX;		/* effectively unbounded .. */
1202     dcmul.emin=DEC_MIN_EMIN;		/* [thanks to Math restrictions] */
1203     /* set up decNumber space to receive the result of the multiply */
1204     acc=bufa;				/* may fit */
1205     needbytes=sizeof(decNumber)+(D2U(dcmul.digits)-1)*sizeof(Unit);
1206     if (needbytes>sizeof(bufa)) {	/* need malloc space */
1207       allocbufa=(decNumber *)malloc(needbytes);
1208       if (allocbufa==NULL) {		/* hopeless -- abandon */
1209 	status|=DEC_Insufficient_storage;
1210 	break;}
1211       acc=allocbufa;			/* use the allocated space */
1212       }
1213     /* multiply with extended range and necessary precision */
1214     /*printf("emin=%ld\n", dcmul.emin); */
1215     decMultiplyOp(acc, lhs, rhs, &dcmul, &status);
1216     /* Only Invalid operation (from sNaN or Inf * 0) is possible in */
1217     /* status; if either is seen than ignore fhs (in case it is */
1218     /* another sNaN) and set acc to NaN unless we had an sNaN */
1219     /* [decMultiplyOp leaves that to caller] */
1220     /* Note sNaN has to go through addOp to shorten payload if */
1221     /* necessary */
1222     if ((status&DEC_Invalid_operation)!=0) {
1223       if (!(status&DEC_sNaN)) {		/* but be true invalid */
1224 	decNumberZero(res);		/* acc not yet set */
1225 	res->bits=DECNAN;
1226 	break;
1227 	}
1228       decNumberZero(&dzero);		/* make 0 (any non-NaN would do) */
1229       fhs=&dzero;			/* use that */
1230       }
1231     #if DECCHECK
1232      else { /* multiply was OK */
1233       if (status!=0) printf("Status=%08lx after FMA multiply\n", status);
1234       }
1235     #endif
1236     /* add the third operand and result -> res, and all is done */
1237     decAddOp(res, acc, fhs, set, 0, &status);
1238     } while(0);				/* end protected */
1239 
1240   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1241   if (status!=0) decStatus(res, status, set);
1242   #if DECCHECK
1243   decCheckInexact(res, set);
1244   #endif
1245   return res;
1246   } /* decNumberFMA */
1247 
1248 /* ------------------------------------------------------------------ */
1249 /* decNumberInvert -- invert a Number, digitwise		      */
1250 /*								      */
1251 /*   This computes C = ~A					      */
1252 /*								      */
1253 /*   res is C, the result.  C may be A (e.g., X=~X)		      */
1254 /*   rhs is A							      */
1255 /*   set is the context (used for result length and error report)     */
1256 /*								      */
1257 /* C must have space for set->digits digits.			      */
1258 /*								      */
1259 /* Logical function restrictions apply (see above); a NaN is	      */
1260 /* returned with Invalid_operation if a restriction is violated.      */
1261 /* ------------------------------------------------------------------ */
1262 decNumber * decNumberInvert(decNumber *res, const decNumber *rhs,
1263 			    decContext *set) {
1264   const Unit *ua, *msua;		/* -> operand and its msu */
1265   Unit	*uc, *msuc;			/* -> result and its msu */
1266   Int	msudigs;			/* digits in res msu */
1267   #if DECCHECK
1268   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1269   #endif
1270 
1271   if (rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1272     decStatus(res, DEC_Invalid_operation, set);
1273     return res;
1274     }
1275   /* operand is valid */
1276   ua=rhs->lsu;				/* bottom-up */
1277   uc=res->lsu;				/* .. */
1278   msua=ua+D2U(rhs->digits)-1;		/* -> msu of rhs */
1279   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
1280   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
1281   for (; uc<=msuc; ua++, uc++) {	/* Unit loop */
1282     Unit a;				/* extract unit */
1283     Int	 i, j;				/* work */
1284     if (ua>msua) a=0;
1285      else a=*ua;
1286     *uc=0;				/* can now write back */
1287     /* always need to examine all bits in rhs */
1288     /* This loop could be unrolled and/or use BIN2BCD tables */
1289     for (i=0; i<DECDPUN; i++) {
1290       if ((~a)&1) *uc=*uc+(Unit)powers[i];   /* effect INVERT */
1291       j=a%10;
1292       a=a/10;
1293       if (j>1) {
1294 	decStatus(res, DEC_Invalid_operation, set);
1295 	return res;
1296 	}
1297       if (uc==msuc && i==msudigs-1) break;   /* just did final digit */
1298       } /* each digit */
1299     } /* each unit */
1300   /* [here uc-1 is the msu of the result] */
1301   res->digits=decGetDigits(res->lsu, uc-res->lsu);
1302   res->exponent=0;			/* integer */
1303   res->bits=0;				/* sign=0 */
1304   return res;  /* [no status to set] */
1305   } /* decNumberInvert */
1306 
1307 /* ------------------------------------------------------------------ */
1308 /* decNumberLn -- natural logarithm				      */
1309 /*								      */
1310 /*   This computes C = ln(A)					      */
1311 /*								      */
1312 /*   res is C, the result.  C may be A				      */
1313 /*   rhs is A							      */
1314 /*   set is the context; note that rounding mode has no effect	      */
1315 /*								      */
1316 /* C must have space for set->digits digits.			      */
1317 /*								      */
1318 /* Notable cases:						      */
1319 /*   A<0 -> Invalid						      */
1320 /*   A=0 -> -Infinity (Exact)					      */
1321 /*   A=+Infinity -> +Infinity (Exact)				      */
1322 /*   A=1 exactly -> 0 (Exact)					      */
1323 /*								      */
1324 /* Mathematical function restrictions apply (see above); a NaN is     */
1325 /* returned with Invalid_operation if a restriction is violated.      */
1326 /*								      */
1327 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1328 /* almost always be correctly rounded, but may be up to 1 ulp in      */
1329 /* error in rare cases.						      */
1330 /* ------------------------------------------------------------------ */
1331 /* This is a wrapper for decLnOp which can handle the slightly wider  */
1332 /* (+11) range needed by Ln, Log10, etc. (which may have to be able   */
1333 /* to calculate at p+e+2).					      */
1334 /* ------------------------------------------------------------------ */
1335 decNumber * decNumberLn(decNumber *res, const decNumber *rhs,
1336 			decContext *set) {
1337   uInt status=0;		   /* accumulator */
1338   #if DECSUBSET
1339   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1340   #endif
1341 
1342   #if DECCHECK
1343   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1344   #endif
1345 
1346   /* Check restrictions; this is a math function; if not violated */
1347   /* then carry out the operation. */
1348   if (!decCheckMath(rhs, set, &status)) do { /* protect allocation */
1349     #if DECSUBSET
1350     if (!set->extended) {
1351       /* reduce operand and set lostDigits status, as needed */
1352       if (rhs->digits>set->digits) {
1353 	allocrhs=decRoundOperand(rhs, set, &status);
1354 	if (allocrhs==NULL) break;
1355 	rhs=allocrhs;
1356 	}
1357       /* special check in subset for rhs=0 */
1358       if (ISZERO(rhs)) {		/* +/- zeros -> error */
1359 	status|=DEC_Invalid_operation;
1360 	break;}
1361       } /* extended=0 */
1362     #endif
1363     decLnOp(res, rhs, set, &status);
1364     } while(0);				/* end protected */
1365 
1366   #if DECSUBSET
1367   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
1368   #endif
1369   /* apply significant status */
1370   if (status!=0) decStatus(res, status, set);
1371   #if DECCHECK
1372   decCheckInexact(res, set);
1373   #endif
1374   return res;
1375   } /* decNumberLn */
1376 
1377 /* ------------------------------------------------------------------ */
1378 /* decNumberLogB - get adjusted exponent, by 754r rules		      */
1379 /*								      */
1380 /*   This computes C = adjustedexponent(A)			      */
1381 /*								      */
1382 /*   res is C, the result.  C may be A				      */
1383 /*   rhs is A							      */
1384 /*   set is the context, used only for digits and status	      */
1385 /*								      */
1386 /* C must have space for 10 digits (A might have 10**9 digits and     */
1387 /* an exponent of +999999999, or one digit and an exponent of	      */
1388 /* -1999999999).						      */
1389 /*								      */
1390 /* This returns the adjusted exponent of A after (in theory) padding  */
1391 /* with zeros on the right to set->digits digits while keeping the    */
1392 /* same value.	The exponent is not limited by emin/emax.	      */
1393 /*								      */
1394 /* Notable cases:						      */
1395 /*   A<0 -> Use |A|						      */
1396 /*   A=0 -> -Infinity (Division by zero)			      */
1397 /*   A=Infinite -> +Infinity (Exact)				      */
1398 /*   A=1 exactly -> 0 (Exact)					      */
1399 /*   NaNs are propagated as usual				      */
1400 /* ------------------------------------------------------------------ */
1401 decNumber * decNumberLogB(decNumber *res, const decNumber *rhs,
1402 			  decContext *set) {
1403   uInt status=0;		   /* accumulator */
1404 
1405   #if DECCHECK
1406   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1407   #endif
1408 
1409   /* NaNs as usual; Infinities return +Infinity; 0->oops */
1410   if (decNumberIsNaN(rhs)) decNaNs(res, rhs, NULL, set, &status);
1411    else if (decNumberIsInfinite(rhs)) decNumberCopyAbs(res, rhs);
1412    else if (decNumberIsZero(rhs)) {
1413     decNumberZero(res);			/* prepare for Infinity */
1414     res->bits=DECNEG|DECINF;		/* -Infinity */
1415     status|=DEC_Division_by_zero;	/* as per 754r */
1416     }
1417    else { /* finite non-zero */
1418     Int ae=rhs->exponent+rhs->digits-1; /* adjusted exponent */
1419     decNumberFromInt32(res, ae);	/* lay it out */
1420     }
1421 
1422   if (status!=0) decStatus(res, status, set);
1423   return res;
1424   } /* decNumberLogB */
1425 
1426 /* ------------------------------------------------------------------ */
1427 /* decNumberLog10 -- logarithm in base 10			      */
1428 /*								      */
1429 /*   This computes C = log10(A)					      */
1430 /*								      */
1431 /*   res is C, the result.  C may be A				      */
1432 /*   rhs is A							      */
1433 /*   set is the context; note that rounding mode has no effect	      */
1434 /*								      */
1435 /* C must have space for set->digits digits.			      */
1436 /*								      */
1437 /* Notable cases:						      */
1438 /*   A<0 -> Invalid						      */
1439 /*   A=0 -> -Infinity (Exact)					      */
1440 /*   A=+Infinity -> +Infinity (Exact)				      */
1441 /*   A=10**n (if n is an integer) -> n (Exact)			      */
1442 /*								      */
1443 /* Mathematical function restrictions apply (see above); a NaN is     */
1444 /* returned with Invalid_operation if a restriction is violated.      */
1445 /*								      */
1446 /* An Inexact result is rounded using DEC_ROUND_HALF_EVEN; it will    */
1447 /* almost always be correctly rounded, but may be up to 1 ulp in      */
1448 /* error in rare cases.						      */
1449 /* ------------------------------------------------------------------ */
1450 /* This calculates ln(A)/ln(10) using appropriate precision.  For     */
1451 /* ln(A) this is the max(p, rhs->digits + t) + 3, where p is the      */
1452 /* requested digits and t is the number of digits in the exponent     */
1453 /* (maximum 6).	 For ln(10) it is p + 3; this is often handled by the */
1454 /* fastpath in decLnOp.	 The final division is done to the requested  */
1455 /* precision.							      */
1456 /* ------------------------------------------------------------------ */
1457 decNumber * decNumberLog10(decNumber *res, const decNumber *rhs,
1458 			  decContext *set) {
1459   uInt status=0, ignore=0;	   /* status accumulators */
1460   uInt needbytes;		   /* for space calculations */
1461   Int p;			   /* working precision */
1462   Int t;			   /* digits in exponent of A */
1463 
1464   /* buffers for a and b working decimals */
1465   /* (adjustment calculator, same size) */
1466   decNumber bufa[D2N(DECBUFFER+2)];
1467   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
1468   decNumber *a=bufa;		   /* temporary a */
1469   decNumber bufb[D2N(DECBUFFER+2)];
1470   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
1471   decNumber *b=bufb;		   /* temporary b */
1472   decNumber bufw[D2N(10)];	   /* working 2-10 digit number */
1473   decNumber *w=bufw;		   /* .. */
1474   #if DECSUBSET
1475   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
1476   #endif
1477 
1478   decContext aset;		   /* working context */
1479 
1480   #if DECCHECK
1481   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1482   #endif
1483 
1484   /* Check restrictions; this is a math function; if not violated */
1485   /* then carry out the operation. */
1486   if (!decCheckMath(rhs, set, &status)) do { /* protect malloc */
1487     #if DECSUBSET
1488     if (!set->extended) {
1489       /* reduce operand and set lostDigits status, as needed */
1490       if (rhs->digits>set->digits) {
1491 	allocrhs=decRoundOperand(rhs, set, &status);
1492 	if (allocrhs==NULL) break;
1493 	rhs=allocrhs;
1494 	}
1495       /* special check in subset for rhs=0 */
1496       if (ISZERO(rhs)) {		/* +/- zeros -> error */
1497 	status|=DEC_Invalid_operation;
1498 	break;}
1499       } /* extended=0 */
1500     #endif
1501 
1502     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
1503 
1504     /* handle exact powers of 10; only check if +ve finite */
1505     if (!(rhs->bits&(DECNEG|DECSPECIAL)) && !ISZERO(rhs)) {
1506       Int residue=0;		   /* (no residue) */
1507       uInt copystat=0;		   /* clean status */
1508 
1509       /* round to a single digit... */
1510       aset.digits=1;
1511       decCopyFit(w, rhs, &aset, &residue, &copystat); /* copy & shorten */
1512       /* if exact and the digit is 1, rhs is a power of 10 */
1513       if (!(copystat&DEC_Inexact) && w->lsu[0]==1) {
1514 	/* the exponent, conveniently, is the power of 10; making */
1515 	/* this the result needs a little care as it might not fit, */
1516 	/* so first convert it into the working number, and then move */
1517 	/* to res */
1518 	decNumberFromInt32(w, w->exponent);
1519 	residue=0;
1520 	decCopyFit(res, w, set, &residue, &status); /* copy & round */
1521 	decFinish(res, set, &residue, &status);	    /* cleanup/set flags */
1522 	break;
1523 	} /* not a power of 10 */
1524       } /* not a candidate for exact */
1525 
1526     /* simplify the information-content calculation to use 'total */
1527     /* number of digits in a, including exponent' as compared to the */
1528     /* requested digits, as increasing this will only rarely cost an */
1529     /* iteration in ln(a) anyway */
1530     t=6;				/* it can never be >6 */
1531 
1532     /* allocate space when needed... */
1533     p=(rhs->digits+t>set->digits?rhs->digits+t:set->digits)+3;
1534     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1535     if (needbytes>sizeof(bufa)) {	/* need malloc space */
1536       allocbufa=(decNumber *)malloc(needbytes);
1537       if (allocbufa==NULL) {		/* hopeless -- abandon */
1538 	status|=DEC_Insufficient_storage;
1539 	break;}
1540       a=allocbufa;			/* use the allocated space */
1541       }
1542     aset.digits=p;			/* as calculated */
1543     aset.emax=DEC_MAX_MATH;		/* usual bounds */
1544     aset.emin=-DEC_MAX_MATH;		/* .. */
1545     aset.clamp=0;			/* and no concrete format */
1546     decLnOp(a, rhs, &aset, &status);	/* a=ln(rhs) */
1547 
1548     /* skip the division if the result so far is infinite, NaN, or */
1549     /* zero, or there was an error; note NaN from sNaN needs copy */
1550     if (status&DEC_NaNs && !(status&DEC_sNaN)) break;
1551     if (a->bits&DECSPECIAL || ISZERO(a)) {
1552       decNumberCopy(res, a);		/* [will fit] */
1553       break;}
1554 
1555     /* for ln(10) an extra 3 digits of precision are needed */
1556     p=set->digits+3;
1557     needbytes=sizeof(decNumber)+(D2U(p)-1)*sizeof(Unit);
1558     if (needbytes>sizeof(bufb)) {	/* need malloc space */
1559       allocbufb=(decNumber *)malloc(needbytes);
1560       if (allocbufb==NULL) {		/* hopeless -- abandon */
1561 	status|=DEC_Insufficient_storage;
1562 	break;}
1563       b=allocbufb;			/* use the allocated space */
1564       }
1565     decNumberZero(w);			/* set up 10... */
1566     #if DECDPUN==1
1567     w->lsu[1]=1; w->lsu[0]=0;		/* .. */
1568     #else
1569     w->lsu[0]=10;			/* .. */
1570     #endif
1571     w->digits=2;			/* .. */
1572 
1573     aset.digits=p;
1574     decLnOp(b, w, &aset, &ignore);	/* b=ln(10) */
1575 
1576     aset.digits=set->digits;		/* for final divide */
1577     decDivideOp(res, a, b, &aset, DIVIDE, &status); /* into result */
1578     } while(0);				/* [for break] */
1579 
1580   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
1581   if (allocbufb!=NULL) free(allocbufb); /* .. */
1582   #if DECSUBSET
1583   if (allocrhs !=NULL) free(allocrhs);	/* .. */
1584   #endif
1585   /* apply significant status */
1586   if (status!=0) decStatus(res, status, set);
1587   #if DECCHECK
1588   decCheckInexact(res, set);
1589   #endif
1590   return res;
1591   } /* decNumberLog10 */
1592 
1593 /* ------------------------------------------------------------------ */
1594 /* decNumberMax -- compare two Numbers and return the maximum	      */
1595 /*								      */
1596 /*   This computes C = A ? B, returning the maximum by 754R rules     */
1597 /*								      */
1598 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1599 /*   lhs is A							      */
1600 /*   rhs is B							      */
1601 /*   set is the context						      */
1602 /*								      */
1603 /* C must have space for set->digits digits.			      */
1604 /* ------------------------------------------------------------------ */
1605 decNumber * decNumberMax(decNumber *res, const decNumber *lhs,
1606 			 const decNumber *rhs, decContext *set) {
1607   uInt status=0;			/* accumulator */
1608   decCompareOp(res, lhs, rhs, set, COMPMAX, &status);
1609   if (status!=0) decStatus(res, status, set);
1610   #if DECCHECK
1611   decCheckInexact(res, set);
1612   #endif
1613   return res;
1614   } /* decNumberMax */
1615 
1616 /* ------------------------------------------------------------------ */
1617 /* decNumberMaxMag -- compare and return the maximum by magnitude     */
1618 /*								      */
1619 /*   This computes C = A ? B, returning the maximum by 754R rules     */
1620 /*								      */
1621 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1622 /*   lhs is A							      */
1623 /*   rhs is B							      */
1624 /*   set is the context						      */
1625 /*								      */
1626 /* C must have space for set->digits digits.			      */
1627 /* ------------------------------------------------------------------ */
1628 decNumber * decNumberMaxMag(decNumber *res, const decNumber *lhs,
1629 			 const decNumber *rhs, decContext *set) {
1630   uInt status=0;			/* accumulator */
1631   decCompareOp(res, lhs, rhs, set, COMPMAXMAG, &status);
1632   if (status!=0) decStatus(res, status, set);
1633   #if DECCHECK
1634   decCheckInexact(res, set);
1635   #endif
1636   return res;
1637   } /* decNumberMaxMag */
1638 
1639 /* ------------------------------------------------------------------ */
1640 /* decNumberMin -- compare two Numbers and return the minimum	      */
1641 /*								      */
1642 /*   This computes C = A ? B, returning the minimum by 754R rules     */
1643 /*								      */
1644 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1645 /*   lhs is A							      */
1646 /*   rhs is B							      */
1647 /*   set is the context						      */
1648 /*								      */
1649 /* C must have space for set->digits digits.			      */
1650 /* ------------------------------------------------------------------ */
1651 decNumber * decNumberMin(decNumber *res, const decNumber *lhs,
1652 			 const decNumber *rhs, decContext *set) {
1653   uInt status=0;			/* accumulator */
1654   decCompareOp(res, lhs, rhs, set, COMPMIN, &status);
1655   if (status!=0) decStatus(res, status, set);
1656   #if DECCHECK
1657   decCheckInexact(res, set);
1658   #endif
1659   return res;
1660   } /* decNumberMin */
1661 
1662 /* ------------------------------------------------------------------ */
1663 /* decNumberMinMag -- compare and return the minimum by magnitude     */
1664 /*								      */
1665 /*   This computes C = A ? B, returning the minimum by 754R rules     */
1666 /*								      */
1667 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
1668 /*   lhs is A							      */
1669 /*   rhs is B							      */
1670 /*   set is the context						      */
1671 /*								      */
1672 /* C must have space for set->digits digits.			      */
1673 /* ------------------------------------------------------------------ */
1674 decNumber * decNumberMinMag(decNumber *res, const decNumber *lhs,
1675 			 const decNumber *rhs, decContext *set) {
1676   uInt status=0;			/* accumulator */
1677   decCompareOp(res, lhs, rhs, set, COMPMINMAG, &status);
1678   if (status!=0) decStatus(res, status, set);
1679   #if DECCHECK
1680   decCheckInexact(res, set);
1681   #endif
1682   return res;
1683   } /* decNumberMinMag */
1684 
1685 /* ------------------------------------------------------------------ */
1686 /* decNumberMinus -- prefix minus operator			      */
1687 /*								      */
1688 /*   This computes C = 0 - A					      */
1689 /*								      */
1690 /*   res is C, the result.  C may be A				      */
1691 /*   rhs is A							      */
1692 /*   set is the context						      */
1693 /*								      */
1694 /* See also decNumberCopyNegate for a quiet bitwise version of this.  */
1695 /* C must have space for set->digits digits.			      */
1696 /* ------------------------------------------------------------------ */
1697 /* Simply use AddOp for the subtract, which will do the necessary.    */
1698 /* ------------------------------------------------------------------ */
1699 decNumber * decNumberMinus(decNumber *res, const decNumber *rhs,
1700 			   decContext *set) {
1701   decNumber dzero;
1702   uInt status=0;			/* accumulator */
1703 
1704   #if DECCHECK
1705   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1706   #endif
1707 
1708   decNumberZero(&dzero);		/* make 0 */
1709   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
1710   decAddOp(res, &dzero, rhs, set, DECNEG, &status);
1711   if (status!=0) decStatus(res, status, set);
1712   #if DECCHECK
1713   decCheckInexact(res, set);
1714   #endif
1715   return res;
1716   } /* decNumberMinus */
1717 
1718 /* ------------------------------------------------------------------ */
1719 /* decNumberNextMinus -- next towards -Infinity			      */
1720 /*								      */
1721 /*   This computes C = A - infinitesimal, rounded towards -Infinity   */
1722 /*								      */
1723 /*   res is C, the result.  C may be A				      */
1724 /*   rhs is A							      */
1725 /*   set is the context						      */
1726 /*								      */
1727 /* This is a generalization of 754r NextDown.			      */
1728 /* ------------------------------------------------------------------ */
1729 decNumber * decNumberNextMinus(decNumber *res, const decNumber *rhs,
1730 			       decContext *set) {
1731   decNumber dtiny;			     /* constant */
1732   decContext workset=*set;		     /* work */
1733   uInt status=0;			     /* accumulator */
1734   #if DECCHECK
1735   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1736   #endif
1737 
1738   /* +Infinity is the special case */
1739   if ((rhs->bits&(DECINF|DECNEG))==DECINF) {
1740     decSetMaxValue(res, set);		     /* is +ve */
1741     /* there is no status to set */
1742     return res;
1743     }
1744   decNumberZero(&dtiny);		     /* start with 0 */
1745   dtiny.lsu[0]=1;			     /* make number that is .. */
1746   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
1747   workset.round=DEC_ROUND_FLOOR;
1748   decAddOp(res, rhs, &dtiny, &workset, DECNEG, &status);
1749   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1750   if (status!=0) decStatus(res, status, set);
1751   return res;
1752   } /* decNumberNextMinus */
1753 
1754 /* ------------------------------------------------------------------ */
1755 /* decNumberNextPlus -- next towards +Infinity			      */
1756 /*								      */
1757 /*   This computes C = A + infinitesimal, rounded towards +Infinity   */
1758 /*								      */
1759 /*   res is C, the result.  C may be A				      */
1760 /*   rhs is A							      */
1761 /*   set is the context						      */
1762 /*								      */
1763 /* This is a generalization of 754r NextUp.			      */
1764 /* ------------------------------------------------------------------ */
1765 decNumber * decNumberNextPlus(decNumber *res, const decNumber *rhs,
1766 			      decContext *set) {
1767   decNumber dtiny;			     /* constant */
1768   decContext workset=*set;		     /* work */
1769   uInt status=0;			     /* accumulator */
1770   #if DECCHECK
1771   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1772   #endif
1773 
1774   /* -Infinity is the special case */
1775   if ((rhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1776     decSetMaxValue(res, set);
1777     res->bits=DECNEG;			     /* negative */
1778     /* there is no status to set */
1779     return res;
1780     }
1781   decNumberZero(&dtiny);		     /* start with 0 */
1782   dtiny.lsu[0]=1;			     /* make number that is .. */
1783   dtiny.exponent=DEC_MIN_EMIN-1;	     /* .. smaller than tiniest */
1784   workset.round=DEC_ROUND_CEILING;
1785   decAddOp(res, rhs, &dtiny, &workset, 0, &status);
1786   status&=DEC_Invalid_operation|DEC_sNaN;    /* only sNaN Invalid please */
1787   if (status!=0) decStatus(res, status, set);
1788   return res;
1789   } /* decNumberNextPlus */
1790 
1791 /* ------------------------------------------------------------------ */
1792 /* decNumberNextToward -- next towards rhs			      */
1793 /*								      */
1794 /*   This computes C = A +/- infinitesimal, rounded towards	      */
1795 /*   +/-Infinity in the direction of B, as per 754r nextafter rules   */
1796 /*								      */
1797 /*   res is C, the result.  C may be A or B.			      */
1798 /*   lhs is A							      */
1799 /*   rhs is B							      */
1800 /*   set is the context						      */
1801 /*								      */
1802 /* This is a generalization of 754r NextAfter.			      */
1803 /* ------------------------------------------------------------------ */
1804 decNumber * decNumberNextToward(decNumber *res, const decNumber *lhs,
1805 				const decNumber *rhs, decContext *set) {
1806   decNumber dtiny;			     /* constant */
1807   decContext workset=*set;		     /* work */
1808   Int result;				     /* .. */
1809   uInt status=0;			     /* accumulator */
1810   #if DECCHECK
1811   if (decCheckOperands(res, lhs, rhs, set)) return res;
1812   #endif
1813 
1814   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) {
1815     decNaNs(res, lhs, rhs, set, &status);
1816     }
1817    else { /* Is numeric, so no chance of sNaN Invalid, etc. */
1818     result=decCompare(lhs, rhs, 0);	/* sign matters */
1819     if (result==BADINT) status|=DEC_Insufficient_storage; /* rare */
1820      else { /* valid compare */
1821       if (result==0) decNumberCopySign(res, lhs, rhs); /* easy */
1822        else { /* differ: need NextPlus or NextMinus */
1823 	uByte sub;			/* add or subtract */
1824 	if (result<0) {			/* lhs<rhs, do nextplus */
1825 	  /* -Infinity is the special case */
1826 	  if ((lhs->bits&(DECINF|DECNEG))==(DECINF|DECNEG)) {
1827 	    decSetMaxValue(res, set);
1828 	    res->bits=DECNEG;		/* negative */
1829 	    return res;			/* there is no status to set */
1830 	    }
1831 	  workset.round=DEC_ROUND_CEILING;
1832 	  sub=0;			/* add, please */
1833 	  } /* plus */
1834 	 else {				/* lhs>rhs, do nextminus */
1835 	  /* +Infinity is the special case */
1836 	  if ((lhs->bits&(DECINF|DECNEG))==DECINF) {
1837 	    decSetMaxValue(res, set);
1838 	    return res;			/* there is no status to set */
1839 	    }
1840 	  workset.round=DEC_ROUND_FLOOR;
1841 	  sub=DECNEG;			/* subtract, please */
1842 	  } /* minus */
1843 	decNumberZero(&dtiny);		/* start with 0 */
1844 	dtiny.lsu[0]=1;			/* make number that is .. */
1845 	dtiny.exponent=DEC_MIN_EMIN-1;	/* .. smaller than tiniest */
1846 	decAddOp(res, lhs, &dtiny, &workset, sub, &status); /* + or - */
1847 	/* turn off exceptions if the result is a normal number */
1848 	/* (including Nmin), otherwise let all status through */
1849 	if (decNumberIsNormal(res, set)) status=0;
1850 	} /* unequal */
1851       } /* compare OK */
1852     } /* numeric */
1853   if (status!=0) decStatus(res, status, set);
1854   return res;
1855   } /* decNumberNextToward */
1856 
1857 /* ------------------------------------------------------------------ */
1858 /* decNumberOr -- OR two Numbers, digitwise			      */
1859 /*								      */
1860 /*   This computes C = A | B					      */
1861 /*								      */
1862 /*   res is C, the result.  C may be A and/or B (e.g., X=X|X)	      */
1863 /*   lhs is A							      */
1864 /*   rhs is B							      */
1865 /*   set is the context (used for result length and error report)     */
1866 /*								      */
1867 /* C must have space for set->digits digits.			      */
1868 /*								      */
1869 /* Logical function restrictions apply (see above); a NaN is	      */
1870 /* returned with Invalid_operation if a restriction is violated.      */
1871 /* ------------------------------------------------------------------ */
1872 decNumber * decNumberOr(decNumber *res, const decNumber *lhs,
1873 			const decNumber *rhs, decContext *set) {
1874   const Unit *ua, *ub;			/* -> operands */
1875   const Unit *msua, *msub;		/* -> operand msus */
1876   Unit	*uc, *msuc;			/* -> result and its msu */
1877   Int	msudigs;			/* digits in res msu */
1878   #if DECCHECK
1879   if (decCheckOperands(res, lhs, rhs, set)) return res;
1880   #endif
1881 
1882   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
1883    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
1884     decStatus(res, DEC_Invalid_operation, set);
1885     return res;
1886     }
1887   /* operands are valid */
1888   ua=lhs->lsu;				/* bottom-up */
1889   ub=rhs->lsu;				/* .. */
1890   uc=res->lsu;				/* .. */
1891   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
1892   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
1893   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
1894   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
1895   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
1896     Unit a, b;				/* extract units */
1897     if (ua>msua) a=0;
1898      else a=*ua;
1899     if (ub>msub) b=0;
1900      else b=*ub;
1901     *uc=0;				/* can now write back */
1902     if (a|b) {				/* maybe 1 bits to examine */
1903       Int i, j;
1904       /* This loop could be unrolled and/or use BIN2BCD tables */
1905       for (i=0; i<DECDPUN; i++) {
1906 	if ((a|b)&1) *uc=*uc+(Unit)powers[i];	  /* effect OR */
1907 	j=a%10;
1908 	a=a/10;
1909 	j|=b%10;
1910 	b=b/10;
1911 	if (j>1) {
1912 	  decStatus(res, DEC_Invalid_operation, set);
1913 	  return res;
1914 	  }
1915 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
1916 	} /* each digit */
1917       } /* non-zero */
1918     } /* each unit */
1919   /* [here uc-1 is the msu of the result] */
1920   res->digits=decGetDigits(res->lsu, uc-res->lsu);
1921   res->exponent=0;			/* integer */
1922   res->bits=0;				/* sign=0 */
1923   return res;  /* [no status to set] */
1924   } /* decNumberOr */
1925 
1926 /* ------------------------------------------------------------------ */
1927 /* decNumberPlus -- prefix plus operator			      */
1928 /*								      */
1929 /*   This computes C = 0 + A					      */
1930 /*								      */
1931 /*   res is C, the result.  C may be A				      */
1932 /*   rhs is A							      */
1933 /*   set is the context						      */
1934 /*								      */
1935 /* See also decNumberCopy for a quiet bitwise version of this.	      */
1936 /* C must have space for set->digits digits.			      */
1937 /* ------------------------------------------------------------------ */
1938 /* This simply uses AddOp; Add will take fast path after preparing A. */
1939 /* Performance is a concern here, as this routine is often used to    */
1940 /* check operands and apply rounding and overflow/underflow testing.  */
1941 /* ------------------------------------------------------------------ */
1942 decNumber * decNumberPlus(decNumber *res, const decNumber *rhs,
1943 			  decContext *set) {
1944   decNumber dzero;
1945   uInt status=0;			/* accumulator */
1946   #if DECCHECK
1947   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
1948   #endif
1949 
1950   decNumberZero(&dzero);		/* make 0 */
1951   dzero.exponent=rhs->exponent;		/* [no coefficient expansion] */
1952   decAddOp(res, &dzero, rhs, set, 0, &status);
1953   if (status!=0) decStatus(res, status, set);
1954   #if DECCHECK
1955   decCheckInexact(res, set);
1956   #endif
1957   return res;
1958   } /* decNumberPlus */
1959 
1960 /* ------------------------------------------------------------------ */
1961 /* decNumberMultiply -- multiply two Numbers			      */
1962 /*								      */
1963 /*   This computes C = A x B					      */
1964 /*								      */
1965 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
1966 /*   lhs is A							      */
1967 /*   rhs is B							      */
1968 /*   set is the context						      */
1969 /*								      */
1970 /* C must have space for set->digits digits.			      */
1971 /* ------------------------------------------------------------------ */
1972 decNumber * decNumberMultiply(decNumber *res, const decNumber *lhs,
1973 			      const decNumber *rhs, decContext *set) {
1974   uInt status=0;		   /* accumulator */
1975   decMultiplyOp(res, lhs, rhs, set, &status);
1976   if (status!=0) decStatus(res, status, set);
1977   #if DECCHECK
1978   decCheckInexact(res, set);
1979   #endif
1980   return res;
1981   } /* decNumberMultiply */
1982 
1983 /* ------------------------------------------------------------------ */
1984 /* decNumberPower -- raise a number to a power			      */
1985 /*								      */
1986 /*   This computes C = A ** B					      */
1987 /*								      */
1988 /*   res is C, the result.  C may be A and/or B (e.g., X=X**X)	      */
1989 /*   lhs is A							      */
1990 /*   rhs is B							      */
1991 /*   set is the context						      */
1992 /*								      */
1993 /* C must have space for set->digits digits.			      */
1994 /*								      */
1995 /* Mathematical function restrictions apply (see above); a NaN is     */
1996 /* returned with Invalid_operation if a restriction is violated.      */
1997 /*								      */
1998 /* However, if 1999999997<=B<=999999999 and B is an integer then the  */
1999 /* restrictions on A and the context are relaxed to the usual bounds, */
2000 /* for compatibility with the earlier (integer power only) version    */
2001 /* of this function.						      */
2002 /*								      */
2003 /* When B is an integer, the result may be exact, even if rounded.    */
2004 /*								      */
2005 /* The final result is rounded according to the context; it will      */
2006 /* almost always be correctly rounded, but may be up to 1 ulp in      */
2007 /* error in rare cases.						      */
2008 /* ------------------------------------------------------------------ */
2009 decNumber * decNumberPower(decNumber *res, const decNumber *lhs,
2010 			   const decNumber *rhs, decContext *set) {
2011   #if DECSUBSET
2012   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
2013   decNumber *allocrhs=NULL;	   /* .., rhs */
2014   #endif
2015   decNumber *allocdac=NULL;	   /* -> allocated acc buffer, iff used */
2016   decNumber *allocinv=NULL;	   /* -> allocated 1/x buffer, iff used */
2017   Int	reqdigits=set->digits;	   /* requested DIGITS */
2018   Int	n;			   /* rhs in binary */
2019   Flag	rhsint=0;		   /* 1 if rhs is an integer */
2020   Flag	useint=0;		   /* 1 if can use integer calculation */
2021   Flag	isoddint=0;		   /* 1 if rhs is an integer and odd */
2022   Int	i;			   /* work */
2023   #if DECSUBSET
2024   Int	dropped;		   /* .. */
2025   #endif
2026   uInt	needbytes;		   /* buffer size needed */
2027   Flag	seenbit;		   /* seen a bit while powering */
2028   Int	residue=0;		   /* rounding residue */
2029   uInt	status=0;		   /* accumulators */
2030   uByte bits=0;			   /* result sign if errors */
2031   decContext aset;		   /* working context */
2032   decNumber dnOne;		   /* work value 1... */
2033   /* local accumulator buffer [a decNumber, with digits+elength+1 digits] */
2034   decNumber dacbuff[D2N(DECBUFFER+9)];
2035   decNumber *dac=dacbuff;	   /* -> result accumulator */
2036   /* same again for possible 1/lhs calculation */
2037   decNumber invbuff[D2N(DECBUFFER+9)];
2038 
2039   #if DECCHECK
2040   if (decCheckOperands(res, lhs, rhs, set)) return res;
2041   #endif
2042 
2043   do {				   /* protect allocated storage */
2044     #if DECSUBSET
2045     if (!set->extended) { /* reduce operands and set status, as needed */
2046       if (lhs->digits>reqdigits) {
2047 	alloclhs=decRoundOperand(lhs, set, &status);
2048 	if (alloclhs==NULL) break;
2049 	lhs=alloclhs;
2050 	}
2051       if (rhs->digits>reqdigits) {
2052 	allocrhs=decRoundOperand(rhs, set, &status);
2053 	if (allocrhs==NULL) break;
2054 	rhs=allocrhs;
2055 	}
2056       }
2057     #endif
2058     /* [following code does not require input rounding] */
2059 
2060     /* handle NaNs and rhs Infinity (lhs infinity is harder) */
2061     if (SPECIALARGS) {
2062       if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs)) { /* NaNs */
2063 	decNaNs(res, lhs, rhs, set, &status);
2064 	break;}
2065       if (decNumberIsInfinite(rhs)) {	/* rhs Infinity */
2066 	Flag rhsneg=rhs->bits&DECNEG;	/* save rhs sign */
2067 	if (decNumberIsNegative(lhs)	/* lhs<0 */
2068 	 && !decNumberIsZero(lhs))	/* .. */
2069 	  status|=DEC_Invalid_operation;
2070 	 else {				/* lhs >=0 */
2071 	  decNumberZero(&dnOne);	/* set up 1 */
2072 	  dnOne.lsu[0]=1;
2073 	  decNumberCompare(dac, lhs, &dnOne, set); /* lhs ? 1 */
2074 	  decNumberZero(res);		/* prepare for 0/1/Infinity */
2075 	  if (decNumberIsNegative(dac)) {    /* lhs<1 */
2076 	    if (rhsneg) res->bits|=DECINF;   /* +Infinity [else is +0] */
2077 	    }
2078 	   else if (dac->lsu[0]==0) {	     /* lhs=1 */
2079 	    /* 1**Infinity is inexact, so return fully-padded 1.0000 */
2080 	    Int shift=set->digits-1;
2081 	    *res->lsu=1;		     /* was 0, make int 1 */
2082 	    res->digits=decShiftToMost(res->lsu, 1, shift);
2083 	    res->exponent=-shift;	     /* make 1.0000... */
2084 	    status|=DEC_Inexact|DEC_Rounded; /* deemed inexact */
2085 	    }
2086 	   else {			     /* lhs>1 */
2087 	    if (!rhsneg) res->bits|=DECINF;  /* +Infinity [else is +0] */
2088 	    }
2089 	  } /* lhs>=0 */
2090 	break;}
2091       /* [lhs infinity drops through] */
2092       } /* specials */
2093 
2094     /* Original rhs may be an integer that fits and is in range */
2095     n=decGetInt(rhs);
2096     if (n!=BADINT) {			/* it is an integer */
2097       rhsint=1;				/* record the fact for 1**n */
2098       isoddint=(Flag)n&1;		/* [works even if big] */
2099       if (n!=BIGEVEN && n!=BIGODD)	/* can use integer path? */
2100 	useint=1;			/* looks good */
2101       }
2102 
2103     if (decNumberIsNegative(lhs)	/* -x .. */
2104       && isoddint) bits=DECNEG;		/* .. to an odd power */
2105 
2106     /* handle LHS infinity */
2107     if (decNumberIsInfinite(lhs)) {	/* [NaNs already handled] */
2108       uByte rbits=rhs->bits;		/* save */
2109       decNumberZero(res);		/* prepare */
2110       if (n==0) *res->lsu=1;		/* [-]Inf**0 => 1 */
2111        else {
2112 	/* -Inf**nonint -> error */
2113 	if (!rhsint && decNumberIsNegative(lhs)) {
2114 	  status|=DEC_Invalid_operation;     /* -Inf**nonint is error */
2115 	  break;}
2116 	if (!(rbits & DECNEG)) bits|=DECINF; /* was not a **-n */
2117 	/* [otherwise will be 0 or -0] */
2118 	res->bits=bits;
2119 	}
2120       break;}
2121 
2122     /* similarly handle LHS zero */
2123     if (decNumberIsZero(lhs)) {
2124       if (n==0) {			     /* 0**0 => Error */
2125 	#if DECSUBSET
2126 	if (!set->extended) {		     /* [unless subset] */
2127 	  decNumberZero(res);
2128 	  *res->lsu=1;			     /* return 1 */
2129 	  break;}
2130 	#endif
2131 	status|=DEC_Invalid_operation;
2132 	}
2133        else {				     /* 0**x */
2134 	uByte rbits=rhs->bits;		     /* save */
2135 	if (rbits & DECNEG) {		     /* was a 0**(-n) */
2136 	  #if DECSUBSET
2137 	  if (!set->extended) {		     /* [bad if subset] */
2138 	    status|=DEC_Invalid_operation;
2139 	    break;}
2140 	  #endif
2141 	  bits|=DECINF;
2142 	  }
2143 	decNumberZero(res);		     /* prepare */
2144 	/* [otherwise will be 0 or -0] */
2145 	res->bits=bits;
2146 	}
2147       break;}
2148 
2149     /* here both lhs and rhs are finite; rhs==0 is handled in the */
2150     /* integer path.  Next handle the non-integer cases */
2151     if (!useint) {			/* non-integral rhs */
2152       /* any -ve lhs is bad, as is either operand or context out of */
2153       /* bounds */
2154       if (decNumberIsNegative(lhs)) {
2155 	status|=DEC_Invalid_operation;
2156 	break;}
2157       if (decCheckMath(lhs, set, &status)
2158        || decCheckMath(rhs, set, &status)) break; /* variable status */
2159 
2160       decContextDefault(&aset, DEC_INIT_DECIMAL64); /* clean context */
2161       aset.emax=DEC_MAX_MATH;		/* usual bounds */
2162       aset.emin=-DEC_MAX_MATH;		/* .. */
2163       aset.clamp=0;			/* and no concrete format */
2164 
2165       /* calculate the result using exp(ln(lhs)*rhs), which can */
2166       /* all be done into the accumulator, dac.	 The precision needed */
2167       /* is enough to contain the full information in the lhs (which */
2168       /* is the total digits, including exponent), or the requested */
2169       /* precision, if larger, + 4; 6 is used for the exponent */
2170       /* maximum length, and this is also used when it is shorter */
2171       /* than the requested digits as it greatly reduces the >0.5 ulp */
2172       /* cases at little cost (because Ln doubles digits each */
2173       /* iteration so a few extra digits rarely causes an extra */
2174       /* iteration) */
2175       aset.digits=MAXI(lhs->digits, set->digits)+6+4;
2176       } /* non-integer rhs */
2177 
2178      else { /* rhs is in-range integer */
2179       if (n==0) {			/* x**0 = 1 */
2180 	/* (0**0 was handled above) */
2181 	decNumberZero(res);		/* result=1 */
2182 	*res->lsu=1;			/* .. */
2183 	break;}
2184       /* rhs is a non-zero integer */
2185       if (n<0) n=-n;			/* use abs(n) */
2186 
2187       aset=*set;			/* clone the context */
2188       aset.round=DEC_ROUND_HALF_EVEN;	/* internally use balanced */
2189       /* calculate the working DIGITS */
2190       aset.digits=reqdigits+(rhs->digits+rhs->exponent)+2;
2191       #if DECSUBSET
2192       if (!set->extended) aset.digits--;     /* use classic precision */
2193       #endif
2194       /* it's an error if this is more than can be handled */
2195       if (aset.digits>DECNUMMAXP) {status|=DEC_Invalid_operation; break;}
2196       } /* integer path */
2197 
2198     /* aset.digits is the count of digits for the accumulator needed */
2199     /* if accumulator is too long for local storage, then allocate */
2200     needbytes=sizeof(decNumber)+(D2U(aset.digits)-1)*sizeof(Unit);
2201     /* [needbytes also used below if 1/lhs needed] */
2202     if (needbytes>sizeof(dacbuff)) {
2203       allocdac=(decNumber *)malloc(needbytes);
2204       if (allocdac==NULL) {   /* hopeless -- abandon */
2205 	status|=DEC_Insufficient_storage;
2206 	break;}
2207       dac=allocdac;	      /* use the allocated space */
2208       }
2209     /* here, aset is set up and accumulator is ready for use */
2210 
2211     if (!useint) {			     /* non-integral rhs */
2212       /* x ** y; special-case x=1 here as it will otherwise always */
2213       /* reduce to integer 1; decLnOp has a fastpath which detects */
2214       /* the case of x=1 */
2215       decLnOp(dac, lhs, &aset, &status);     /* dac=ln(lhs) */
2216       /* [no error possible, as lhs 0 already handled] */
2217       if (ISZERO(dac)) {		     /* x==1, 1.0, etc. */
2218 	/* need to return fully-padded 1.0000 etc., but rhsint->1 */
2219 	*dac->lsu=1;			     /* was 0, make int 1 */
2220 	if (!rhsint) {			     /* add padding */
2221 	  Int shift=set->digits-1;
2222 	  dac->digits=decShiftToMost(dac->lsu, 1, shift);
2223 	  dac->exponent=-shift;		     /* make 1.0000... */
2224 	  status|=DEC_Inexact|DEC_Rounded;   /* deemed inexact */
2225 	  }
2226 	}
2227        else {
2228 	decMultiplyOp(dac, dac, rhs, &aset, &status);  /* dac=dac*rhs */
2229 	decExpOp(dac, dac, &aset, &status);	       /* dac=exp(dac) */
2230 	}
2231       /* and drop through for final rounding */
2232       } /* non-integer rhs */
2233 
2234      else {				/* carry on with integer */
2235       decNumberZero(dac);		/* acc=1 */
2236       *dac->lsu=1;			/* .. */
2237 
2238       /* if a negative power the constant 1 is needed, and if not subset */
2239       /* invert the lhs now rather than inverting the result later */
2240       if (decNumberIsNegative(rhs)) {	/* was a **-n [hence digits>0] */
2241 	decNumber *inv=invbuff;		/* asssume use fixed buffer */
2242 	decNumberCopy(&dnOne, dac);	/* dnOne=1;  [needed now or later] */
2243 	#if DECSUBSET
2244 	if (set->extended) {		/* need to calculate 1/lhs */
2245 	#endif
2246 	  /* divide lhs into 1, putting result in dac [dac=1/dac] */
2247 	  decDivideOp(dac, &dnOne, lhs, &aset, DIVIDE, &status);
2248 	  /* now locate or allocate space for the inverted lhs */
2249 	  if (needbytes>sizeof(invbuff)) {
2250 	    allocinv=(decNumber *)malloc(needbytes);
2251 	    if (allocinv==NULL) {	/* hopeless -- abandon */
2252 	      status|=DEC_Insufficient_storage;
2253 	      break;}
2254 	    inv=allocinv;		/* use the allocated space */
2255 	    }
2256 	  /* [inv now points to big-enough buffer or allocated storage] */
2257 	  decNumberCopy(inv, dac);	/* copy the 1/lhs */
2258 	  decNumberCopy(dac, &dnOne);	/* restore acc=1 */
2259 	  lhs=inv;			/* .. and go forward with new lhs */
2260 	#if DECSUBSET
2261 	  }
2262 	#endif
2263 	}
2264 
2265       /* Raise-to-the-power loop... */
2266       seenbit=0;		   /* set once a 1-bit is encountered */
2267       for (i=1;;i++){		   /* for each bit [top bit ignored] */
2268 	/* abandon if had overflow or terminal underflow */
2269 	if (status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
2270 	  if (status&DEC_Overflow || ISZERO(dac)) break;
2271 	  }
2272 	/* [the following two lines revealed an optimizer bug in a C++ */
2273 	/* compiler, with symptom: 5**3 -> 25, when n=n+n was used] */
2274 	n=n<<1;			   /* move next bit to testable position */
2275 	if (n<0) {		   /* top bit is set */
2276 	  seenbit=1;		   /* OK, significant bit seen */
2277 	  decMultiplyOp(dac, dac, lhs, &aset, &status); /* dac=dac*x */
2278 	  }
2279 	if (i==31) break;	   /* that was the last bit */
2280 	if (!seenbit) continue;	   /* no need to square 1 */
2281 	decMultiplyOp(dac, dac, dac, &aset, &status); /* dac=dac*dac [square] */
2282 	} /*i*/ /* 32 bits */
2283 
2284       /* complete internal overflow or underflow processing */
2285       if (status & (DEC_Overflow|DEC_Underflow)) {
2286 	#if DECSUBSET
2287 	/* If subset, and power was negative, reverse the kind of -erflow */
2288 	/* [1/x not yet done] */
2289 	if (!set->extended && decNumberIsNegative(rhs)) {
2290 	  if (status & DEC_Overflow)
2291 	    status^=DEC_Overflow | DEC_Underflow | DEC_Subnormal;
2292 	   else { /* trickier -- Underflow may or may not be set */
2293 	    status&=~(DEC_Underflow | DEC_Subnormal); /* [one or both] */
2294 	    status|=DEC_Overflow;
2295 	    }
2296 	  }
2297 	#endif
2298 	dac->bits=(dac->bits & ~DECNEG) | bits; /* force correct sign */
2299 	/* round subnormals [to set.digits rather than aset.digits] */
2300 	/* or set overflow result similarly as required */
2301 	decFinalize(dac, set, &residue, &status);
2302 	decNumberCopy(res, dac);   /* copy to result (is now OK length) */
2303 	break;
2304 	}
2305 
2306       #if DECSUBSET
2307       if (!set->extended &&		     /* subset math */
2308 	  decNumberIsNegative(rhs)) {	     /* was a **-n [hence digits>0] */
2309 	/* so divide result into 1 [dac=1/dac] */
2310 	decDivideOp(dac, &dnOne, dac, &aset, DIVIDE, &status);
2311 	}
2312       #endif
2313       } /* rhs integer path */
2314 
2315     /* reduce result to the requested length and copy to result */
2316     decCopyFit(res, dac, set, &residue, &status);
2317     decFinish(res, set, &residue, &status);  /* final cleanup */
2318     #if DECSUBSET
2319     if (!set->extended) decTrim(res, set, 0, &dropped); /* trailing zeros */
2320     #endif
2321     } while(0);				/* end protected */
2322 
2323   if (allocdac!=NULL) free(allocdac);	/* drop any storage used */
2324   if (allocinv!=NULL) free(allocinv);	/* .. */
2325   #if DECSUBSET
2326   if (alloclhs!=NULL) free(alloclhs);	/* .. */
2327   if (allocrhs!=NULL) free(allocrhs);	/* .. */
2328   #endif
2329   if (status!=0) decStatus(res, status, set);
2330   #if DECCHECK
2331   decCheckInexact(res, set);
2332   #endif
2333   return res;
2334   } /* decNumberPower */
2335 
2336 /* ------------------------------------------------------------------ */
2337 /* decNumberQuantize -- force exponent to requested value	      */
2338 /*								      */
2339 /*   This computes C = op(A, B), where op adjusts the coefficient     */
2340 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
2341 /*   of C has exponent of B.  The numerical value of C will equal A,  */
2342 /*   except for the effects of any rounding that occurred.	      */
2343 /*								      */
2344 /*   res is C, the result.  C may be A or B			      */
2345 /*   lhs is A, the number to adjust				      */
2346 /*   rhs is B, the number with exponent to match		      */
2347 /*   set is the context						      */
2348 /*								      */
2349 /* C must have space for set->digits digits.			      */
2350 /*								      */
2351 /* Unless there is an error or the result is infinite, the exponent   */
2352 /* after the operation is guaranteed to be equal to that of B.	      */
2353 /* ------------------------------------------------------------------ */
2354 decNumber * decNumberQuantize(decNumber *res, const decNumber *lhs,
2355 			      const decNumber *rhs, decContext *set) {
2356   uInt status=0;			/* accumulator */
2357   decQuantizeOp(res, lhs, rhs, set, 1, &status);
2358   if (status!=0) decStatus(res, status, set);
2359   return res;
2360   } /* decNumberQuantize */
2361 
2362 /* ------------------------------------------------------------------ */
2363 /* decNumberReduce -- remove trailing zeros			      */
2364 /*								      */
2365 /*   This computes C = 0 + A, and normalizes the result		      */
2366 /*								      */
2367 /*   res is C, the result.  C may be A				      */
2368 /*   rhs is A							      */
2369 /*   set is the context						      */
2370 /*								      */
2371 /* C must have space for set->digits digits.			      */
2372 /* ------------------------------------------------------------------ */
2373 /* Previously known as Normalize */
2374 decNumber * decNumberNormalize(decNumber *res, const decNumber *rhs,
2375 			       decContext *set) {
2376   return decNumberReduce(res, rhs, set);
2377   } /* decNumberNormalize */
2378 
2379 decNumber * decNumberReduce(decNumber *res, const decNumber *rhs,
2380 			    decContext *set) {
2381   #if DECSUBSET
2382   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
2383   #endif
2384   uInt status=0;		   /* as usual */
2385   Int  residue=0;		   /* as usual */
2386   Int  dropped;			   /* work */
2387 
2388   #if DECCHECK
2389   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2390   #endif
2391 
2392   do {				   /* protect allocated storage */
2393     #if DECSUBSET
2394     if (!set->extended) {
2395       /* reduce operand and set lostDigits status, as needed */
2396       if (rhs->digits>set->digits) {
2397 	allocrhs=decRoundOperand(rhs, set, &status);
2398 	if (allocrhs==NULL) break;
2399 	rhs=allocrhs;
2400 	}
2401       }
2402     #endif
2403     /* [following code does not require input rounding] */
2404 
2405     /* Infinities copy through; NaNs need usual treatment */
2406     if (decNumberIsNaN(rhs)) {
2407       decNaNs(res, rhs, NULL, set, &status);
2408       break;
2409       }
2410 
2411     /* reduce result to the requested length and copy to result */
2412     decCopyFit(res, rhs, set, &residue, &status); /* copy & round */
2413     decFinish(res, set, &residue, &status);	  /* cleanup/set flags */
2414     decTrim(res, set, 1, &dropped);		  /* normalize in place */
2415     } while(0);				     /* end protected */
2416 
2417   #if DECSUBSET
2418   if (allocrhs !=NULL) free(allocrhs);	     /* .. */
2419   #endif
2420   if (status!=0) decStatus(res, status, set);/* then report status */
2421   return res;
2422   } /* decNumberReduce */
2423 
2424 /* ------------------------------------------------------------------ */
2425 /* decNumberRescale -- force exponent to requested value	      */
2426 /*								      */
2427 /*   This computes C = op(A, B), where op adjusts the coefficient     */
2428 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
2429 /*   of C has the value B.  The numerical value of C will equal A,    */
2430 /*   except for the effects of any rounding that occurred.	      */
2431 /*								      */
2432 /*   res is C, the result.  C may be A or B			      */
2433 /*   lhs is A, the number to adjust				      */
2434 /*   rhs is B, the requested exponent				      */
2435 /*   set is the context						      */
2436 /*								      */
2437 /* C must have space for set->digits digits.			      */
2438 /*								      */
2439 /* Unless there is an error or the result is infinite, the exponent   */
2440 /* after the operation is guaranteed to be equal to B.		      */
2441 /* ------------------------------------------------------------------ */
2442 decNumber * decNumberRescale(decNumber *res, const decNumber *lhs,
2443 			     const decNumber *rhs, decContext *set) {
2444   uInt status=0;			/* accumulator */
2445   decQuantizeOp(res, lhs, rhs, set, 0, &status);
2446   if (status!=0) decStatus(res, status, set);
2447   return res;
2448   } /* decNumberRescale */
2449 
2450 /* ------------------------------------------------------------------ */
2451 /* decNumberRemainder -- divide and return remainder		      */
2452 /*								      */
2453 /*   This computes C = A % B					      */
2454 /*								      */
2455 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
2456 /*   lhs is A							      */
2457 /*   rhs is B							      */
2458 /*   set is the context						      */
2459 /*								      */
2460 /* C must have space for set->digits digits.			      */
2461 /* ------------------------------------------------------------------ */
2462 decNumber * decNumberRemainder(decNumber *res, const decNumber *lhs,
2463 			       const decNumber *rhs, decContext *set) {
2464   uInt status=0;			/* accumulator */
2465   decDivideOp(res, lhs, rhs, set, REMAINDER, &status);
2466   if (status!=0) decStatus(res, status, set);
2467   #if DECCHECK
2468   decCheckInexact(res, set);
2469   #endif
2470   return res;
2471   } /* decNumberRemainder */
2472 
2473 /* ------------------------------------------------------------------ */
2474 /* decNumberRemainderNear -- divide and return remainder from nearest */
2475 /*								      */
2476 /*   This computes C = A % B, where % is the IEEE remainder operator  */
2477 /*								      */
2478 /*   res is C, the result.  C may be A and/or B (e.g., X=X%X)	      */
2479 /*   lhs is A							      */
2480 /*   rhs is B							      */
2481 /*   set is the context						      */
2482 /*								      */
2483 /* C must have space for set->digits digits.			      */
2484 /* ------------------------------------------------------------------ */
2485 decNumber * decNumberRemainderNear(decNumber *res, const decNumber *lhs,
2486 				   const decNumber *rhs, decContext *set) {
2487   uInt status=0;			/* accumulator */
2488   decDivideOp(res, lhs, rhs, set, REMNEAR, &status);
2489   if (status!=0) decStatus(res, status, set);
2490   #if DECCHECK
2491   decCheckInexact(res, set);
2492   #endif
2493   return res;
2494   } /* decNumberRemainderNear */
2495 
2496 /* ------------------------------------------------------------------ */
2497 /* decNumberRotate -- rotate the coefficient of a Number left/right   */
2498 /*								      */
2499 /*   This computes C = A rot B	(in base ten and rotating set->digits */
2500 /*   digits).							      */
2501 /*								      */
2502 /*   res is C, the result.  C may be A and/or B (e.g., X=XrotX)	      */
2503 /*   lhs is A							      */
2504 /*   rhs is B, the number of digits to rotate (-ve to right)	      */
2505 /*   set is the context						      */
2506 /*								      */
2507 /* The digits of the coefficient of A are rotated to the left (if B   */
2508 /* is positive) or to the right (if B is negative) without adjusting  */
2509 /* the exponent or the sign of A.  If lhs->digits is less than	      */
2510 /* set->digits the coefficient is padded with zeros on the left	      */
2511 /* before the rotate.  Any leading zeros in the result are removed    */
2512 /* as usual.							      */
2513 /*								      */
2514 /* B must be an integer (q=0) and in the range -set->digits through   */
2515 /* +set->digits.						      */
2516 /* C must have space for set->digits digits.			      */
2517 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
2518 /* B must be valid).  No status is set unless B is invalid or an      */
2519 /* operand is an sNaN.						      */
2520 /* ------------------------------------------------------------------ */
2521 decNumber * decNumberRotate(decNumber *res, const decNumber *lhs,
2522 			   const decNumber *rhs, decContext *set) {
2523   uInt status=0;	      /* accumulator */
2524   Int  rotate;		      /* rhs as an Int */
2525 
2526   #if DECCHECK
2527   if (decCheckOperands(res, lhs, rhs, set)) return res;
2528   #endif
2529 
2530   /* NaNs propagate as normal */
2531   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2532     decNaNs(res, lhs, rhs, set, &status);
2533    /* rhs must be an integer */
2534    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2535     status=DEC_Invalid_operation;
2536    else { /* both numeric, rhs is an integer */
2537     rotate=decGetInt(rhs);		     /* [cannot fail] */
2538     if (rotate==BADINT			     /* something bad .. */
2539      || rotate==BIGODD || rotate==BIGEVEN    /* .. very big .. */
2540      || abs(rotate)>set->digits)	     /* .. or out of range */
2541       status=DEC_Invalid_operation;
2542      else {				     /* rhs is OK */
2543       decNumberCopy(res, lhs);
2544       /* convert -ve rotate to equivalent positive rotation */
2545       if (rotate<0) rotate=set->digits+rotate;
2546       if (rotate!=0 && rotate!=set->digits   /* zero or full rotation */
2547        && !decNumberIsInfinite(res)) {	     /* lhs was infinite */
2548 	/* left-rotate to do; 0 < rotate < set->digits */
2549 	uInt units, shift;		     /* work */
2550 	uInt msudigits;			     /* digits in result msu */
2551 	Unit *msu=res->lsu+D2U(res->digits)-1;	  /* current msu */
2552 	Unit *msumax=res->lsu+D2U(set->digits)-1; /* rotation msu */
2553 	for (msu++; msu<=msumax; msu++) *msu=0;	  /* ensure high units=0 */
2554 	res->digits=set->digits;		  /* now full-length */
2555 	msudigits=MSUDIGITS(res->digits);	  /* actual digits in msu */
2556 
2557 	/* rotation here is done in-place, in three steps */
2558 	/* 1. shift all to least up to one unit to unit-align final */
2559 	/*    lsd [any digits shifted out are rotated to the left, */
2560 	/*    abutted to the original msd (which may require split)] */
2561 	/* */
2562 	/*    [if there are no whole units left to rotate, the */
2563 	/*    rotation is now complete] */
2564 	/* */
2565 	/* 2. shift to least, from below the split point only, so that */
2566 	/*    the final msd is in the right place in its Unit [any */
2567 	/*    digits shifted out will fit exactly in the current msu, */
2568 	/*    left aligned, no split required] */
2569 	/* */
2570 	/* 3. rotate all the units by reversing left part, right */
2571 	/*    part, and then whole */
2572 	/* */
2573 	/* example: rotate right 8 digits (2 units + 2), DECDPUN=3. */
2574 	/* */
2575 	/*   start: 00a bcd efg hij klm npq */
2576 	/* */
2577 	/*	1a  000 0ab cde fgh|ijk lmn [pq saved] */
2578 	/*	1b  00p qab cde fgh|ijk lmn */
2579 	/* */
2580 	/*	2a  00p qab cde fgh|00i jkl [mn saved] */
2581 	/*	2b  mnp qab cde fgh|00i jkl */
2582 	/* */
2583 	/*	3a  fgh cde qab mnp|00i jkl */
2584 	/*	3b  fgh cde qab mnp|jkl 00i */
2585 	/*	3c  00i jkl mnp qab cde fgh */
2586 
2587 	/* Step 1: amount to shift is the partial right-rotate count */
2588 	rotate=set->digits-rotate;	/* make it right-rotate */
2589 	units=rotate/DECDPUN;		/* whole units to rotate */
2590 	shift=rotate%DECDPUN;		/* left-over digits count */
2591 	if (shift>0) {			/* not an exact number of units */
2592 	  uInt save=res->lsu[0]%powers[shift];	  /* save low digit(s) */
2593 	  decShiftToLeast(res->lsu, D2U(res->digits), shift);
2594 	  if (shift>msudigits) {	/* msumax-1 needs >0 digits */
2595 	    uInt rem=save%powers[shift-msudigits];/* split save */
2596 	    *msumax=(Unit)(save/powers[shift-msudigits]); /* and insert */
2597 	    *(msumax-1)=*(msumax-1)
2598 		       +(Unit)(rem*powers[DECDPUN-(shift-msudigits)]); /* .. */
2599 	    }
2600 	   else { /* all fits in msumax */
2601 	    *msumax=*msumax+(Unit)(save*powers[msudigits-shift]); /* [maybe *1] */
2602 	    }
2603 	  } /* digits shift needed */
2604 
2605 	/* If whole units to rotate... */
2606 	if (units>0) {			/* some to do */
2607 	  /* Step 2: the units to touch are the whole ones in rotate, */
2608 	  /*   if any, and the shift is DECDPUN-msudigits (which may be */
2609 	  /*   0, again) */
2610 	  shift=DECDPUN-msudigits;
2611 	  if (shift>0) {		/* not an exact number of units */
2612 	    uInt save=res->lsu[0]%powers[shift];  /* save low digit(s) */
2613 	    decShiftToLeast(res->lsu, units, shift);
2614 	    *msumax=*msumax+(Unit)(save*powers[msudigits]);
2615 	    } /* partial shift needed */
2616 
2617 	  /* Step 3: rotate the units array using triple reverse */
2618 	  /* (reversing is easy and fast) */
2619 	  decReverse(res->lsu+units, msumax);	  /* left part */
2620 	  decReverse(res->lsu, res->lsu+units-1); /* right part */
2621 	  decReverse(res->lsu, msumax);		  /* whole */
2622 	  } /* whole units to rotate */
2623 	/* the rotation may have left an undetermined number of zeros */
2624 	/* on the left, so true length needs to be calculated */
2625 	res->digits=decGetDigits(res->lsu, msumax-res->lsu+1);
2626 	} /* rotate needed */
2627       } /* rhs OK */
2628     } /* numerics */
2629   if (status!=0) decStatus(res, status, set);
2630   return res;
2631   } /* decNumberRotate */
2632 
2633 /* ------------------------------------------------------------------ */
2634 /* decNumberSameQuantum -- test for equal exponents		      */
2635 /*								      */
2636 /*   res is the result number, which will contain either 0 or 1	      */
2637 /*   lhs is a number to test					      */
2638 /*   rhs is the second (usually a pattern)			      */
2639 /*								      */
2640 /* No errors are possible and no context is needed.		      */
2641 /* ------------------------------------------------------------------ */
2642 decNumber * decNumberSameQuantum(decNumber *res, const decNumber *lhs,
2643 				 const decNumber *rhs) {
2644   Unit ret=0;			   /* return value */
2645 
2646   #if DECCHECK
2647   if (decCheckOperands(res, lhs, rhs, DECUNCONT)) return res;
2648   #endif
2649 
2650   if (SPECIALARGS) {
2651     if (decNumberIsNaN(lhs) && decNumberIsNaN(rhs)) ret=1;
2652      else if (decNumberIsInfinite(lhs) && decNumberIsInfinite(rhs)) ret=1;
2653      /* [anything else with a special gives 0] */
2654     }
2655    else if (lhs->exponent==rhs->exponent) ret=1;
2656 
2657   decNumberZero(res);		   /* OK to overwrite an operand now */
2658   *res->lsu=ret;
2659   return res;
2660   } /* decNumberSameQuantum */
2661 
2662 /* ------------------------------------------------------------------ */
2663 /* decNumberScaleB -- multiply by a power of 10			      */
2664 /*								      */
2665 /* This computes C = A x 10**B where B is an integer (q=0) with	      */
2666 /* maximum magnitude 2*(emax+digits)				      */
2667 /*								      */
2668 /*   res is C, the result.  C may be A or B			      */
2669 /*   lhs is A, the number to adjust				      */
2670 /*   rhs is B, the requested power of ten to use		      */
2671 /*   set is the context						      */
2672 /*								      */
2673 /* C must have space for set->digits digits.			      */
2674 /*								      */
2675 /* The result may underflow or overflow.			      */
2676 /* ------------------------------------------------------------------ */
2677 decNumber * decNumberScaleB(decNumber *res, const decNumber *lhs,
2678 			    const decNumber *rhs, decContext *set) {
2679   Int  reqexp;		      /* requested exponent change [B] */
2680   uInt status=0;	      /* accumulator */
2681   Int  residue;		      /* work */
2682 
2683   #if DECCHECK
2684   if (decCheckOperands(res, lhs, rhs, set)) return res;
2685   #endif
2686 
2687   /* Handle special values except lhs infinite */
2688   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2689     decNaNs(res, lhs, rhs, set, &status);
2690     /* rhs must be an integer */
2691    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2692     status=DEC_Invalid_operation;
2693    else {
2694     /* lhs is a number; rhs is a finite with q==0 */
2695     reqexp=decGetInt(rhs);		     /* [cannot fail] */
2696     if (reqexp==BADINT			     /* something bad .. */
2697      || reqexp==BIGODD || reqexp==BIGEVEN    /* .. very big .. */
2698      || abs(reqexp)>(2*(set->digits+set->emax))) /* .. or out of range */
2699       status=DEC_Invalid_operation;
2700      else {				     /* rhs is OK */
2701       decNumberCopy(res, lhs);		     /* all done if infinite lhs */
2702       if (!decNumberIsInfinite(res)) {	     /* prepare to scale */
2703 	res->exponent+=reqexp;		     /* adjust the exponent */
2704 	residue=0;
2705 	decFinalize(res, set, &residue, &status); /* .. and check */
2706 	} /* finite LHS */
2707       } /* rhs OK */
2708     } /* rhs finite */
2709   if (status!=0) decStatus(res, status, set);
2710   return res;
2711   } /* decNumberScaleB */
2712 
2713 /* ------------------------------------------------------------------ */
2714 /* decNumberShift -- shift the coefficient of a Number left or right  */
2715 /*								      */
2716 /*   This computes C = A << B or C = A >> -B  (in base ten).	      */
2717 /*								      */
2718 /*   res is C, the result.  C may be A and/or B (e.g., X=X<<X)	      */
2719 /*   lhs is A							      */
2720 /*   rhs is B, the number of digits to shift (-ve to right)	      */
2721 /*   set is the context						      */
2722 /*								      */
2723 /* The digits of the coefficient of A are shifted to the left (if B   */
2724 /* is positive) or to the right (if B is negative) without adjusting  */
2725 /* the exponent or the sign of A.				      */
2726 /*								      */
2727 /* B must be an integer (q=0) and in the range -set->digits through   */
2728 /* +set->digits.						      */
2729 /* C must have space for set->digits digits.			      */
2730 /* NaNs are propagated as usual.  Infinities are unaffected (but      */
2731 /* B must be valid).  No status is set unless B is invalid or an      */
2732 /* operand is an sNaN.						      */
2733 /* ------------------------------------------------------------------ */
2734 decNumber * decNumberShift(decNumber *res, const decNumber *lhs,
2735 			   const decNumber *rhs, decContext *set) {
2736   uInt status=0;	      /* accumulator */
2737   Int  shift;		      /* rhs as an Int */
2738 
2739   #if DECCHECK
2740   if (decCheckOperands(res, lhs, rhs, set)) return res;
2741   #endif
2742 
2743   /* NaNs propagate as normal */
2744   if (decNumberIsNaN(lhs) || decNumberIsNaN(rhs))
2745     decNaNs(res, lhs, rhs, set, &status);
2746    /* rhs must be an integer */
2747    else if (decNumberIsInfinite(rhs) || rhs->exponent!=0)
2748     status=DEC_Invalid_operation;
2749    else { /* both numeric, rhs is an integer */
2750     shift=decGetInt(rhs);		     /* [cannot fail] */
2751     if (shift==BADINT			     /* something bad .. */
2752      || shift==BIGODD || shift==BIGEVEN	     /* .. very big .. */
2753      || abs(shift)>set->digits)		     /* .. or out of range */
2754       status=DEC_Invalid_operation;
2755      else {				     /* rhs is OK */
2756       decNumberCopy(res, lhs);
2757       if (shift!=0 && !decNumberIsInfinite(res)) { /* something to do */
2758 	if (shift>0) {			     /* to left */
2759 	  if (shift==set->digits) {	     /* removing all */
2760 	    *res->lsu=0;		     /* so place 0 */
2761 	    res->digits=1;		     /* .. */
2762 	    }
2763 	   else {			     /* */
2764 	    /* first remove leading digits if necessary */
2765 	    if (res->digits+shift>set->digits) {
2766 	      decDecap(res, res->digits+shift-set->digits);
2767 	      /* that updated res->digits; may have gone to 1 (for a */
2768 	      /* single digit or for zero */
2769 	      }
2770 	    if (res->digits>1 || *res->lsu)  /* if non-zero.. */
2771 	      res->digits=decShiftToMost(res->lsu, res->digits, shift);
2772 	    } /* partial left */
2773 	  } /* left */
2774 	 else { /* to right */
2775 	  if (-shift>=res->digits) {	     /* discarding all */
2776 	    *res->lsu=0;		     /* so place 0 */
2777 	    res->digits=1;		     /* .. */
2778 	    }
2779 	   else {
2780 	    decShiftToLeast(res->lsu, D2U(res->digits), -shift);
2781 	    res->digits-=(-shift);
2782 	    }
2783 	  } /* to right */
2784 	} /* non-0 non-Inf shift */
2785       } /* rhs OK */
2786     } /* numerics */
2787   if (status!=0) decStatus(res, status, set);
2788   return res;
2789   } /* decNumberShift */
2790 
2791 /* ------------------------------------------------------------------ */
2792 /* decNumberSquareRoot -- square root operator			      */
2793 /*								      */
2794 /*   This computes C = squareroot(A)				      */
2795 /*								      */
2796 /*   res is C, the result.  C may be A				      */
2797 /*   rhs is A							      */
2798 /*   set is the context; note that rounding mode has no effect	      */
2799 /*								      */
2800 /* C must have space for set->digits digits.			      */
2801 /* ------------------------------------------------------------------ */
2802 /* This uses the following varying-precision algorithm in:	      */
2803 /*								      */
2804 /*   Properly Rounded Variable Precision Square Root, T. E. Hull and  */
2805 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 11 #3, */
2806 /*   pp229-237, ACM, September 1985.				      */
2807 /*								      */
2808 /* The square-root is calculated using Newton's method, after which   */
2809 /* a check is made to ensure the result is correctly rounded.	      */
2810 /*								      */
2811 /* % [Reformatted original Numerical Turing source code follows.]     */
2812 /* function sqrt(x : real) : real				      */
2813 /* % sqrt(x) returns the properly rounded approximation to the square */
2814 /* % root of x, in the precision of the calling environment, or it    */
2815 /* % fails if x < 0.						      */
2816 /* % t e hull and a abrham, august, 1984			      */
2817 /* if x <= 0 then						      */
2818 /*   if x < 0 then						      */
2819 /*     assert false						      */
2820 /*   else							      */
2821 /*     result 0							      */
2822 /*   end if							      */
2823 /* end if							      */
2824 /* var f := setexp(x, 0)  % fraction part of x	 [0.1 <= x < 1]	      */
2825 /* var e := getexp(x)	  % exponent part of x			      */
2826 /* var approx : real						      */
2827 /* if e mod 2 = 0  then						      */
2828 /*   approx := .259 + .819 * f	 % approx to root of f		      */
2829 /* else								      */
2830 /*   f := f/l0			 % adjustments			      */
2831 /*   e := e + 1			 %   for odd			      */
2832 /*   approx := .0819 + 2.59 * f	 %   exponent			      */
2833 /* end if							      */
2834 /*								      */
2835 /* var p:= 3							      */
2836 /* const maxp := currentprecision + 2				      */
2837 /* loop								      */
2838 /*   p := min(2*p - 2, maxp)	 % p = 4,6,10, . . . , maxp	      */
2839 /*   precision p						      */
2840 /*   approx := .5 * (approx + f/approx)				      */
2841 /*   exit when p = maxp						      */
2842 /* end loop							      */
2843 /*								      */
2844 /* % approx is now within 1 ulp of the properly rounded square root   */
2845 /* % of f; to ensure proper rounding, compare squares of (approx -    */
2846 /* % l/2 ulp) and (approx + l/2 ulp) with f.			      */
2847 /* p := currentprecision					      */
2848 /* begin							      */
2849 /*   precision p + 2						      */
2850 /*   const approxsubhalf := approx - setexp(.5, -p)		      */
2851 /*   if mulru(approxsubhalf, approxsubhalf) > f then		      */
2852 /*     approx := approx - setexp(.l, -p + 1)			      */
2853 /*   else							      */
2854 /*     const approxaddhalf := approx + setexp(.5, -p)		      */
2855 /*     if mulrd(approxaddhalf, approxaddhalf) < f then		      */
2856 /*	 approx := approx + setexp(.l, -p + 1)			      */
2857 /*     end if							      */
2858 /*   end if							      */
2859 /* end								      */
2860 /* result setexp(approx, e div 2)  % fix exponent		      */
2861 /* end sqrt							      */
2862 /* ------------------------------------------------------------------ */
2863 decNumber * decNumberSquareRoot(decNumber *res, const decNumber *rhs,
2864 				decContext *set) {
2865   decContext workset, approxset;   /* work contexts */
2866   decNumber dzero;		   /* used for constant zero */
2867   Int  maxp;			   /* largest working precision */
2868   Int  workp;			   /* working precision */
2869   Int  residue=0;		   /* rounding residue */
2870   uInt status=0, ignore=0;	   /* status accumulators */
2871   uInt rstatus;			   /* .. */
2872   Int  exp;			   /* working exponent */
2873   Int  ideal;			   /* ideal (preferred) exponent */
2874   Int  needbytes;		   /* work */
2875   Int  dropped;			   /* .. */
2876 
2877   #if DECSUBSET
2878   decNumber *allocrhs=NULL;	   /* non-NULL if rounded rhs allocated */
2879   #endif
2880   /* buffer for f [needs +1 in case DECBUFFER 0] */
2881   decNumber buff[D2N(DECBUFFER+1)];
2882   /* buffer for a [needs +2 to match likely maxp] */
2883   decNumber bufa[D2N(DECBUFFER+2)];
2884   /* buffer for temporary, b [must be same size as a] */
2885   decNumber bufb[D2N(DECBUFFER+2)];
2886   decNumber *allocbuff=NULL;	   /* -> allocated buff, iff allocated */
2887   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
2888   decNumber *allocbufb=NULL;	   /* -> allocated bufb, iff allocated */
2889   decNumber *f=buff;		   /* reduced fraction */
2890   decNumber *a=bufa;		   /* approximation to result */
2891   decNumber *b=bufb;		   /* intermediate result */
2892   /* buffer for temporary variable, up to 3 digits */
2893   decNumber buft[D2N(3)];
2894   decNumber *t=buft;		   /* up-to-3-digit constant or work */
2895 
2896   #if DECCHECK
2897   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
2898   #endif
2899 
2900   do {				   /* protect allocated storage */
2901     #if DECSUBSET
2902     if (!set->extended) {
2903       /* reduce operand and set lostDigits status, as needed */
2904       if (rhs->digits>set->digits) {
2905 	allocrhs=decRoundOperand(rhs, set, &status);
2906 	if (allocrhs==NULL) break;
2907 	/* [Note: 'f' allocation below could reuse this buffer if */
2908 	/* used, but as this is rare they are kept separate for clarity.] */
2909 	rhs=allocrhs;
2910 	}
2911       }
2912     #endif
2913     /* [following code does not require input rounding] */
2914 
2915     /* handle infinities and NaNs */
2916     if (SPECIALARG) {
2917       if (decNumberIsInfinite(rhs)) {	      /* an infinity */
2918 	if (decNumberIsNegative(rhs)) status|=DEC_Invalid_operation;
2919 	 else decNumberCopy(res, rhs);	      /* +Infinity */
2920 	}
2921        else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
2922       break;
2923       }
2924 
2925     /* calculate the ideal (preferred) exponent [floor(exp/2)] */
2926     /* [We would like to write: ideal=rhs->exponent>>1, but this */
2927     /* generates a compiler warning.  Generated code is the same.] */
2928     ideal=(rhs->exponent&~1)/2;		/* target */
2929 
2930     /* handle zeros */
2931     if (ISZERO(rhs)) {
2932       decNumberCopy(res, rhs);		/* could be 0 or -0 */
2933       res->exponent=ideal;		/* use the ideal [safe] */
2934       /* use decFinish to clamp any out-of-range exponent, etc. */
2935       decFinish(res, set, &residue, &status);
2936       break;
2937       }
2938 
2939     /* any other -x is an oops */
2940     if (decNumberIsNegative(rhs)) {
2941       status|=DEC_Invalid_operation;
2942       break;
2943       }
2944 
2945     /* space is needed for three working variables */
2946     /*	 f -- the same precision as the RHS, reduced to 0.01->0.99... */
2947     /*	 a -- Hull's approximation -- precision, when assigned, is */
2948     /*	      currentprecision+1 or the input argument precision, */
2949     /*	      whichever is larger (+2 for use as temporary) */
2950     /*	 b -- intermediate temporary result (same size as a) */
2951     /* if any is too long for local storage, then allocate */
2952     workp=MAXI(set->digits+1, rhs->digits);  /* actual rounding precision */
2953     maxp=workp+2;			     /* largest working precision */
2954 
2955     needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
2956     if (needbytes>(Int)sizeof(buff)) {
2957       allocbuff=(decNumber *)malloc(needbytes);
2958       if (allocbuff==NULL) {  /* hopeless -- abandon */
2959 	status|=DEC_Insufficient_storage;
2960 	break;}
2961       f=allocbuff;	      /* use the allocated space */
2962       }
2963     /* a and b both need to be able to hold a maxp-length number */
2964     needbytes=sizeof(decNumber)+(D2U(maxp)-1)*sizeof(Unit);
2965     if (needbytes>(Int)sizeof(bufa)) {		  /* [same applies to b] */
2966       allocbufa=(decNumber *)malloc(needbytes);
2967       allocbufb=(decNumber *)malloc(needbytes);
2968       if (allocbufa==NULL || allocbufb==NULL) {	  /* hopeless */
2969 	status|=DEC_Insufficient_storage;
2970 	break;}
2971       a=allocbufa;	      /* use the allocated spaces */
2972       b=allocbufb;	      /* .. */
2973       }
2974 
2975     /* copy rhs -> f, save exponent, and reduce so 0.1 <= f < 1 */
2976     decNumberCopy(f, rhs);
2977     exp=f->exponent+f->digits;		     /* adjusted to Hull rules */
2978     f->exponent=-(f->digits);		     /* to range */
2979 
2980     /* set up working context */
2981     decContextDefault(&workset, DEC_INIT_DECIMAL64);
2982 
2983     /* [Until further notice, no error is possible and status bits */
2984     /* (Rounded, etc.) should be ignored, not accumulated.] */
2985 
2986     /* Calculate initial approximation, and allow for odd exponent */
2987     workset.digits=workp;		     /* p for initial calculation */
2988     t->bits=0; t->digits=3;
2989     a->bits=0; a->digits=3;
2990     if ((exp & 1)==0) {			     /* even exponent */
2991       /* Set t=0.259, a=0.819 */
2992       t->exponent=-3;
2993       a->exponent=-3;
2994       #if DECDPUN>=3
2995 	t->lsu[0]=259;
2996 	a->lsu[0]=819;
2997       #elif DECDPUN==2
2998 	t->lsu[0]=59; t->lsu[1]=2;
2999 	a->lsu[0]=19; a->lsu[1]=8;
3000       #else
3001 	t->lsu[0]=9; t->lsu[1]=5; t->lsu[2]=2;
3002 	a->lsu[0]=9; a->lsu[1]=1; a->lsu[2]=8;
3003       #endif
3004       }
3005      else {				     /* odd exponent */
3006       /* Set t=0.0819, a=2.59 */
3007       f->exponent--;			     /* f=f/10 */
3008       exp++;				     /* e=e+1 */
3009       t->exponent=-4;
3010       a->exponent=-2;
3011       #if DECDPUN>=3
3012 	t->lsu[0]=819;
3013 	a->lsu[0]=259;
3014       #elif DECDPUN==2
3015 	t->lsu[0]=19; t->lsu[1]=8;
3016 	a->lsu[0]=59; a->lsu[1]=2;
3017       #else
3018 	t->lsu[0]=9; t->lsu[1]=1; t->lsu[2]=8;
3019 	a->lsu[0]=9; a->lsu[1]=5; a->lsu[2]=2;
3020       #endif
3021       }
3022     decMultiplyOp(a, a, f, &workset, &ignore);	  /* a=a*f */
3023     decAddOp(a, a, t, &workset, 0, &ignore);	  /* ..+t */
3024     /* [a is now the initial approximation for sqrt(f), calculated with */
3025     /* currentprecision, which is also a's precision.] */
3026 
3027     /* the main calculation loop */
3028     decNumberZero(&dzero);		     /* make 0 */
3029     decNumberZero(t);			     /* set t = 0.5 */
3030     t->lsu[0]=5;			     /* .. */
3031     t->exponent=-1;			     /* .. */
3032     workset.digits=3;			     /* initial p */
3033     for (;;) {
3034       /* set p to min(2*p - 2, maxp)  [hence 3; or: 4, 6, 10, ... , maxp] */
3035       workset.digits=workset.digits*2-2;
3036       if (workset.digits>maxp) workset.digits=maxp;
3037       /* a = 0.5 * (a + f/a) */
3038       /* [calculated at p then rounded to currentprecision] */
3039       decDivideOp(b, f, a, &workset, DIVIDE, &ignore); /* b=f/a */
3040       decAddOp(b, b, a, &workset, 0, &ignore);	  /* b=b+a */
3041       decMultiplyOp(a, b, t, &workset, &ignore);  /* a=b*0.5 */
3042       if (a->digits==maxp) break;	     /* have required digits */
3043       } /* loop */
3044 
3045     /* Here, 0.1 <= a < 1 [Hull], and a has maxp digits */
3046     /* now reduce to length, etc.; this needs to be done with a */
3047     /* having the correct exponent so as to handle subnormals */
3048     /* correctly */
3049     approxset=*set;			     /* get emin, emax, etc. */
3050     approxset.round=DEC_ROUND_HALF_EVEN;
3051     a->exponent+=exp/2;			     /* set correct exponent */
3052 
3053     rstatus=0;				     /* clear status */
3054     residue=0;				     /* .. and accumulator */
3055     decCopyFit(a, a, &approxset, &residue, &rstatus);  /* reduce (if needed) */
3056     decFinish(a, &approxset, &residue, &rstatus);      /* clean and finalize */
3057 
3058     /* Overflow was possible if the input exponent was out-of-range, */
3059     /* in which case quit */
3060     if (rstatus&DEC_Overflow) {
3061       status=rstatus;			     /* use the status as-is */
3062       decNumberCopy(res, a);		     /* copy to result */
3063       break;
3064       }
3065 
3066     /* Preserve status except Inexact/Rounded */
3067     status|=(rstatus & ~(DEC_Rounded|DEC_Inexact));
3068 
3069     /* Carry out the Hull correction */
3070     a->exponent-=exp/2;			     /* back to 0.1->1 */
3071 
3072     /* a is now at final precision and within 1 ulp of the properly */
3073     /* rounded square root of f; to ensure proper rounding, compare */
3074     /* squares of (a - l/2 ulp) and (a + l/2 ulp) with f. */
3075     /* Here workset.digits=maxp and t=0.5, and a->digits determines */
3076     /* the ulp */
3077     workset.digits--;				  /* maxp-1 is OK now */
3078     t->exponent=-a->digits-1;			  /* make 0.5 ulp */
3079     decAddOp(b, a, t, &workset, DECNEG, &ignore); /* b = a - 0.5 ulp */
3080     workset.round=DEC_ROUND_UP;
3081     decMultiplyOp(b, b, b, &workset, &ignore);	  /* b = mulru(b, b) */
3082     decCompareOp(b, f, b, &workset, COMPARE, &ignore); /* b ? f, reversed */
3083     if (decNumberIsNegative(b)) {		  /* f < b [i.e., b > f] */
3084       /* this is the more common adjustment, though both are rare */
3085       t->exponent++;				  /* make 1.0 ulp */
3086       t->lsu[0]=1;				  /* .. */
3087       decAddOp(a, a, t, &workset, DECNEG, &ignore); /* a = a - 1 ulp */
3088       /* assign to approx [round to length] */
3089       approxset.emin-=exp/2;			  /* adjust to match a */
3090       approxset.emax-=exp/2;
3091       decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3092       }
3093      else {
3094       decAddOp(b, a, t, &workset, 0, &ignore);	  /* b = a + 0.5 ulp */
3095       workset.round=DEC_ROUND_DOWN;
3096       decMultiplyOp(b, b, b, &workset, &ignore);  /* b = mulrd(b, b) */
3097       decCompareOp(b, b, f, &workset, COMPARE, &ignore);   /* b ? f */
3098       if (decNumberIsNegative(b)) {		  /* b < f */
3099 	t->exponent++;				  /* make 1.0 ulp */
3100 	t->lsu[0]=1;				  /* .. */
3101 	decAddOp(a, a, t, &workset, 0, &ignore);  /* a = a + 1 ulp */
3102 	/* assign to approx [round to length] */
3103 	approxset.emin-=exp/2;			  /* adjust to match a */
3104 	approxset.emax-=exp/2;
3105 	decAddOp(a, &dzero, a, &approxset, 0, &ignore);
3106 	}
3107       }
3108     /* [no errors are possible in the above, and rounding/inexact during */
3109     /* estimation are irrelevant, so status was not accumulated] */
3110 
3111     /* Here, 0.1 <= a < 1  (still), so adjust back */
3112     a->exponent+=exp/2;			     /* set correct exponent */
3113 
3114     /* count droppable zeros [after any subnormal rounding] by */
3115     /* trimming a copy */
3116     decNumberCopy(b, a);
3117     decTrim(b, set, 1, &dropped);	     /* [drops trailing zeros] */
3118 
3119     /* Set Inexact and Rounded.	 The answer can only be exact if */
3120     /* it is short enough so that squaring it could fit in workp digits, */
3121     /* and it cannot have trailing zeros due to clamping, so these are */
3122     /* the only (relatively rare) conditions a careful check is needed */
3123     if (b->digits*2-1 > workp && !set->clamp) { /* cannot fit */
3124       status|=DEC_Inexact|DEC_Rounded;
3125       }
3126      else {				     /* could be exact/unrounded */
3127       uInt mstatus=0;			     /* local status */
3128       decMultiplyOp(b, b, b, &workset, &mstatus); /* try the multiply */
3129       if (mstatus&DEC_Overflow) {	     /* result just won't fit */
3130 	status|=DEC_Inexact|DEC_Rounded;
3131 	}
3132        else {				     /* plausible */
3133 	decCompareOp(t, b, rhs, &workset, COMPARE, &mstatus); /* b ? rhs */
3134 	if (!ISZERO(t)) status|=DEC_Inexact|DEC_Rounded; /* not equal */
3135 	 else {				     /* is Exact */
3136 	  /* here, dropped is the count of trailing zeros in 'a' */
3137 	  /* use closest exponent to ideal... */
3138 	  Int todrop=ideal-a->exponent;	     /* most that can be dropped */
3139 	  if (todrop<0) status|=DEC_Rounded; /* ideally would add 0s */
3140 	   else {			     /* unrounded */
3141 	    if (dropped<todrop) {	     /* clamp to those available */
3142 	      todrop=dropped;
3143 	      status|=DEC_Clamped;
3144 	      }
3145 	    if (todrop>0) {		     /* have some to drop */
3146 	      decShiftToLeast(a->lsu, D2U(a->digits), todrop);
3147 	      a->exponent+=todrop;	     /* maintain numerical value */
3148 	      a->digits-=todrop;	     /* new length */
3149 	      }
3150 	    }
3151 	  }
3152 	}
3153       }
3154 
3155     /* double-check Underflow, as perhaps the result could not have */
3156     /* been subnormal (initial argument too big), or it is now Exact */
3157     if (status&DEC_Underflow) {
3158       Int ae=rhs->exponent+rhs->digits-1;    /* adjusted exponent */
3159       /* check if truly subnormal */
3160       #if DECEXTFLAG			     /* DEC_Subnormal too */
3161 	if (ae>=set->emin*2) status&=~(DEC_Subnormal|DEC_Underflow);
3162       #else
3163 	if (ae>=set->emin*2) status&=~DEC_Underflow;
3164       #endif
3165       /* check if truly inexact */
3166       if (!(status&DEC_Inexact)) status&=~DEC_Underflow;
3167       }
3168 
3169     decNumberCopy(res, a);		     /* a is now the result */
3170     } while(0);				     /* end protected */
3171 
3172   if (allocbuff!=NULL) free(allocbuff);	     /* drop any storage used */
3173   if (allocbufa!=NULL) free(allocbufa);	     /* .. */
3174   if (allocbufb!=NULL) free(allocbufb);	     /* .. */
3175   #if DECSUBSET
3176   if (allocrhs !=NULL) free(allocrhs);	     /* .. */
3177   #endif
3178   if (status!=0) decStatus(res, status, set);/* then report status */
3179   #if DECCHECK
3180   decCheckInexact(res, set);
3181   #endif
3182   return res;
3183   } /* decNumberSquareRoot */
3184 
3185 /* ------------------------------------------------------------------ */
3186 /* decNumberSubtract -- subtract two Numbers			      */
3187 /*								      */
3188 /*   This computes C = A - B					      */
3189 /*								      */
3190 /*   res is C, the result.  C may be A and/or B (e.g., X=X-X)	      */
3191 /*   lhs is A							      */
3192 /*   rhs is B							      */
3193 /*   set is the context						      */
3194 /*								      */
3195 /* C must have space for set->digits digits.			      */
3196 /* ------------------------------------------------------------------ */
3197 decNumber * decNumberSubtract(decNumber *res, const decNumber *lhs,
3198 			      const decNumber *rhs, decContext *set) {
3199   uInt status=0;			/* accumulator */
3200 
3201   decAddOp(res, lhs, rhs, set, DECNEG, &status);
3202   if (status!=0) decStatus(res, status, set);
3203   #if DECCHECK
3204   decCheckInexact(res, set);
3205   #endif
3206   return res;
3207   } /* decNumberSubtract */
3208 
3209 /* ------------------------------------------------------------------ */
3210 /* decNumberToIntegralExact -- round-to-integral-value with InExact   */
3211 /* decNumberToIntegralValue -- round-to-integral-value		      */
3212 /*								      */
3213 /*   res is the result						      */
3214 /*   rhs is input number					      */
3215 /*   set is the context						      */
3216 /*								      */
3217 /* res must have space for any value of rhs.			      */
3218 /*								      */
3219 /* This implements the IEEE special operators and therefore treats    */
3220 /* special values as valid.  For finite numbers it returns	      */
3221 /* rescale(rhs, 0) if rhs->exponent is <0.			      */
3222 /* Otherwise the result is rhs (so no error is possible, except for   */
3223 /* sNaN).							      */
3224 /*								      */
3225 /* The context is used for rounding mode and status after sNaN, but   */
3226 /* the digits setting is ignored.  The Exact version will signal      */
3227 /* Inexact if the result differs numerically from rhs; the other      */
3228 /* never signals Inexact.					      */
3229 /* ------------------------------------------------------------------ */
3230 decNumber * decNumberToIntegralExact(decNumber *res, const decNumber *rhs,
3231 				     decContext *set) {
3232   decNumber dn;
3233   decContext workset;		   /* working context */
3234   uInt status=0;		   /* accumulator */
3235 
3236   #if DECCHECK
3237   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
3238   #endif
3239 
3240   /* handle infinities and NaNs */
3241   if (SPECIALARG) {
3242     if (decNumberIsInfinite(rhs)) decNumberCopy(res, rhs); /* an Infinity */
3243      else decNaNs(res, rhs, NULL, set, &status); /* a NaN */
3244     }
3245    else { /* finite */
3246     /* have a finite number; no error possible (res must be big enough) */
3247     if (rhs->exponent>=0) return decNumberCopy(res, rhs);
3248     /* that was easy, but if negative exponent there is work to do... */
3249     workset=*set;		   /* clone rounding, etc. */
3250     workset.digits=rhs->digits;	   /* no length rounding */
3251     workset.traps=0;		   /* no traps */
3252     decNumberZero(&dn);		   /* make a number with exponent 0 */
3253     decNumberQuantize(res, rhs, &dn, &workset);
3254     status|=workset.status;
3255     }
3256   if (status!=0) decStatus(res, status, set);
3257   return res;
3258   } /* decNumberToIntegralExact */
3259 
3260 decNumber * decNumberToIntegralValue(decNumber *res, const decNumber *rhs,
3261 				     decContext *set) {
3262   decContext workset=*set;	   /* working context */
3263   workset.traps=0;		   /* no traps */
3264   decNumberToIntegralExact(res, rhs, &workset);
3265   /* this never affects set, except for sNaNs; NaN will have been set */
3266   /* or propagated already, so no need to call decStatus */
3267   set->status|=workset.status&DEC_Invalid_operation;
3268   return res;
3269   } /* decNumberToIntegralValue */
3270 
3271 /* ------------------------------------------------------------------ */
3272 /* decNumberXor -- XOR two Numbers, digitwise			      */
3273 /*								      */
3274 /*   This computes C = A ^ B					      */
3275 /*								      */
3276 /*   res is C, the result.  C may be A and/or B (e.g., X=X^X)	      */
3277 /*   lhs is A							      */
3278 /*   rhs is B							      */
3279 /*   set is the context (used for result length and error report)     */
3280 /*								      */
3281 /* C must have space for set->digits digits.			      */
3282 /*								      */
3283 /* Logical function restrictions apply (see above); a NaN is	      */
3284 /* returned with Invalid_operation if a restriction is violated.      */
3285 /* ------------------------------------------------------------------ */
3286 decNumber * decNumberXor(decNumber *res, const decNumber *lhs,
3287 			 const decNumber *rhs, decContext *set) {
3288   const Unit *ua, *ub;			/* -> operands */
3289   const Unit *msua, *msub;		/* -> operand msus */
3290   Unit	*uc, *msuc;			/* -> result and its msu */
3291   Int	msudigs;			/* digits in res msu */
3292   #if DECCHECK
3293   if (decCheckOperands(res, lhs, rhs, set)) return res;
3294   #endif
3295 
3296   if (lhs->exponent!=0 || decNumberIsSpecial(lhs) || decNumberIsNegative(lhs)
3297    || rhs->exponent!=0 || decNumberIsSpecial(rhs) || decNumberIsNegative(rhs)) {
3298     decStatus(res, DEC_Invalid_operation, set);
3299     return res;
3300     }
3301   /* operands are valid */
3302   ua=lhs->lsu;				/* bottom-up */
3303   ub=rhs->lsu;				/* .. */
3304   uc=res->lsu;				/* .. */
3305   msua=ua+D2U(lhs->digits)-1;		/* -> msu of lhs */
3306   msub=ub+D2U(rhs->digits)-1;		/* -> msu of rhs */
3307   msuc=uc+D2U(set->digits)-1;		/* -> msu of result */
3308   msudigs=MSUDIGITS(set->digits);	/* [faster than remainder] */
3309   for (; uc<=msuc; ua++, ub++, uc++) {	/* Unit loop */
3310     Unit a, b;				/* extract units */
3311     if (ua>msua) a=0;
3312      else a=*ua;
3313     if (ub>msub) b=0;
3314      else b=*ub;
3315     *uc=0;				/* can now write back */
3316     if (a|b) {				/* maybe 1 bits to examine */
3317       Int i, j;
3318       /* This loop could be unrolled and/or use BIN2BCD tables */
3319       for (i=0; i<DECDPUN; i++) {
3320 	if ((a^b)&1) *uc=*uc+(Unit)powers[i];	  /* effect XOR */
3321 	j=a%10;
3322 	a=a/10;
3323 	j|=b%10;
3324 	b=b/10;
3325 	if (j>1) {
3326 	  decStatus(res, DEC_Invalid_operation, set);
3327 	  return res;
3328 	  }
3329 	if (uc==msuc && i==msudigs-1) break;	  /* just did final digit */
3330 	} /* each digit */
3331       } /* non-zero */
3332     } /* each unit */
3333   /* [here uc-1 is the msu of the result] */
3334   res->digits=decGetDigits(res->lsu, uc-res->lsu);
3335   res->exponent=0;			/* integer */
3336   res->bits=0;				/* sign=0 */
3337   return res;  /* [no status to set] */
3338   } /* decNumberXor */
3339 
3340 
3341 /* ================================================================== */
3342 /* Utility routines						      */
3343 /* ================================================================== */
3344 
3345 /* ------------------------------------------------------------------ */
3346 /* decNumberClass -- return the decClass of a decNumber		      */
3347 /*   dn -- the decNumber to test				      */
3348 /*   set -- the context to use for Emin				      */
3349 /*   returns the decClass enum					      */
3350 /* ------------------------------------------------------------------ */
3351 enum decClass decNumberClass(const decNumber *dn, decContext *set) {
3352   if (decNumberIsSpecial(dn)) {
3353     if (decNumberIsQNaN(dn)) return DEC_CLASS_QNAN;
3354     if (decNumberIsSNaN(dn)) return DEC_CLASS_SNAN;
3355     /* must be an infinity */
3356     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_INF;
3357     return DEC_CLASS_POS_INF;
3358     }
3359   /* is finite */
3360   if (decNumberIsNormal(dn, set)) { /* most common */
3361     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_NORMAL;
3362     return DEC_CLASS_POS_NORMAL;
3363     }
3364   /* is subnormal or zero */
3365   if (decNumberIsZero(dn)) {	/* most common */
3366     if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_ZERO;
3367     return DEC_CLASS_POS_ZERO;
3368     }
3369   if (decNumberIsNegative(dn)) return DEC_CLASS_NEG_SUBNORMAL;
3370   return DEC_CLASS_POS_SUBNORMAL;
3371   } /* decNumberClass */
3372 
3373 /* ------------------------------------------------------------------ */
3374 /* decNumberClassToString -- convert decClass to a string	      */
3375 /*								      */
3376 /*  eclass is a valid decClass					      */
3377 /*  returns a constant string describing the class (max 13+1 chars)   */
3378 /* ------------------------------------------------------------------ */
3379 const char *decNumberClassToString(enum decClass eclass) {
3380   if (eclass==DEC_CLASS_POS_NORMAL)    return DEC_ClassString_PN;
3381   if (eclass==DEC_CLASS_NEG_NORMAL)    return DEC_ClassString_NN;
3382   if (eclass==DEC_CLASS_POS_ZERO)      return DEC_ClassString_PZ;
3383   if (eclass==DEC_CLASS_NEG_ZERO)      return DEC_ClassString_NZ;
3384   if (eclass==DEC_CLASS_POS_SUBNORMAL) return DEC_ClassString_PS;
3385   if (eclass==DEC_CLASS_NEG_SUBNORMAL) return DEC_ClassString_NS;
3386   if (eclass==DEC_CLASS_POS_INF)       return DEC_ClassString_PI;
3387   if (eclass==DEC_CLASS_NEG_INF)       return DEC_ClassString_NI;
3388   if (eclass==DEC_CLASS_QNAN)	       return DEC_ClassString_QN;
3389   if (eclass==DEC_CLASS_SNAN)	       return DEC_ClassString_SN;
3390   return DEC_ClassString_UN;	       /* Unknown */
3391   } /* decNumberClassToString */
3392 
3393 /* ------------------------------------------------------------------ */
3394 /* decNumberCopy -- copy a number				      */
3395 /*								      */
3396 /*   dest is the target decNumber				      */
3397 /*   src  is the source decNumber				      */
3398 /*   returns dest						      */
3399 /*								      */
3400 /* (dest==src is allowed and is a no-op)			      */
3401 /* All fields are updated as required.	This is a utility operation,  */
3402 /* so special values are unchanged and no error is possible.	      */
3403 /* ------------------------------------------------------------------ */
3404 decNumber * decNumberCopy(decNumber *dest, const decNumber *src) {
3405 
3406   #if DECCHECK
3407   if (src==NULL) return decNumberZero(dest);
3408   #endif
3409 
3410   if (dest==src) return dest;		     /* no copy required */
3411 
3412   /* Use explicit assignments here as structure assignment could copy */
3413   /* more than just the lsu (for small DECDPUN).  This would not affect */
3414   /* the value of the results, but could disturb test harness spill */
3415   /* checking. */
3416   dest->bits=src->bits;
3417   dest->exponent=src->exponent;
3418   dest->digits=src->digits;
3419   dest->lsu[0]=src->lsu[0];
3420   if (src->digits>DECDPUN) {		     /* more Units to come */
3421     const Unit *smsup, *s;		     /* work */
3422     Unit  *d;				     /* .. */
3423     /* memcpy for the remaining Units would be safe as they cannot */
3424     /* overlap.	 However, this explicit loop is faster in short cases. */
3425     d=dest->lsu+1;			     /* -> first destination */
3426     smsup=src->lsu+D2U(src->digits);	     /* -> source msu+1 */
3427     for (s=src->lsu+1; s<smsup; s++, d++) *d=*s;
3428     }
3429   return dest;
3430   } /* decNumberCopy */
3431 
3432 /* ------------------------------------------------------------------ */
3433 /* decNumberCopyAbs -- quiet absolute value operator		      */
3434 /*								      */
3435 /*   This sets C = abs(A)					      */
3436 /*								      */
3437 /*   res is C, the result.  C may be A				      */
3438 /*   rhs is A							      */
3439 /*								      */
3440 /* C must have space for set->digits digits.			      */
3441 /* No exception or error can occur; this is a quiet bitwise operation.*/
3442 /* See also decNumberAbs for a checking version of this.	      */
3443 /* ------------------------------------------------------------------ */
3444 decNumber * decNumberCopyAbs(decNumber *res, const decNumber *rhs) {
3445   #if DECCHECK
3446   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3447   #endif
3448   decNumberCopy(res, rhs);
3449   res->bits&=~DECNEG;			/* turn off sign */
3450   return res;
3451   } /* decNumberCopyAbs */
3452 
3453 /* ------------------------------------------------------------------ */
3454 /* decNumberCopyNegate -- quiet negate value operator		      */
3455 /*								      */
3456 /*   This sets C = negate(A)					      */
3457 /*								      */
3458 /*   res is C, the result.  C may be A				      */
3459 /*   rhs is A							      */
3460 /*								      */
3461 /* C must have space for set->digits digits.			      */
3462 /* No exception or error can occur; this is a quiet bitwise operation.*/
3463 /* See also decNumberMinus for a checking version of this.	      */
3464 /* ------------------------------------------------------------------ */
3465 decNumber * decNumberCopyNegate(decNumber *res, const decNumber *rhs) {
3466   #if DECCHECK
3467   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3468   #endif
3469   decNumberCopy(res, rhs);
3470   res->bits^=DECNEG;			/* invert the sign */
3471   return res;
3472   } /* decNumberCopyNegate */
3473 
3474 /* ------------------------------------------------------------------ */
3475 /* decNumberCopySign -- quiet copy and set sign operator	      */
3476 /*								      */
3477 /*   This sets C = A with the sign of B				      */
3478 /*								      */
3479 /*   res is C, the result.  C may be A				      */
3480 /*   lhs is A							      */
3481 /*   rhs is B							      */
3482 /*								      */
3483 /* C must have space for set->digits digits.			      */
3484 /* No exception or error can occur; this is a quiet bitwise operation.*/
3485 /* ------------------------------------------------------------------ */
3486 decNumber * decNumberCopySign(decNumber *res, const decNumber *lhs,
3487 			      const decNumber *rhs) {
3488   uByte sign;				/* rhs sign */
3489   #if DECCHECK
3490   if (decCheckOperands(res, DECUNUSED, rhs, DECUNCONT)) return res;
3491   #endif
3492   sign=rhs->bits & DECNEG;		/* save sign bit */
3493   decNumberCopy(res, lhs);
3494   res->bits&=~DECNEG;			/* clear the sign */
3495   res->bits|=sign;			/* set from rhs */
3496   return res;
3497   } /* decNumberCopySign */
3498 
3499 /* ------------------------------------------------------------------ */
3500 /* decNumberGetBCD -- get the coefficient in BCD8		      */
3501 /*   dn is the source decNumber					      */
3502 /*   bcd is the uInt array that will receive dn->digits BCD bytes,    */
3503 /*     most-significant at offset 0				      */
3504 /*   returns bcd						      */
3505 /*								      */
3506 /* bcd must have at least dn->digits bytes.  No error is possible; if */
3507 /* dn is a NaN or Infinite, digits must be 1 and the coefficient 0.   */
3508 /* ------------------------------------------------------------------ */
3509 uByte * decNumberGetBCD(const decNumber *dn, uint8_t *bcd) {
3510   uByte *ub=bcd+dn->digits-1;	   /* -> lsd */
3511   const Unit *up=dn->lsu;	   /* Unit pointer, -> lsu */
3512 
3513   #if DECDPUN==1		   /* trivial simple copy */
3514     for (; ub>=bcd; ub--, up++) *ub=*up;
3515   #else				   /* chopping needed */
3516     uInt u=*up;			   /* work */
3517     uInt cut=DECDPUN;		   /* downcounter through unit */
3518     for (; ub>=bcd; ub--) {
3519       *ub=(uByte)(u%10);	   /* [*6554 trick inhibits, here] */
3520       u=u/10;
3521       cut--;
3522       if (cut>0) continue;	   /* more in this unit */
3523       up++;
3524       u=*up;
3525       cut=DECDPUN;
3526       }
3527   #endif
3528   return bcd;
3529   } /* decNumberGetBCD */
3530 
3531 /* ------------------------------------------------------------------ */
3532 /* decNumberSetBCD -- set (replace) the coefficient from BCD8	      */
3533 /*   dn is the target decNumber					      */
3534 /*   bcd is the uInt array that will source n BCD bytes, most-	      */
3535 /*     significant at offset 0					      */
3536 /*   n is the number of digits in the source BCD array (bcd)	      */
3537 /*   returns dn							      */
3538 /*								      */
3539 /* dn must have space for at least n digits.  No error is possible;   */
3540 /* if dn is a NaN, or Infinite, or is to become a zero, n must be 1   */
3541 /* and bcd[0] zero.						      */
3542 /* ------------------------------------------------------------------ */
3543 decNumber * decNumberSetBCD(decNumber *dn, const uByte *bcd, uInt n) {
3544   Unit *up = dn->lsu + D2U(n) - 1;      /* -> msu [target pointer] */
3545   const uByte *ub=bcd;			/* -> source msd */
3546 
3547   #if DECDPUN==1			/* trivial simple copy */
3548     for (; ub<bcd+n; ub++, up--) *up=*ub;
3549   #else					/* some assembly needed */
3550     /* calculate how many digits in msu, and hence first cut */
3551     Int cut=MSUDIGITS(n);		/* [faster than remainder] */
3552     for (;up>=dn->lsu; up--) {		/* each Unit from msu */
3553       *up=0;				/* will take <=DECDPUN digits */
3554       for (; cut>0; ub++, cut--) *up=X10(*up)+*ub;
3555       cut=DECDPUN;			/* next Unit has all digits */
3556       }
3557   #endif
3558   dn->digits=n;				/* set digit count */
3559   return dn;
3560   } /* decNumberSetBCD */
3561 
3562 /* ------------------------------------------------------------------ */
3563 /* decNumberIsNormal -- test normality of a decNumber		      */
3564 /*   dn is the decNumber to test				      */
3565 /*   set is the context to use for Emin				      */
3566 /*   returns 1 if |dn| is finite and >=Nmin, 0 otherwise	      */
3567 /* ------------------------------------------------------------------ */
3568 Int decNumberIsNormal(const decNumber *dn, decContext *set) {
3569   Int ae;				/* adjusted exponent */
3570   #if DECCHECK
3571   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3572   #endif
3573 
3574   if (decNumberIsSpecial(dn)) return 0; /* not finite */
3575   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
3576 
3577   ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
3578   if (ae<set->emin) return 0;		/* is subnormal */
3579   return 1;
3580   } /* decNumberIsNormal */
3581 
3582 /* ------------------------------------------------------------------ */
3583 /* decNumberIsSubnormal -- test subnormality of a decNumber	      */
3584 /*   dn is the decNumber to test				      */
3585 /*   set is the context to use for Emin				      */
3586 /*   returns 1 if |dn| is finite, non-zero, and <Nmin, 0 otherwise    */
3587 /* ------------------------------------------------------------------ */
3588 Int decNumberIsSubnormal(const decNumber *dn, decContext *set) {
3589   Int ae;				/* adjusted exponent */
3590   #if DECCHECK
3591   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, set)) return 0;
3592   #endif
3593 
3594   if (decNumberIsSpecial(dn)) return 0; /* not finite */
3595   if (decNumberIsZero(dn)) return 0;	/* not non-zero */
3596 
3597   ae=dn->exponent+dn->digits-1;		/* adjusted exponent */
3598   if (ae<set->emin) return 1;		/* is subnormal */
3599   return 0;
3600   } /* decNumberIsSubnormal */
3601 
3602 /* ------------------------------------------------------------------ */
3603 /* decNumberTrim -- remove insignificant zeros			      */
3604 /*								      */
3605 /*   dn is the number to trim					      */
3606 /*   returns dn							      */
3607 /*								      */
3608 /* All fields are updated as required.	This is a utility operation,  */
3609 /* so special values are unchanged and no error is possible.	      */
3610 /* ------------------------------------------------------------------ */
3611 decNumber * decNumberTrim(decNumber *dn) {
3612   Int  dropped;			   /* work */
3613   decContext set;		   /* .. */
3614   #if DECCHECK
3615   if (decCheckOperands(DECUNRESU, DECUNUSED, dn, DECUNCONT)) return dn;
3616   #endif
3617   decContextDefault(&set, DEC_INIT_BASE);    /* clamp=0 */
3618   return decTrim(dn, &set, 0, &dropped);
3619   } /* decNumberTrim */
3620 
3621 /* ------------------------------------------------------------------ */
3622 /* decNumberVersion -- return the name and version of this module     */
3623 /*								      */
3624 /* No error is possible.					      */
3625 /* ------------------------------------------------------------------ */
3626 const char * decNumberVersion(void) {
3627   return DECVERSION;
3628   } /* decNumberVersion */
3629 
3630 /* ------------------------------------------------------------------ */
3631 /* decNumberZero -- set a number to 0				      */
3632 /*								      */
3633 /*   dn is the number to set, with space for one digit		      */
3634 /*   returns dn							      */
3635 /*								      */
3636 /* No error is possible.					      */
3637 /* ------------------------------------------------------------------ */
3638 /* Memset is not used as it is much slower in some environments. */
3639 decNumber * decNumberZero(decNumber *dn) {
3640 
3641   #if DECCHECK
3642   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
3643   #endif
3644 
3645   dn->bits=0;
3646   dn->exponent=0;
3647   dn->digits=1;
3648   dn->lsu[0]=0;
3649   return dn;
3650   } /* decNumberZero */
3651 
3652 /* ================================================================== */
3653 /* Local routines						      */
3654 /* ================================================================== */
3655 
3656 /* ------------------------------------------------------------------ */
3657 /* decToString -- lay out a number into a string		      */
3658 /*								      */
3659 /*   dn	    is the number to lay out				      */
3660 /*   string is where to lay out the number			      */
3661 /*   eng    is 1 if Engineering, 0 if Scientific		      */
3662 /*								      */
3663 /* string must be at least dn->digits+14 characters long	      */
3664 /* No error is possible.					      */
3665 /*								      */
3666 /* Note that this routine can generate a -0 or 0.000.  These are      */
3667 /* never generated in subset to-number or arithmetic, but can occur   */
3668 /* in non-subset arithmetic (e.g., -1*0 or 1.234-1.234).	      */
3669 /* ------------------------------------------------------------------ */
3670 /* If DECCHECK is enabled the string "?" is returned if a number is */
3671 /* invalid. */
3672 static void decToString(const decNumber *dn, char *string, Flag eng) {
3673   Int exp=dn->exponent;	      /* local copy */
3674   Int e;		      /* E-part value */
3675   Int pre;		      /* digits before the '.' */
3676   Int cut;		      /* for counting digits in a Unit */
3677   char *c=string;	      /* work [output pointer] */
3678   const Unit *up=dn->lsu+D2U(dn->digits)-1; /* -> msu [input pointer] */
3679   uInt u, pow;		      /* work */
3680 
3681   #if DECCHECK
3682   if (decCheckOperands(DECUNRESU, dn, DECUNUSED, DECUNCONT)) {
3683     strcpy(string, "?");
3684     return;}
3685   #endif
3686 
3687   if (decNumberIsNegative(dn)) {   /* Negatives get a minus */
3688     *c='-';
3689     c++;
3690     }
3691   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
3692     if (decNumberIsInfinite(dn)) {
3693       strcpy(c,	  "Inf");
3694       strcpy(c+3, "inity");
3695       return;}
3696     /* a NaN */
3697     if (dn->bits&DECSNAN) {	   /* signalling NaN */
3698       *c='s';
3699       c++;
3700       }
3701     strcpy(c, "NaN");
3702     c+=3;			   /* step past */
3703     /* if not a clean non-zero coefficient, that's all there is in a */
3704     /* NaN string */
3705     if (exp!=0 || (*dn->lsu==0 && dn->digits==1)) return;
3706     /* [drop through to add integer] */
3707     }
3708 
3709   /* calculate how many digits in msu, and hence first cut */
3710   cut=MSUDIGITS(dn->digits);	   /* [faster than remainder] */
3711   cut--;			   /* power of ten for digit */
3712 
3713   if (exp==0) {			   /* simple integer [common fastpath] */
3714     for (;up>=dn->lsu; up--) {	   /* each Unit from msu */
3715       u=*up;			   /* contains DECDPUN digits to lay out */
3716       for (; cut>=0; c++, cut--) TODIGIT(u, cut, c, pow);
3717       cut=DECDPUN-1;		   /* next Unit has all digits */
3718       }
3719     *c='\0';			   /* terminate the string */
3720     return;}
3721 
3722   /* non-0 exponent -- assume plain form */
3723   pre=dn->digits+exp;		   /* digits before '.' */
3724   e=0;				   /* no E */
3725   if ((exp>0) || (pre<-5)) {	   /* need exponential form */
3726     e=exp+dn->digits-1;		   /* calculate E value */
3727     pre=1;			   /* assume one digit before '.' */
3728     if (eng && (e!=0)) {	   /* engineering: may need to adjust */
3729       Int adj;			   /* adjustment */
3730       /* The C remainder operator is undefined for negative numbers, so */
3731       /* a positive remainder calculation must be used here */
3732       if (e<0) {
3733 	adj=(-e)%3;
3734 	if (adj!=0) adj=3-adj;
3735 	}
3736        else { /* e>0 */
3737 	adj=e%3;
3738 	}
3739       e=e-adj;
3740       /* if dealing with zero still produce an exponent which is a */
3741       /* multiple of three, as expected, but there will only be the */
3742       /* one zero before the E, still.	Otherwise note the padding. */
3743       if (!ISZERO(dn)) pre+=adj;
3744        else {  /* is zero */
3745 	if (adj!=0) {		   /* 0.00Esnn needed */
3746 	  e=e+3;
3747 	  pre=-(2-adj);
3748 	  }
3749 	} /* zero */
3750       } /* eng */
3751     } /* need exponent */
3752 
3753   /* lay out the digits of the coefficient, adding 0s and . as needed */
3754   u=*up;
3755   if (pre>0) {			   /* xxx.xxx or xx00 (engineering) form */
3756     Int n=pre;
3757     for (; pre>0; pre--, c++, cut--) {
3758       if (cut<0) {		   /* need new Unit */
3759 	if (up==dn->lsu) break;	   /* out of input digits (pre>digits) */
3760 	up--;
3761 	cut=DECDPUN-1;
3762 	u=*up;
3763 	}
3764       TODIGIT(u, cut, c, pow);
3765       }
3766     if (n<dn->digits) {		   /* more to come, after '.' */
3767       *c='.'; c++;
3768       for (;; c++, cut--) {
3769 	if (cut<0) {		   /* need new Unit */
3770 	  if (up==dn->lsu) break;  /* out of input digits */
3771 	  up--;
3772 	  cut=DECDPUN-1;
3773 	  u=*up;
3774 	  }
3775 	TODIGIT(u, cut, c, pow);
3776 	}
3777       }
3778      else for (; pre>0; pre--, c++) *c='0'; /* 0 padding (for engineering) needed */
3779     }
3780    else {			   /* 0.xxx or 0.000xxx form */
3781     *c='0'; c++;
3782     *c='.'; c++;
3783     for (; pre<0; pre++, c++) *c='0';	/* add any 0's after '.' */
3784     for (; ; c++, cut--) {
3785       if (cut<0) {		   /* need new Unit */
3786 	if (up==dn->lsu) break;	   /* out of input digits */
3787 	up--;
3788 	cut=DECDPUN-1;
3789 	u=*up;
3790 	}
3791       TODIGIT(u, cut, c, pow);
3792       }
3793     }
3794 
3795   /* Finally add the E-part, if needed.	 It will never be 0, has a
3796      base maximum and minimum of +999999999 through -999999999, but
3797      could range down to -1999999998 for anormal numbers */
3798   if (e!=0) {
3799     Flag had=0;		      /* 1=had non-zero */
3800     *c='E'; c++;
3801     *c='+'; c++;	      /* assume positive */
3802     u=e;		      /* .. */
3803     if (e<0) {
3804       *(c-1)='-';	      /* oops, need - */
3805       u=-e;		      /* uInt, please */
3806       }
3807     /* lay out the exponent [_itoa or equivalent is not ANSI C] */
3808     for (cut=9; cut>=0; cut--) {
3809       TODIGIT(u, cut, c, pow);
3810       if (*c=='0' && !had) continue;	/* skip leading zeros */
3811       had=1;				/* had non-0 */
3812       c++;				/* step for next */
3813       } /* cut */
3814     }
3815   *c='\0';	    /* terminate the string (all paths) */
3816   return;
3817   } /* decToString */
3818 
3819 /* ------------------------------------------------------------------ */
3820 /* decAddOp -- add/subtract operation				      */
3821 /*								      */
3822 /*   This computes C = A + B					      */
3823 /*								      */
3824 /*   res is C, the result.  C may be A and/or B (e.g., X=X+X)	      */
3825 /*   lhs is A							      */
3826 /*   rhs is B							      */
3827 /*   set is the context						      */
3828 /*   negate is DECNEG if rhs should be negated, or 0 otherwise	      */
3829 /*   status accumulates status for the caller			      */
3830 /*								      */
3831 /* C must have space for set->digits digits.			      */
3832 /* Inexact in status must be 0 for correct Exact zero sign in result  */
3833 /* ------------------------------------------------------------------ */
3834 /* If possible, the coefficient is calculated directly into C.	      */
3835 /* However, if:							      */
3836 /*   -- a digits+1 calculation is needed because the numbers are      */
3837 /*	unaligned and span more than set->digits digits		      */
3838 /*   -- a carry to digits+1 digits looks possible		      */
3839 /*   -- C is the same as A or B, and the result would destructively   */
3840 /*	overlap the A or B coefficient				      */
3841 /* then the result must be calculated into a temporary buffer.	In    */
3842 /* this case a local (stack) buffer is used if possible, and only if  */
3843 /* too long for that does malloc become the final resort.	      */
3844 /*								      */
3845 /* Misalignment is handled as follows:				      */
3846 /*   Apad: (AExp>BExp) Swap operands and proceed as for BExp>AExp.    */
3847 /*   BPad: Apply the padding by a combination of shifting (whole      */
3848 /*	   units) and multiplication (part units).		      */
3849 /*								      */
3850 /* Addition, especially x=x+1, is speed-critical.		      */
3851 /* The static buffer is larger than might be expected to allow for    */
3852 /* calls from higher-level funtions (notable exp).		      */
3853 /* ------------------------------------------------------------------ */
3854 static decNumber * decAddOp(decNumber *res, const decNumber *lhs,
3855 			    const decNumber *rhs, decContext *set,
3856 			    uByte negate, uInt *status) {
3857   #if DECSUBSET
3858   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
3859   decNumber *allocrhs=NULL;	   /* .., rhs */
3860   #endif
3861   Int	rhsshift;		   /* working shift (in Units) */
3862   Int	maxdigits;		   /* longest logical length */
3863   Int	mult;			   /* multiplier */
3864   Int	residue;		   /* rounding accumulator */
3865   uByte bits;			   /* result bits */
3866   Flag	diffsign;		   /* non-0 if arguments have different sign */
3867   Unit	*acc;			   /* accumulator for result */
3868   Unit	accbuff[SD2U(DECBUFFER*2+20)]; /* local buffer [*2+20 reduces many */
3869 				   /* allocations when called from */
3870 				   /* other operations, notable exp] */
3871   Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
3872   Int	reqdigits=set->digits;	   /* local copy; requested DIGITS */
3873   Int	padding;		   /* work */
3874 
3875   #if DECCHECK
3876   if (decCheckOperands(res, lhs, rhs, set)) return res;
3877   #endif
3878 
3879   do {				   /* protect allocated storage */
3880     #if DECSUBSET
3881     if (!set->extended) {
3882       /* reduce operands and set lostDigits status, as needed */
3883       if (lhs->digits>reqdigits) {
3884 	alloclhs=decRoundOperand(lhs, set, status);
3885 	if (alloclhs==NULL) break;
3886 	lhs=alloclhs;
3887 	}
3888       if (rhs->digits>reqdigits) {
3889 	allocrhs=decRoundOperand(rhs, set, status);
3890 	if (allocrhs==NULL) break;
3891 	rhs=allocrhs;
3892 	}
3893       }
3894     #endif
3895     /* [following code does not require input rounding] */
3896 
3897     /* note whether signs differ [used all paths] */
3898     diffsign=(Flag)((lhs->bits^rhs->bits^negate)&DECNEG);
3899 
3900     /* handle infinities and NaNs */
3901     if (SPECIALARGS) {			/* a special bit set */
3902       if (SPECIALARGS & (DECSNAN | DECNAN))  /* a NaN */
3903 	decNaNs(res, lhs, rhs, set, status);
3904        else { /* one or two infinities */
3905 	if (decNumberIsInfinite(lhs)) { /* LHS is infinity */
3906 	  /* two infinities with different signs is invalid */
3907 	  if (decNumberIsInfinite(rhs) && diffsign) {
3908 	    *status|=DEC_Invalid_operation;
3909 	    break;
3910 	    }
3911 	  bits=lhs->bits & DECNEG;	/* get sign from LHS */
3912 	  }
3913 	 else bits=(rhs->bits^negate) & DECNEG;/* RHS must be Infinity */
3914 	bits|=DECINF;
3915 	decNumberZero(res);
3916 	res->bits=bits;			/* set +/- infinity */
3917 	} /* an infinity */
3918       break;
3919       }
3920 
3921     /* Quick exit for add 0s; return the non-0, modified as need be */
3922     if (ISZERO(lhs)) {
3923       Int adjust;			/* work */
3924       Int lexp=lhs->exponent;		/* save in case LHS==RES */
3925       bits=lhs->bits;			/* .. */
3926       residue=0;			/* clear accumulator */
3927       decCopyFit(res, rhs, set, &residue, status); /* copy (as needed) */
3928       res->bits^=negate;		/* flip if rhs was negated */
3929       #if DECSUBSET
3930       if (set->extended) {		/* exponents on zeros count */
3931       #endif
3932 	/* exponent will be the lower of the two */
3933 	adjust=lexp-res->exponent;	/* adjustment needed [if -ve] */
3934 	if (ISZERO(res)) {		/* both 0: special IEEE 854 rules */
3935 	  if (adjust<0) res->exponent=lexp;  /* set exponent */
3936 	  /* 0-0 gives +0 unless rounding to -infinity, and -0-0 gives -0 */
3937 	  if (diffsign) {
3938 	    if (set->round!=DEC_ROUND_FLOOR) res->bits=0;
3939 	     else res->bits=DECNEG;	/* preserve 0 sign */
3940 	    }
3941 	  }
3942 	 else { /* non-0 res */
3943 	  if (adjust<0) {     /* 0-padding needed */
3944 	    if ((res->digits-adjust)>set->digits) {
3945 	      adjust=res->digits-set->digits;	  /* to fit exactly */
3946 	      *status|=DEC_Rounded;		  /* [but exact] */
3947 	      }
3948 	    res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3949 	    res->exponent+=adjust;		  /* set the exponent. */
3950 	    }
3951 	  } /* non-0 res */
3952       #if DECSUBSET
3953 	} /* extended */
3954       #endif
3955       decFinish(res, set, &residue, status);	  /* clean and finalize */
3956       break;}
3957 
3958     if (ISZERO(rhs)) {			/* [lhs is non-zero] */
3959       Int adjust;			/* work */
3960       Int rexp=rhs->exponent;		/* save in case RHS==RES */
3961       bits=rhs->bits;			/* be clean */
3962       residue=0;			/* clear accumulator */
3963       decCopyFit(res, lhs, set, &residue, status); /* copy (as needed) */
3964       #if DECSUBSET
3965       if (set->extended) {		/* exponents on zeros count */
3966       #endif
3967 	/* exponent will be the lower of the two */
3968 	/* [0-0 case handled above] */
3969 	adjust=rexp-res->exponent;	/* adjustment needed [if -ve] */
3970 	if (adjust<0) {	    /* 0-padding needed */
3971 	  if ((res->digits-adjust)>set->digits) {
3972 	    adjust=res->digits-set->digits;	/* to fit exactly */
3973 	    *status|=DEC_Rounded;		/* [but exact] */
3974 	    }
3975 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
3976 	  res->exponent+=adjust;		/* set the exponent. */
3977 	  }
3978       #if DECSUBSET
3979 	} /* extended */
3980       #endif
3981       decFinish(res, set, &residue, status);	  /* clean and finalize */
3982       break;}
3983 
3984     /* [NB: both fastpath and mainpath code below assume these cases */
3985     /* (notably 0-0) have already been handled] */
3986 
3987     /* calculate the padding needed to align the operands */
3988     padding=rhs->exponent-lhs->exponent;
3989 
3990     /* Fastpath cases where the numbers are aligned and normal, the RHS */
3991     /* is all in one unit, no operand rounding is needed, and no carry, */
3992     /* lengthening, or borrow is needed */
3993     if (padding==0
3994 	&& rhs->digits<=DECDPUN
3995 	&& rhs->exponent>=set->emin	/* [some normals drop through] */
3996 	&& rhs->exponent<=set->emax-set->digits+1 /* [could clamp] */
3997 	&& rhs->digits<=reqdigits
3998 	&& lhs->digits<=reqdigits) {
3999       Int partial=*lhs->lsu;
4000       if (!diffsign) {			/* adding */
4001 	partial+=*rhs->lsu;
4002 	if ((partial<=DECDPUNMAX)	/* result fits in unit */
4003 	 && (lhs->digits>=DECDPUN ||	/* .. and no digits-count change */
4004 	     partial<(Int)powers[lhs->digits])) { /* .. */
4005 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4006 	  *res->lsu=(Unit)partial;	/* [copy could have overwritten RHS] */
4007 	  break;
4008 	  }
4009 	/* else drop out for careful add */
4010 	}
4011        else {				/* signs differ */
4012 	partial-=*rhs->lsu;
4013 	if (partial>0) { /* no borrow needed, and non-0 result */
4014 	  if (res!=lhs) decNumberCopy(res, lhs);  /* not in place */
4015 	  *res->lsu=(Unit)partial;
4016 	  /* this could have reduced digits [but result>0] */
4017 	  res->digits=decGetDigits(res->lsu, D2U(res->digits));
4018 	  break;
4019 	  }
4020 	/* else drop out for careful subtract */
4021 	}
4022       }
4023 
4024     /* Now align (pad) the lhs or rhs so they can be added or */
4025     /* subtracted, as necessary.  If one number is much larger than */
4026     /* the other (that is, if in plain form there is a least one */
4027     /* digit between the lowest digit of one and the highest of the */
4028     /* other) padding with up to DIGITS-1 trailing zeros may be */
4029     /* needed; then apply rounding (as exotic rounding modes may be */
4030     /* affected by the residue). */
4031     rhsshift=0;		      /* rhs shift to left (padding) in Units */
4032     bits=lhs->bits;	      /* assume sign is that of LHS */
4033     mult=1;		      /* likely multiplier */
4034 
4035     /* [if padding==0 the operands are aligned; no padding is needed] */
4036     if (padding!=0) {
4037       /* some padding needed; always pad the RHS, as any required */
4038       /* padding can then be effected by a simple combination of */
4039       /* shifts and a multiply */
4040       Flag swapped=0;
4041       if (padding<0) {			/* LHS needs the padding */
4042 	const decNumber *t;
4043 	padding=-padding;		/* will be +ve */
4044 	bits=(uByte)(rhs->bits^negate); /* assumed sign is now that of RHS */
4045 	t=lhs; lhs=rhs; rhs=t;
4046 	swapped=1;
4047 	}
4048 
4049       /* If, after pad, rhs would be longer than lhs by digits+1 or */
4050       /* more then lhs cannot affect the answer, except as a residue, */
4051       /* so only need to pad up to a length of DIGITS+1. */
4052       if (rhs->digits+padding > lhs->digits+reqdigits+1) {
4053 	/* The RHS is sufficient */
4054 	/* for residue use the relative sign indication... */
4055 	Int shift=reqdigits-rhs->digits;     /* left shift needed */
4056 	residue=1;			     /* residue for rounding */
4057 	if (diffsign) residue=-residue;	     /* signs differ */
4058 	/* copy, shortening if necessary */
4059 	decCopyFit(res, rhs, set, &residue, status);
4060 	/* if it was already shorter, then need to pad with zeros */
4061 	if (shift>0) {
4062 	  res->digits=decShiftToMost(res->lsu, res->digits, shift);
4063 	  res->exponent-=shift;		     /* adjust the exponent. */
4064 	  }
4065 	/* flip the result sign if unswapped and rhs was negated */
4066 	if (!swapped) res->bits^=negate;
4067 	decFinish(res, set, &residue, status);	  /* done */
4068 	break;}
4069 
4070       /* LHS digits may affect result */
4071       rhsshift=D2U(padding+1)-1;	/* this much by Unit shift .. */
4072       mult=powers[padding-(rhsshift*DECDPUN)]; /* .. this by multiplication */
4073       } /* padding needed */
4074 
4075     if (diffsign) mult=-mult;		/* signs differ */
4076 
4077     /* determine the longer operand */
4078     maxdigits=rhs->digits+padding;	/* virtual length of RHS */
4079     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4080 
4081     /* Decide on the result buffer to use; if possible place directly */
4082     /* into result. */
4083     acc=res->lsu;			/* assume add direct to result */
4084     /* If destructive overlap, or the number is too long, or a carry or */
4085     /* borrow to DIGITS+1 might be possible, a buffer must be used. */
4086     /* [Might be worth more sophisticated tests when maxdigits==reqdigits] */
4087     if ((maxdigits>=reqdigits)		/* is, or could be, too large */
4088      || (res==rhs && rhsshift>0)) {	/* destructive overlap */
4089       /* buffer needed, choose it; units for maxdigits digits will be */
4090       /* needed, +1 Unit for carry or borrow */
4091       Int need=D2U(maxdigits)+1;
4092       acc=accbuff;			/* assume use local buffer */
4093       if (need*sizeof(Unit)>sizeof(accbuff)) {
4094 	/* printf("malloc add %ld %ld\n", need, sizeof(accbuff)); */
4095 	allocacc=(Unit *)malloc(need*sizeof(Unit));
4096 	if (allocacc==NULL) {		/* hopeless -- abandon */
4097 	  *status|=DEC_Insufficient_storage;
4098 	  break;}
4099 	acc=allocacc;
4100 	}
4101       }
4102 
4103     res->bits=(uByte)(bits&DECNEG);	/* it's now safe to overwrite.. */
4104     res->exponent=lhs->exponent;	/* .. operands (even if aliased) */
4105 
4106     #if DECTRACE
4107       decDumpAr('A', lhs->lsu, D2U(lhs->digits));
4108       decDumpAr('B', rhs->lsu, D2U(rhs->digits));
4109       printf("	:h: %ld %ld\n", rhsshift, mult);
4110     #endif
4111 
4112     /* add [A+B*m] or subtract [A+B*(-m)] */
4113     res->digits=decUnitAddSub(lhs->lsu, D2U(lhs->digits),
4114 			      rhs->lsu, D2U(rhs->digits),
4115 			      rhsshift, acc, mult)
4116 	       *DECDPUN;	   /* [units -> digits] */
4117     if (res->digits<0) {	   /* borrowed... */
4118       res->digits=-res->digits;
4119       res->bits^=DECNEG;	   /* flip the sign */
4120       }
4121     #if DECTRACE
4122       decDumpAr('+', acc, D2U(res->digits));
4123     #endif
4124 
4125     /* If a buffer was used the result must be copied back, possibly */
4126     /* shortening.  (If no buffer was used then the result must have */
4127     /* fit, so can't need rounding and residue must be 0.) */
4128     residue=0;			   /* clear accumulator */
4129     if (acc!=res->lsu) {
4130       #if DECSUBSET
4131       if (set->extended) {	   /* round from first significant digit */
4132       #endif
4133 	/* remove leading zeros that were added due to rounding up to */
4134 	/* integral Units -- before the test for rounding. */
4135 	if (res->digits>reqdigits)
4136 	  res->digits=decGetDigits(acc, D2U(res->digits));
4137 	decSetCoeff(res, set, acc, res->digits, &residue, status);
4138       #if DECSUBSET
4139 	}
4140        else { /* subset arithmetic rounds from original significant digit */
4141 	/* May have an underestimate.  This only occurs when both */
4142 	/* numbers fit in DECDPUN digits and are padding with a */
4143 	/* negative multiple (-10, -100...) and the top digit(s) become */
4144 	/* 0.  (This only matters when using X3.274 rules where the */
4145 	/* leading zero could be included in the rounding.) */
4146 	if (res->digits<maxdigits) {
4147 	  *(acc+D2U(res->digits))=0; /* ensure leading 0 is there */
4148 	  res->digits=maxdigits;
4149 	  }
4150 	 else {
4151 	  /* remove leading zeros that added due to rounding up to */
4152 	  /* integral Units (but only those in excess of the original */
4153 	  /* maxdigits length, unless extended) before test for rounding. */
4154 	  if (res->digits>reqdigits) {
4155 	    res->digits=decGetDigits(acc, D2U(res->digits));
4156 	    if (res->digits<maxdigits) res->digits=maxdigits;
4157 	    }
4158 	  }
4159 	decSetCoeff(res, set, acc, res->digits, &residue, status);
4160 	/* Now apply rounding if needed before removing leading zeros. */
4161 	/* This is safe because subnormals are not a possibility */
4162 	if (residue!=0) {
4163 	  decApplyRound(res, set, residue, status);
4164 	  residue=0;		     /* did what needed to be done */
4165 	  }
4166 	} /* subset */
4167       #endif
4168       } /* used buffer */
4169 
4170     /* strip leading zeros [these were left on in case of subset subtract] */
4171     res->digits=decGetDigits(res->lsu, D2U(res->digits));
4172 
4173     /* apply checks and rounding */
4174     decFinish(res, set, &residue, status);
4175 
4176     /* "When the sum of two operands with opposite signs is exactly */
4177     /* zero, the sign of that sum shall be '+' in all rounding modes */
4178     /* except round toward -Infinity, in which mode that sign shall be */
4179     /* '-'."  [Subset zeros also never have '-', set by decFinish.] */
4180     if (ISZERO(res) && diffsign
4181      #if DECSUBSET
4182      && set->extended
4183      #endif
4184      && (*status&DEC_Inexact)==0) {
4185       if (set->round==DEC_ROUND_FLOOR) res->bits|=DECNEG;   /* sign - */
4186 				  else res->bits&=~DECNEG;  /* sign + */
4187       }
4188     } while(0);				     /* end protected */
4189 
4190   if (allocacc!=NULL) free(allocacc);	     /* drop any storage used */
4191   #if DECSUBSET
4192   if (allocrhs!=NULL) free(allocrhs);	     /* .. */
4193   if (alloclhs!=NULL) free(alloclhs);	     /* .. */
4194   #endif
4195   return res;
4196   } /* decAddOp */
4197 
4198 /* ------------------------------------------------------------------ */
4199 /* decDivideOp -- division operation				      */
4200 /*								      */
4201 /*  This routine performs the calculations for all four division      */
4202 /*  operators (divide, divideInteger, remainder, remainderNear).      */
4203 /*								      */
4204 /*  C=A op B							      */
4205 /*								      */
4206 /*   res is C, the result.  C may be A and/or B (e.g., X=X/X)	      */
4207 /*   lhs is A							      */
4208 /*   rhs is B							      */
4209 /*   set is the context						      */
4210 /*   op	 is DIVIDE, DIVIDEINT, REMAINDER, or REMNEAR respectively.    */
4211 /*   status is the usual accumulator				      */
4212 /*								      */
4213 /* C must have space for set->digits digits.			      */
4214 /*								      */
4215 /* ------------------------------------------------------------------ */
4216 /*   The underlying algorithm of this routine is the same as in the   */
4217 /*   1981 S/370 implementation, that is, non-restoring long division  */
4218 /*   with bi-unit (rather than bi-digit) estimation for each unit     */
4219 /*   multiplier.  In this pseudocode overview, complications for the  */
4220 /*   Remainder operators and division residues for exact rounding are */
4221 /*   omitted for clarity.					      */
4222 /*								      */
4223 /*     Prepare operands and handle special values		      */
4224 /*     Test for x/0 and then 0/x				      */
4225 /*     Exp =Exp1 - Exp2						      */
4226 /*     Exp =Exp +len(var1) -len(var2)				      */
4227 /*     Sign=Sign1 * Sign2					      */
4228 /*     Pad accumulator (Var1) to double-length with 0's (pad1)	      */
4229 /*     Pad Var2 to same length as Var1				      */
4230 /*     msu2pair/plus=1st 2 or 1 units of var2, +1 to allow for round  */
4231 /*     have=0							      */
4232 /*     Do until (have=digits+1 OR residue=0)			      */
4233 /*	 if exp<0 then if integer divide/residue then leave	      */
4234 /*	 this_unit=0						      */
4235 /*	 Do forever						      */
4236 /*	    compare numbers					      */
4237 /*	    if <0 then leave inner_loop				      */
4238 /*	    if =0 then (* quick exit without subtract *) do	      */
4239 /*	       this_unit=this_unit+1; output this_unit		      */
4240 /*	       leave outer_loop; end				      */
4241 /*	    Compare lengths of numbers (mantissae):		      */
4242 /*	    If same then tops2=msu2pair -- {units 1&2 of var2}	      */
4243 /*		    else tops2=msu2plus -- {0, unit 1 of var2}	      */
4244 /*	    tops1=first_unit_of_Var1*10**DECDPUN +second_unit_of_var1 */
4245 /*	    mult=tops1/tops2  -- Good and safe guess at divisor	      */
4246 /*	    if mult=0 then mult=1				      */
4247 /*	    this_unit=this_unit+mult				      */
4248 /*	    subtract						      */
4249 /*	    end inner_loop					      */
4250 /*	  if have\=0 | this_unit\=0 then do			      */
4251 /*	    output this_unit					      */
4252 /*	    have=have+1; end					      */
4253 /*	  var2=var2/10						      */
4254 /*	  exp=exp-1						      */
4255 /*	  end outer_loop					      */
4256 /*     exp=exp+1   -- set the proper exponent			      */
4257 /*     if have=0 then generate answer=0				      */
4258 /*     Return (Result is defined by Var1)			      */
4259 /*								      */
4260 /* ------------------------------------------------------------------ */
4261 /* Two working buffers are needed during the division; one (digits+   */
4262 /* 1) to accumulate the result, and the other (up to 2*digits+1) for  */
4263 /* long subtractions.  These are acc and var1 respectively.	      */
4264 /* var1 is a copy of the lhs coefficient, var2 is the rhs coefficient.*/
4265 /* The static buffers may be larger than might be expected to allow   */
4266 /* for calls from higher-level funtions (notable exp).		      */
4267 /* ------------------------------------------------------------------ */
4268 static decNumber * decDivideOp(decNumber *res,
4269 			       const decNumber *lhs, const decNumber *rhs,
4270 			       decContext *set, Flag op, uInt *status) {
4271   #if DECSUBSET
4272   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
4273   decNumber *allocrhs=NULL;	   /* .., rhs */
4274   #endif
4275   Unit	accbuff[SD2U(DECBUFFER+DECDPUN+10)]; /* local buffer */
4276   Unit	*acc=accbuff;		   /* -> accumulator array for result */
4277   Unit	*allocacc=NULL;		   /* -> allocated buffer, iff allocated */
4278   Unit	*accnext;		   /* -> where next digit will go */
4279   Int	acclength;		   /* length of acc needed [Units] */
4280   Int	accunits;		   /* count of units accumulated */
4281   Int	accdigits;		   /* count of digits accumulated */
4282 
4283   Unit	varbuff[SD2U(DECBUFFER*2+DECDPUN)*sizeof(Unit)]; /* buffer for var1 */
4284   Unit	*var1=varbuff;		   /* -> var1 array for long subtraction */
4285   Unit	*varalloc=NULL;		   /* -> allocated buffer, iff used */
4286   Unit	*msu1;			   /* -> msu of var1 */
4287 
4288   const Unit *var2;		   /* -> var2 array */
4289   const Unit *msu2;		   /* -> msu of var2 */
4290   Int	msu2plus;		   /* msu2 plus one [does not vary] */
4291   eInt	msu2pair;		   /* msu2 pair plus one [does not vary] */
4292 
4293   Int	var1units, var2units;	   /* actual lengths */
4294   Int	var2ulen;		   /* logical length (units) */
4295   Int	var1initpad=0;		   /* var1 initial padding (digits) */
4296   Int	maxdigits;		   /* longest LHS or required acc length */
4297   Int	mult;			   /* multiplier for subtraction */
4298   Unit	thisunit;		   /* current unit being accumulated */
4299   Int	residue;		   /* for rounding */
4300   Int	reqdigits=set->digits;	   /* requested DIGITS */
4301   Int	exponent;		   /* working exponent */
4302   Int	maxexponent=0;		   /* DIVIDE maximum exponent if unrounded */
4303   uByte bits;			   /* working sign */
4304   Unit	*target;		   /* work */
4305   const Unit *source;		   /* .. */
4306   uLong const *pow;                /* .. */
4307   Int	shift, cut;		   /* .. */
4308   #if DECSUBSET
4309   Int	dropped;		   /* work */
4310   #endif
4311 
4312   #if DECCHECK
4313   if (decCheckOperands(res, lhs, rhs, set)) return res;
4314   #endif
4315 
4316   do {				   /* protect allocated storage */
4317     #if DECSUBSET
4318     if (!set->extended) {
4319       /* reduce operands and set lostDigits status, as needed */
4320       if (lhs->digits>reqdigits) {
4321 	alloclhs=decRoundOperand(lhs, set, status);
4322 	if (alloclhs==NULL) break;
4323 	lhs=alloclhs;
4324 	}
4325       if (rhs->digits>reqdigits) {
4326 	allocrhs=decRoundOperand(rhs, set, status);
4327 	if (allocrhs==NULL) break;
4328 	rhs=allocrhs;
4329 	}
4330       }
4331     #endif
4332     /* [following code does not require input rounding] */
4333 
4334     bits=(lhs->bits^rhs->bits)&DECNEG;	/* assumed sign for divisions */
4335 
4336     /* handle infinities and NaNs */
4337     if (SPECIALARGS) {			/* a special bit set */
4338       if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4339 	decNaNs(res, lhs, rhs, set, status);
4340 	break;
4341 	}
4342       /* one or two infinities */
4343       if (decNumberIsInfinite(lhs)) {	/* LHS (dividend) is infinite */
4344 	if (decNumberIsInfinite(rhs) || /* two infinities are invalid .. */
4345 	    op & (REMAINDER | REMNEAR)) { /* as is remainder of infinity */
4346 	  *status|=DEC_Invalid_operation;
4347 	  break;
4348 	  }
4349 	/* [Note that infinity/0 raises no exceptions] */
4350 	decNumberZero(res);
4351 	res->bits=bits|DECINF;		/* set +/- infinity */
4352 	break;
4353 	}
4354        else {				/* RHS (divisor) is infinite */
4355 	residue=0;
4356 	if (op&(REMAINDER|REMNEAR)) {
4357 	  /* result is [finished clone of] lhs */
4358 	  decCopyFit(res, lhs, set, &residue, status);
4359 	  }
4360 	 else {	 /* a division */
4361 	  decNumberZero(res);
4362 	  res->bits=bits;		/* set +/- zero */
4363 	  /* for DIVIDEINT the exponent is always 0.  For DIVIDE, result */
4364 	  /* is a 0 with infinitely negative exponent, clamped to minimum */
4365 	  if (op&DIVIDE) {
4366 	    res->exponent=set->emin-set->digits+1;
4367 	    *status|=DEC_Clamped;
4368 	    }
4369 	  }
4370 	decFinish(res, set, &residue, status);
4371 	break;
4372 	}
4373       }
4374 
4375     /* handle 0 rhs (x/0) */
4376     if (ISZERO(rhs)) {			/* x/0 is always exceptional */
4377       if (ISZERO(lhs)) {
4378 	decNumberZero(res);		/* [after lhs test] */
4379 	*status|=DEC_Division_undefined;/* 0/0 will become NaN */
4380 	}
4381        else {
4382 	decNumberZero(res);
4383 	if (op&(REMAINDER|REMNEAR)) *status|=DEC_Invalid_operation;
4384 	 else {
4385 	  *status|=DEC_Division_by_zero; /* x/0 */
4386 	  res->bits=bits|DECINF;	 /* .. is +/- Infinity */
4387 	  }
4388 	}
4389       break;}
4390 
4391     /* handle 0 lhs (0/x) */
4392     if (ISZERO(lhs)) {			/* 0/x [x!=0] */
4393       #if DECSUBSET
4394       if (!set->extended) decNumberZero(res);
4395        else {
4396       #endif
4397 	if (op&DIVIDE) {
4398 	  residue=0;
4399 	  exponent=lhs->exponent-rhs->exponent; /* ideal exponent */
4400 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
4401 	  res->bits=bits;		/* sign as computed */
4402 	  res->exponent=exponent;	/* exponent, too */
4403 	  decFinalize(res, set, &residue, status);   /* check exponent */
4404 	  }
4405 	 else if (op&DIVIDEINT) {
4406 	  decNumberZero(res);		/* integer 0 */
4407 	  res->bits=bits;		/* sign as computed */
4408 	  }
4409 	 else {				/* a remainder */
4410 	  exponent=rhs->exponent;	/* [save in case overwrite] */
4411 	  decNumberCopy(res, lhs);	/* [zeros always fit] */
4412 	  if (exponent<res->exponent) res->exponent=exponent; /* use lower */
4413 	  }
4414       #if DECSUBSET
4415 	}
4416       #endif
4417       break;}
4418 
4419     /* Precalculate exponent.  This starts off adjusted (and hence fits */
4420     /* in 31 bits) and becomes the usual unadjusted exponent as the */
4421     /* division proceeds.  The order of evaluation is important, here, */
4422     /* to avoid wrap. */
4423     exponent=(lhs->exponent+lhs->digits)-(rhs->exponent+rhs->digits);
4424 
4425     /* If the working exponent is -ve, then some quick exits are */
4426     /* possible because the quotient is known to be <1 */
4427     /* [for REMNEAR, it needs to be < -1, as -0.5 could need work] */
4428     if (exponent<0 && !(op==DIVIDE)) {
4429       if (op&DIVIDEINT) {
4430 	decNumberZero(res);		     /* integer part is 0 */
4431 	#if DECSUBSET
4432 	if (set->extended)
4433 	#endif
4434 	  res->bits=bits;		     /* set +/- zero */
4435 	break;}
4436       /* fastpath remainders so long as the lhs has the smaller */
4437       /* (or equal) exponent */
4438       if (lhs->exponent<=rhs->exponent) {
4439 	if (op&REMAINDER || exponent<-1) {
4440 	  /* It is REMAINDER or safe REMNEAR; result is [finished */
4441 	  /* clone of] lhs  (r = x - 0*y) */
4442 	  residue=0;
4443 	  decCopyFit(res, lhs, set, &residue, status);
4444 	  decFinish(res, set, &residue, status);
4445 	  break;
4446 	  }
4447 	/* [unsafe REMNEAR drops through] */
4448 	}
4449       } /* fastpaths */
4450 
4451     /* Long (slow) division is needed; roll up the sleeves... */
4452 
4453     /* The accumulator will hold the quotient of the division. */
4454     /* If it needs to be too long for stack storage, then allocate. */
4455     acclength=D2U(reqdigits+DECDPUN);	/* in Units */
4456     if (acclength*sizeof(Unit)>sizeof(accbuff)) {
4457       /* printf("malloc dvacc %ld units\n", acclength); */
4458       allocacc=(Unit *)malloc(acclength*sizeof(Unit));
4459       if (allocacc==NULL) {		/* hopeless -- abandon */
4460 	*status|=DEC_Insufficient_storage;
4461 	break;}
4462       acc=allocacc;			/* use the allocated space */
4463       }
4464 
4465     /* var1 is the padded LHS ready for subtractions. */
4466     /* If it needs to be too long for stack storage, then allocate. */
4467     /* The maximum units needed for var1 (long subtraction) is: */
4468     /* Enough for */
4469     /*	   (rhs->digits+reqdigits-1) -- to allow full slide to right */
4470     /* or  (lhs->digits)	     -- to allow for long lhs */
4471     /* whichever is larger */
4472     /*	 +1		   -- for rounding of slide to right */
4473     /*	 +1		   -- for leading 0s */
4474     /*	 +1		   -- for pre-adjust if a remainder or DIVIDEINT */
4475     /* [Note: unused units do not participate in decUnitAddSub data] */
4476     maxdigits=rhs->digits+reqdigits-1;
4477     if (lhs->digits>maxdigits) maxdigits=lhs->digits;
4478     var1units=D2U(maxdigits)+2;
4479     /* allocate a guard unit above msu1 for REMAINDERNEAR */
4480     if (!(op&DIVIDE)) var1units++;
4481     if ((var1units+1)*sizeof(Unit)>sizeof(varbuff)) {
4482       /* printf("malloc dvvar %ld units\n", var1units+1); */
4483       varalloc=(Unit *)malloc((var1units+1)*sizeof(Unit));
4484       if (varalloc==NULL) {		/* hopeless -- abandon */
4485 	*status|=DEC_Insufficient_storage;
4486 	break;}
4487       var1=varalloc;			/* use the allocated space */
4488       }
4489 
4490     /* Extend the lhs and rhs to full long subtraction length.	The lhs */
4491     /* is truly extended into the var1 buffer, with 0 padding, so a */
4492     /* subtract in place is always possible.  The rhs (var2) has */
4493     /* virtual padding (implemented by decUnitAddSub). */
4494     /* One guard unit was allocated above msu1 for rem=rem+rem in */
4495     /* REMAINDERNEAR. */
4496     msu1=var1+var1units-1;		/* msu of var1 */
4497     source=lhs->lsu+D2U(lhs->digits)-1; /* msu of input array */
4498     for (target=msu1; source>=lhs->lsu; source--, target--) *target=*source;
4499     for (; target>=var1; target--) *target=0;
4500 
4501     /* rhs (var2) is left-aligned with var1 at the start */
4502     var2ulen=var1units;			/* rhs logical length (units) */
4503     var2units=D2U(rhs->digits);		/* rhs actual length (units) */
4504     var2=rhs->lsu;			/* -> rhs array */
4505     msu2=var2+var2units-1;		/* -> msu of var2 [never changes] */
4506     /* now set up the variables which will be used for estimating the */
4507     /* multiplication factor.  If these variables are not exact, add */
4508     /* 1 to make sure that the multiplier is never overestimated. */
4509     msu2plus=*msu2;			/* it's value .. */
4510     if (var2units>1) msu2plus++;	/* .. +1 if any more */
4511     msu2pair=(eInt)*msu2*(DECDPUNMAX+1);/* top two pair .. */
4512     if (var2units>1) {			/* .. [else treat 2nd as 0] */
4513       msu2pair+=*(msu2-1);		/* .. */
4514       if (var2units>2) msu2pair++;	/* .. +1 if any more */
4515       }
4516 
4517     /* The calculation is working in units, which may have leading zeros, */
4518     /* but the exponent was calculated on the assumption that they are */
4519     /* both left-aligned.  Adjust the exponent to compensate: add the */
4520     /* number of leading zeros in var1 msu and subtract those in var2 msu. */
4521     /* [This is actually done by counting the digits and negating, as */
4522     /* lead1=DECDPUN-digits1, and similarly for lead2.] */
4523     for (pow=&powers[1]; *msu1>=*pow; pow++) exponent--;
4524     for (pow=&powers[1]; *msu2>=*pow; pow++) exponent++;
4525 
4526     /* Now, if doing an integer divide or remainder, ensure that */
4527     /* the result will be Unit-aligned.	 To do this, shift the var1 */
4528     /* accumulator towards least if need be.  (It's much easier to */
4529     /* do this now than to reassemble the residue afterwards, if */
4530     /* doing a remainder.)  Also ensure the exponent is not negative. */
4531     if (!(op&DIVIDE)) {
4532       Unit *u;				/* work */
4533       /* save the initial 'false' padding of var1, in digits */
4534       var1initpad=(var1units-D2U(lhs->digits))*DECDPUN;
4535       /* Determine the shift to do. */
4536       if (exponent<0) cut=-exponent;
4537        else cut=DECDPUN-exponent%DECDPUN;
4538       decShiftToLeast(var1, var1units, cut);
4539       exponent+=cut;			/* maintain numerical value */
4540       var1initpad-=cut;			/* .. and reduce padding */
4541       /* clean any most-significant units which were just emptied */
4542       for (u=msu1; cut>=DECDPUN; cut-=DECDPUN, u--) *u=0;
4543       } /* align */
4544      else { /* is DIVIDE */
4545       maxexponent=lhs->exponent-rhs->exponent;	  /* save */
4546       /* optimization: if the first iteration will just produce 0, */
4547       /* preadjust to skip it [valid for DIVIDE only] */
4548       if (*msu1<*msu2) {
4549 	var2ulen--;			/* shift down */
4550 	exponent-=DECDPUN;		/* update the exponent */
4551 	}
4552       }
4553 
4554     /* ---- start the long-division loops ------------------------------ */
4555     accunits=0;				/* no units accumulated yet */
4556     accdigits=0;			/* .. or digits */
4557     accnext=acc+acclength-1;		/* -> msu of acc [NB: allows digits+1] */
4558     for (;;) {				/* outer forever loop */
4559       thisunit=0;			/* current unit assumed 0 */
4560       /* find the next unit */
4561       for (;;) {			/* inner forever loop */
4562 	/* strip leading zero units [from either pre-adjust or from */
4563 	/* subtract last time around].	Leave at least one unit. */
4564 	for (; *msu1==0 && msu1>var1; msu1--) var1units--;
4565 
4566 	if (var1units<var2ulen) break;	     /* var1 too low for subtract */
4567 	if (var1units==var2ulen) {	     /* unit-by-unit compare needed */
4568 	  /* compare the two numbers, from msu */
4569 	  const Unit *pv1, *pv2;
4570 	  Unit v2;			     /* units to compare */
4571 	  pv2=msu2;			     /* -> msu */
4572 	  for (pv1=msu1; ; pv1--, pv2--) {
4573 	    /* v1=*pv1 -- always OK */
4574 	    v2=0;			     /* assume in padding */
4575 	    if (pv2>=var2) v2=*pv2;	     /* in range */
4576 	    if (*pv1!=v2) break;	     /* no longer the same */
4577 	    if (pv1==var1) break;	     /* done; leave pv1 as is */
4578 	    }
4579 	  /* here when all inspected or a difference seen */
4580 	  if (*pv1<v2) break;		     /* var1 too low to subtract */
4581 	  if (*pv1==v2) {		     /* var1 == var2 */
4582 	    /* reach here if var1 and var2 are identical; subtraction */
4583 	    /* would increase digit by one, and the residue will be 0 so */
4584 	    /* the calculation is done; leave the loop with residue=0. */
4585 	    thisunit++;			     /* as though subtracted */
4586 	    *var1=0;			     /* set var1 to 0 */
4587 	    var1units=1;		     /* .. */
4588 	    break;  /* from inner */
4589 	    } /* var1 == var2 */
4590 	  /* *pv1>v2.  Prepare for real subtraction; the lengths are equal */
4591 	  /* Estimate the multiplier (there's always a msu1-1)... */
4592 	  /* Bring in two units of var2 to provide a good estimate. */
4593 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2pair);
4594 	  } /* lengths the same */
4595 	 else { /* var1units > var2ulen, so subtraction is safe */
4596 	  /* The var2 msu is one unit towards the lsu of the var1 msu, */
4597 	  /* so only one unit for var2 can be used. */
4598 	  mult=(Int)(((eInt)*msu1*(DECDPUNMAX+1)+*(msu1-1))/msu2plus);
4599 	  }
4600 	if (mult==0) mult=1;		     /* must always be at least 1 */
4601 	/* subtraction needed; var1 is > var2 */
4602 	thisunit=(Unit)(thisunit+mult);	     /* accumulate */
4603 	/* subtract var1-var2, into var1; only the overlap needs */
4604 	/* processing, as this is an in-place calculation */
4605 	shift=var2ulen-var2units;
4606 	#if DECTRACE
4607 	  decDumpAr('1', &var1[shift], var1units-shift);
4608 	  decDumpAr('2', var2, var2units);
4609 	  printf("m=%ld\n", -mult);
4610 	#endif
4611 	decUnitAddSub(&var1[shift], var1units-shift,
4612 		      var2, var2units, 0,
4613 		      &var1[shift], -mult);
4614 	#if DECTRACE
4615 	  decDumpAr('#', &var1[shift], var1units-shift);
4616 	#endif
4617 	/* var1 now probably has leading zeros; these are removed at the */
4618 	/* top of the inner loop. */
4619 	} /* inner loop */
4620 
4621       /* The next unit has been calculated in full; unless it's a */
4622       /* leading zero, add to acc */
4623       if (accunits!=0 || thisunit!=0) {	     /* is first or non-zero */
4624 	*accnext=thisunit;		     /* store in accumulator */
4625 	/* account exactly for the new digits */
4626 	if (accunits==0) {
4627 	  accdigits++;			     /* at least one */
4628 	  for (pow=&powers[1]; thisunit>=*pow; pow++) accdigits++;
4629 	  }
4630 	 else accdigits+=DECDPUN;
4631 	accunits++;			     /* update count */
4632 	accnext--;			     /* ready for next */
4633 	if (accdigits>reqdigits) break;	     /* have enough digits */
4634 	}
4635 
4636       /* if the residue is zero, the operation is done (unless divide */
4637       /* or divideInteger and still not enough digits yet) */
4638       if (*var1==0 && var1units==1) {	     /* residue is 0 */
4639 	if (op&(REMAINDER|REMNEAR)) break;
4640 	if ((op&DIVIDE) && (exponent<=maxexponent)) break;
4641 	/* [drop through if divideInteger] */
4642 	}
4643       /* also done enough if calculating remainder or integer */
4644       /* divide and just did the last ('units') unit */
4645       if (exponent==0 && !(op&DIVIDE)) break;
4646 
4647       /* to get here, var1 is less than var2, so divide var2 by the per- */
4648       /* Unit power of ten and go for the next digit */
4649       var2ulen--;			     /* shift down */
4650       exponent-=DECDPUN;		     /* update the exponent */
4651       } /* outer loop */
4652 
4653     /* ---- division is complete --------------------------------------- */
4654     /* here: acc      has at least reqdigits+1 of good results (or fewer */
4655     /*		      if early stop), starting at accnext+1 (its lsu) */
4656     /*	     var1     has any residue at the stopping point */
4657     /*	     accunits is the number of digits collected in acc */
4658     if (accunits==0) {		   /* acc is 0 */
4659       accunits=1;		   /* show have a unit .. */
4660       accdigits=1;		   /* .. */
4661       *accnext=0;		   /* .. whose value is 0 */
4662       }
4663      else accnext++;		   /* back to last placed */
4664     /* accnext now -> lowest unit of result */
4665 
4666     residue=0;			   /* assume no residue */
4667     if (op&DIVIDE) {
4668       /* record the presence of any residue, for rounding */
4669       if (*var1!=0 || var1units>1) residue=1;
4670        else { /* no residue */
4671 	/* Had an exact division; clean up spurious trailing 0s. */
4672 	/* There will be at most DECDPUN-1, from the final multiply, */
4673 	/* and then only if the result is non-0 (and even) and the */
4674 	/* exponent is 'loose'. */
4675 	#if DECDPUN>1
4676 	Unit lsu=*accnext;
4677 	if (!(lsu&0x01) && (lsu!=0)) {
4678 	  /* count the trailing zeros */
4679 	  Int drop=0;
4680 	  for (;; drop++) {    /* [will terminate because lsu!=0] */
4681 	    if (exponent>=maxexponent) break;	  /* don't chop real 0s */
4682 	    #if DECDPUN<=4
4683 	      if ((lsu-QUOT10(lsu, drop+1)
4684 		  *powers[drop+1])!=0) break;	  /* found non-0 digit */
4685 	    #else
4686 	      if (lsu%powers[drop+1]!=0) break;	  /* found non-0 digit */
4687 	    #endif
4688 	    exponent++;
4689 	    }
4690 	  if (drop>0) {
4691 	    accunits=decShiftToLeast(accnext, accunits, drop);
4692 	    accdigits=decGetDigits(accnext, accunits);
4693 	    accunits=D2U(accdigits);
4694 	    /* [exponent was adjusted in the loop] */
4695 	    }
4696 	  } /* neither odd nor 0 */
4697 	#endif
4698 	} /* exact divide */
4699       } /* divide */
4700      else /* op!=DIVIDE */ {
4701       /* check for coefficient overflow */
4702       if (accdigits+exponent>reqdigits) {
4703 	*status|=DEC_Division_impossible;
4704 	break;
4705 	}
4706       if (op & (REMAINDER|REMNEAR)) {
4707 	/* [Here, the exponent will be 0, because var1 was adjusted */
4708 	/* appropriately.] */
4709 	Int postshift;			     /* work */
4710 	Flag wasodd=0;			     /* integer was odd */
4711 	Unit *quotlsu;			     /* for save */
4712 	Int  quotdigits;		     /* .. */
4713 
4714 	bits=lhs->bits;			     /* remainder sign is always as lhs */
4715 
4716 	/* Fastpath when residue is truly 0 is worthwhile [and */
4717 	/* simplifies the code below] */
4718 	if (*var1==0 && var1units==1) {	     /* residue is 0 */
4719 	  Int exp=lhs->exponent;	     /* save min(exponents) */
4720 	  if (rhs->exponent<exp) exp=rhs->exponent;
4721 	  decNumberZero(res);		     /* 0 coefficient */
4722 	  #if DECSUBSET
4723 	  if (set->extended)
4724 	  #endif
4725 	  res->exponent=exp;		     /* .. with proper exponent */
4726 	  res->bits=(uByte)(bits&DECNEG);	   /* [cleaned] */
4727 	  decFinish(res, set, &residue, status);   /* might clamp */
4728 	  break;
4729 	  }
4730 	/* note if the quotient was odd */
4731 	if (*accnext & 0x01) wasodd=1;	     /* acc is odd */
4732 	quotlsu=accnext;		     /* save in case need to reinspect */
4733 	quotdigits=accdigits;		     /* .. */
4734 
4735 	/* treat the residue, in var1, as the value to return, via acc */
4736 	/* calculate the unused zero digits.  This is the smaller of: */
4737 	/*   var1 initial padding (saved above) */
4738 	/*   var2 residual padding, which happens to be given by: */
4739 	postshift=var1initpad+exponent-lhs->exponent+rhs->exponent;
4740 	/* [the 'exponent' term accounts for the shifts during divide] */
4741 	if (var1initpad<postshift) postshift=var1initpad;
4742 
4743 	/* shift var1 the requested amount, and adjust its digits */
4744 	var1units=decShiftToLeast(var1, var1units, postshift);
4745 	accnext=var1;
4746 	accdigits=decGetDigits(var1, var1units);
4747 	accunits=D2U(accdigits);
4748 
4749 	exponent=lhs->exponent;		/* exponent is smaller of lhs & rhs */
4750 	if (rhs->exponent<exponent) exponent=rhs->exponent;
4751 
4752 	/* Now correct the result if doing remainderNear; if it */
4753 	/* (looking just at coefficients) is > rhs/2, or == rhs/2 and */
4754 	/* the integer was odd then the result should be rem-rhs. */
4755 	if (op&REMNEAR) {
4756 	  Int compare, tarunits;	/* work */
4757 	  Unit *up;			/* .. */
4758 	  /* calculate remainder*2 into the var1 buffer (which has */
4759 	  /* 'headroom' of an extra unit and hence enough space) */
4760 	  /* [a dedicated 'double' loop would be faster, here] */
4761 	  tarunits=decUnitAddSub(accnext, accunits, accnext, accunits,
4762 				 0, accnext, 1);
4763 	  /* decDumpAr('r', accnext, tarunits); */
4764 
4765 	  /* Here, accnext (var1) holds tarunits Units with twice the */
4766 	  /* remainder's coefficient, which must now be compared to the */
4767 	  /* RHS.  The remainder's exponent may be smaller than the RHS's. */
4768 	  compare=decUnitCompare(accnext, tarunits, rhs->lsu, D2U(rhs->digits),
4769 				 rhs->exponent-exponent);
4770 	  if (compare==BADINT) {	     /* deep trouble */
4771 	    *status|=DEC_Insufficient_storage;
4772 	    break;}
4773 
4774 	  /* now restore the remainder by dividing by two; the lsu */
4775 	  /* is known to be even. */
4776 	  for (up=accnext; up<accnext+tarunits; up++) {
4777 	    Int half;		   /* half to add to lower unit */
4778 	    half=*up & 0x01;
4779 	    *up/=2;		   /* [shift] */
4780 	    if (!half) continue;
4781 	    *(up-1)+=(DECDPUNMAX+1)/2;
4782 	    }
4783 	  /* [accunits still describes the original remainder length] */
4784 
4785 	  if (compare>0 || (compare==0 && wasodd)) { /* adjustment needed */
4786 	    Int exp, expunits, exprem;	     /* work */
4787 	    /* This is effectively causing round-up of the quotient, */
4788 	    /* so if it was the rare case where it was full and all */
4789 	    /* nines, it would overflow and hence division-impossible */
4790 	    /* should be raised */
4791 	    Flag allnines=0;		     /* 1 if quotient all nines */
4792 	    if (quotdigits==reqdigits) {     /* could be borderline */
4793 	      for (up=quotlsu; ; up++) {
4794 		if (quotdigits>DECDPUN) {
4795 		  if (*up!=DECDPUNMAX) break;/* non-nines */
4796 		  }
4797 		 else {			     /* this is the last Unit */
4798 		  if (*up==powers[quotdigits]-1) allnines=1;
4799 		  break;
4800 		  }
4801 		quotdigits-=DECDPUN;	     /* checked those digits */
4802 		} /* up */
4803 	      } /* borderline check */
4804 	    if (allnines) {
4805 	      *status|=DEC_Division_impossible;
4806 	      break;}
4807 
4808 	    /* rem-rhs is needed; the sign will invert.	 Again, var1 */
4809 	    /* can safely be used for the working Units array. */
4810 	    exp=rhs->exponent-exponent;	     /* RHS padding needed */
4811 	    /* Calculate units and remainder from exponent. */
4812 	    expunits=exp/DECDPUN;
4813 	    exprem=exp%DECDPUN;
4814 	    /* subtract [A+B*(-m)]; the result will always be negative */
4815 	    accunits=-decUnitAddSub(accnext, accunits,
4816 				    rhs->lsu, D2U(rhs->digits),
4817 				    expunits, accnext, -(Int)powers[exprem]);
4818 	    accdigits=decGetDigits(accnext, accunits); /* count digits exactly */
4819 	    accunits=D2U(accdigits);	/* and recalculate the units for copy */
4820 	    /* [exponent is as for original remainder] */
4821 	    bits^=DECNEG;		/* flip the sign */
4822 	    }
4823 	  } /* REMNEAR */
4824 	} /* REMAINDER or REMNEAR */
4825       } /* not DIVIDE */
4826 
4827     /* Set exponent and bits */
4828     res->exponent=exponent;
4829     res->bits=(uByte)(bits&DECNEG);	     /* [cleaned] */
4830 
4831     /* Now the coefficient. */
4832     decSetCoeff(res, set, accnext, accdigits, &residue, status);
4833 
4834     decFinish(res, set, &residue, status);   /* final cleanup */
4835 
4836     #if DECSUBSET
4837     /* If a divide then strip trailing zeros if subset [after round] */
4838     if (!set->extended && (op==DIVIDE)) decTrim(res, set, 0, &dropped);
4839     #endif
4840     } while(0);				     /* end protected */
4841 
4842   if (varalloc!=NULL) free(varalloc);	/* drop any storage used */
4843   if (allocacc!=NULL) free(allocacc);	/* .. */
4844   #if DECSUBSET
4845   if (allocrhs!=NULL) free(allocrhs);	/* .. */
4846   if (alloclhs!=NULL) free(alloclhs);	/* .. */
4847   #endif
4848   return res;
4849   } /* decDivideOp */
4850 
4851 /* ------------------------------------------------------------------ */
4852 /* decMultiplyOp -- multiplication operation			      */
4853 /*								      */
4854 /*  This routine performs the multiplication C=A x B.		      */
4855 /*								      */
4856 /*   res is C, the result.  C may be A and/or B (e.g., X=X*X)	      */
4857 /*   lhs is A							      */
4858 /*   rhs is B							      */
4859 /*   set is the context						      */
4860 /*   status is the usual accumulator				      */
4861 /*								      */
4862 /* C must have space for set->digits digits.			      */
4863 /*								      */
4864 /* ------------------------------------------------------------------ */
4865 /* 'Classic' multiplication is used rather than Karatsuba, as the     */
4866 /* latter would give only a minor improvement for the short numbers   */
4867 /* expected to be handled most (and uses much more memory).	      */
4868 /*								      */
4869 /* There are two major paths here: the general-purpose ('old code')   */
4870 /* path which handles all DECDPUN values, and a fastpath version      */
4871 /* which is used if 64-bit ints are available, DECDPUN<=4, and more   */
4872 /* than two calls to decUnitAddSub would be made.		      */
4873 /*								      */
4874 /* The fastpath version lumps units together into 8-digit or 9-digit  */
4875 /* chunks, and also uses a lazy carry strategy to minimise expensive  */
4876 /* 64-bit divisions.  The chunks are then broken apart again into     */
4877 /* units for continuing processing.  Despite this overhead, the	      */
4878 /* fastpath can speed up some 16-digit operations by 10x (and much    */
4879 /* more for higher-precision calculations).			      */
4880 /*								      */
4881 /* A buffer always has to be used for the accumulator; in the	      */
4882 /* fastpath, buffers are also always needed for the chunked copies of */
4883 /* of the operand coefficients.					      */
4884 /* Static buffers are larger than needed just for multiply, to allow  */
4885 /* for calls from other operations (notably exp).		      */
4886 /* ------------------------------------------------------------------ */
4887 #define FASTMUL (DECUSE64 && DECDPUN<5)
4888 static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs,
4889 				 const decNumber *rhs, decContext *set,
4890 				 uInt *status) {
4891   Int	 accunits;		   /* Units of accumulator in use */
4892   Int	 exponent;		   /* work */
4893   Int	 residue=0;		   /* rounding residue */
4894   uByte	 bits;			   /* result sign */
4895   Unit	*acc;			   /* -> accumulator Unit array */
4896   Int	 needbytes;		   /* size calculator */
4897   void	*allocacc=NULL;		   /* -> allocated accumulator, iff allocated */
4898   Unit	accbuff[SD2U(DECBUFFER*4+1)]; /* buffer (+1 for DECBUFFER==0, */
4899 				   /* *4 for calls from other operations) */
4900   const Unit *mer, *mermsup;	   /* work */
4901   Int	madlength;		   /* Units in multiplicand */
4902   Int	shift;			   /* Units to shift multiplicand by */
4903 
4904   #if FASTMUL
4905     /* if DECDPUN is 1 or 3 work in base 10**9, otherwise */
4906     /* (DECDPUN is 2 or 4) then work in base 10**8 */
4907     #if DECDPUN & 1		   /* odd */
4908       #define FASTBASE 1000000000  /* base */
4909       #define FASTDIGS		9  /* digits in base */
4910       #define FASTLAZY	       18  /* carry resolution point [1->18] */
4911     #else
4912       #define FASTBASE	100000000
4913       #define FASTDIGS		8
4914       #define FASTLAZY	     1844  /* carry resolution point [1->1844] */
4915     #endif
4916     /* three buffers are used, two for chunked copies of the operands */
4917     /* (base 10**8 or base 10**9) and one base 2**64 accumulator with */
4918     /* lazy carry evaluation */
4919     uInt   zlhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4920     uInt  *zlhi=zlhibuff;		  /* -> lhs array */
4921     uInt  *alloclhi=NULL;		  /* -> allocated buffer, iff allocated */
4922     uInt   zrhibuff[(DECBUFFER*2+1)/8+1]; /* buffer (+1 for DECBUFFER==0) */
4923     uInt  *zrhi=zrhibuff;		  /* -> rhs array */
4924     uInt  *allocrhi=NULL;		  /* -> allocated buffer, iff allocated */
4925     uLong  zaccbuff[(DECBUFFER*2+1)/4+2]; /* buffer (+1 for DECBUFFER==0) */
4926     /* [allocacc is shared for both paths, as only one will run] */
4927     uLong *zacc=zaccbuff;	   /* -> accumulator array for exact result */
4928     #if DECDPUN==1
4929     Int	   zoff;		   /* accumulator offset */
4930     #endif
4931     uInt  *lip, *rip;		   /* item pointers */
4932     uInt  *lmsi, *rmsi;		   /* most significant items */
4933     Int	   ilhs, irhs, iacc;	   /* item counts in the arrays */
4934     Int	   lazy;		   /* lazy carry counter */
4935     uLong  lcarry;		   /* uLong carry */
4936     uInt   carry;		   /* carry (NB not uLong) */
4937     Int	   count;		   /* work */
4938     const  Unit *cup;		   /* .. */
4939     Unit  *up;			   /* .. */
4940     uLong *lp;			   /* .. */
4941     Int	   p;			   /* .. */
4942   #endif
4943 
4944   #if DECSUBSET
4945     decNumber *alloclhs=NULL;	   /* -> allocated buffer, iff allocated */
4946     decNumber *allocrhs=NULL;	   /* -> allocated buffer, iff allocated */
4947   #endif
4948 
4949   #if DECCHECK
4950   if (decCheckOperands(res, lhs, rhs, set)) return res;
4951   #endif
4952 
4953   /* precalculate result sign */
4954   bits=(uByte)((lhs->bits^rhs->bits)&DECNEG);
4955 
4956   /* handle infinities and NaNs */
4957   if (SPECIALARGS) {		   /* a special bit set */
4958     if (SPECIALARGS & (DECSNAN | DECNAN)) { /* one or two NaNs */
4959       decNaNs(res, lhs, rhs, set, status);
4960       return res;}
4961     /* one or two infinities; Infinity * 0 is invalid */
4962     if (((lhs->bits & DECINF)==0 && ISZERO(lhs))
4963       ||((rhs->bits & DECINF)==0 && ISZERO(rhs))) {
4964       *status|=DEC_Invalid_operation;
4965       return res;}
4966     decNumberZero(res);
4967     res->bits=bits|DECINF;	   /* infinity */
4968     return res;}
4969 
4970   /* For best speed, as in DMSRCN [the original Rexx numerics */
4971   /* module], use the shorter number as the multiplier (rhs) and */
4972   /* the longer as the multiplicand (lhs) to minimise the number of */
4973   /* adds (partial products) */
4974   if (lhs->digits<rhs->digits) {   /* swap... */
4975     const decNumber *hold=lhs;
4976     lhs=rhs;
4977     rhs=hold;
4978     }
4979 
4980   do {				   /* protect allocated storage */
4981     #if DECSUBSET
4982     if (!set->extended) {
4983       /* reduce operands and set lostDigits status, as needed */
4984       if (lhs->digits>set->digits) {
4985 	alloclhs=decRoundOperand(lhs, set, status);
4986 	if (alloclhs==NULL) break;
4987 	lhs=alloclhs;
4988 	}
4989       if (rhs->digits>set->digits) {
4990 	allocrhs=decRoundOperand(rhs, set, status);
4991 	if (allocrhs==NULL) break;
4992 	rhs=allocrhs;
4993 	}
4994       }
4995     #endif
4996     /* [following code does not require input rounding] */
4997 
4998     #if FASTMUL			   /* fastpath can be used */
4999     /* use the fast path if there are enough digits in the shorter */
5000     /* operand to make the setup and takedown worthwhile */
5001     #define NEEDTWO (DECDPUN*2)	   /* within two decUnitAddSub calls */
5002     if (rhs->digits>NEEDTWO) {	   /* use fastpath... */
5003       /* calculate the number of elements in each array */
5004       ilhs=(lhs->digits+FASTDIGS-1)/FASTDIGS; /* [ceiling] */
5005       irhs=(rhs->digits+FASTDIGS-1)/FASTDIGS; /* .. */
5006       iacc=ilhs+irhs;
5007 
5008       /* allocate buffers if required, as usual */
5009       needbytes=ilhs*sizeof(uInt);
5010       if (needbytes>(Int)sizeof(zlhibuff)) {
5011 	alloclhi=(uInt *)malloc(needbytes);
5012 	zlhi=alloclhi;}
5013       needbytes=irhs*sizeof(uInt);
5014       if (needbytes>(Int)sizeof(zrhibuff)) {
5015 	allocrhi=(uInt *)malloc(needbytes);
5016 	zrhi=allocrhi;}
5017 
5018       /* Allocating the accumulator space needs a special case when */
5019       /* DECDPUN=1 because when converting the accumulator to Units */
5020       /* after the multiplication each 8-byte item becomes 9 1-byte */
5021       /* units.	 Therefore iacc extra bytes are needed at the front */
5022       /* (rounded up to a multiple of 8 bytes), and the uLong */
5023       /* accumulator starts offset the appropriate number of units */
5024       /* to the right to avoid overwrite during the unchunking. */
5025       needbytes=iacc*sizeof(uLong);
5026       #if DECDPUN==1
5027       zoff=(iacc+7)/8;	      /* items to offset by */
5028       needbytes+=zoff*8;
5029       #endif
5030       if (needbytes>(Int)sizeof(zaccbuff)) {
5031 	allocacc=(uLong *)malloc(needbytes);
5032 	zacc=(uLong *)allocacc;}
5033       if (zlhi==NULL||zrhi==NULL||zacc==NULL) {
5034 	*status|=DEC_Insufficient_storage;
5035 	break;}
5036 
5037       acc=(Unit *)zacc;	      /* -> target Unit array */
5038       #if DECDPUN==1
5039       zacc+=zoff;	      /* start uLong accumulator to right */
5040       #endif
5041 
5042       /* assemble the chunked copies of the left and right sides */
5043       for (count=lhs->digits, cup=lhs->lsu, lip=zlhi; count>0; lip++)
5044 	for (p=0, *lip=0; p<FASTDIGS && count>0;
5045 	     p+=DECDPUN, cup++, count-=DECDPUN)
5046 	  *lip+=*cup*powers[p];
5047       lmsi=lip-1;     /* save -> msi */
5048       for (count=rhs->digits, cup=rhs->lsu, rip=zrhi; count>0; rip++)
5049 	for (p=0, *rip=0; p<FASTDIGS && count>0;
5050 	     p+=DECDPUN, cup++, count-=DECDPUN)
5051 	  *rip+=*cup*powers[p];
5052       rmsi=rip-1;     /* save -> msi */
5053 
5054       /* zero the accumulator */
5055       for (lp=zacc; lp<zacc+iacc; lp++) *lp=0;
5056 
5057       /* Start the multiplication */
5058       /* Resolving carries can dominate the cost of accumulating the */
5059       /* partial products, so this is only done when necessary. */
5060       /* Each uLong item in the accumulator can hold values up to */
5061       /* 2**64-1, and each partial product can be as large as */
5062       /* (10**FASTDIGS-1)**2.  When FASTDIGS=9, this can be added to */
5063       /* itself 18.4 times in a uLong without overflowing, so during */
5064       /* the main calculation resolution is carried out every 18th */
5065       /* add -- every 162 digits.  Similarly, when FASTDIGS=8, the */
5066       /* partial products can be added to themselves 1844.6 times in */
5067       /* a uLong without overflowing, so intermediate carry */
5068       /* resolution occurs only every 14752 digits.  Hence for common */
5069       /* short numbers usually only the one final carry resolution */
5070       /* occurs. */
5071       /* (The count is set via FASTLAZY to simplify experiments to */
5072       /* measure the value of this approach: a 35% improvement on a */
5073       /* [34x34] multiply.) */
5074       lazy=FASTLAZY;			     /* carry delay count */
5075       for (rip=zrhi; rip<=rmsi; rip++) {     /* over each item in rhs */
5076 	lp=zacc+(rip-zrhi);		     /* where to add the lhs */
5077 	for (lip=zlhi; lip<=lmsi; lip++, lp++) { /* over each item in lhs */
5078 	  *lp+=(uLong)(*lip)*(*rip);	     /* [this should in-line] */
5079 	  } /* lip loop */
5080 	lazy--;
5081 	if (lazy>0 && rip!=rmsi) continue;
5082 	lazy=FASTLAZY;			     /* reset delay count */
5083 	/* spin up the accumulator resolving overflows */
5084 	for (lp=zacc; lp<zacc+iacc; lp++) {
5085 	  if (*lp<FASTBASE) continue;	     /* it fits */
5086 	  lcarry=*lp/FASTBASE;		     /* top part [slow divide] */
5087 	  /* lcarry can exceed 2**32-1, so check again; this check */
5088 	  /* and occasional extra divide (slow) is well worth it, as */
5089 	  /* it allows FASTLAZY to be increased to 18 rather than 4 */
5090 	  /* in the FASTDIGS=9 case */
5091 	  if (lcarry<FASTBASE) carry=(uInt)lcarry;  /* [usual] */
5092 	   else { /* two-place carry [fairly rare] */
5093 	    uInt carry2=(uInt)(lcarry/FASTBASE);    /* top top part */
5094 	    *(lp+2)+=carry2;			    /* add to item+2 */
5095 	    *lp-=((uLong)FASTBASE*FASTBASE*carry2); /* [slow] */
5096 	    carry=(uInt)(lcarry-((uLong)FASTBASE*carry2)); /* [inline] */
5097 	    }
5098 	  *(lp+1)+=carry;		     /* add to item above [inline] */
5099 	  *lp-=((uLong)FASTBASE*carry);	     /* [inline] */
5100 	  } /* carry resolution */
5101 	} /* rip loop */
5102 
5103       /* The multiplication is complete; time to convert back into */
5104       /* units.	 This can be done in-place in the accumulator and in */
5105       /* 32-bit operations, because carries were resolved after the */
5106       /* final add.  This needs N-1 divides and multiplies for */
5107       /* each item in the accumulator (which will become up to N */
5108       /* units, where 2<=N<=9). */
5109       for (lp=zacc, up=acc; lp<zacc+iacc; lp++) {
5110 	uInt item=(uInt)*lp;		     /* decapitate to uInt */
5111 	for (p=0; p<FASTDIGS-DECDPUN; p+=DECDPUN, up++) {
5112 	  uInt part=item/(DECDPUNMAX+1);
5113 	  *up=(Unit)(item-(part*(DECDPUNMAX+1)));
5114 	  item=part;
5115 	  } /* p */
5116 	*up=(Unit)item; up++;		     /* [final needs no division] */
5117 	} /* lp */
5118       accunits=up-acc;			     /* count of units */
5119       }
5120      else { /* here to use units directly, without chunking ['old code'] */
5121     #endif
5122 
5123       /* if accumulator will be too long for local storage, then allocate */
5124       acc=accbuff;		   /* -> assume buffer for accumulator */
5125       needbytes=(D2U(lhs->digits)+D2U(rhs->digits))*sizeof(Unit);
5126       if (needbytes>(Int)sizeof(accbuff)) {
5127 	allocacc=(Unit *)malloc(needbytes);
5128 	if (allocacc==NULL) {*status|=DEC_Insufficient_storage; break;}
5129 	acc=(Unit *)allocacc;		     /* use the allocated space */
5130 	}
5131 
5132       /* Now the main long multiplication loop */
5133       /* Unlike the equivalent in the IBM Java implementation, there */
5134       /* is no advantage in calculating from msu to lsu.  So, do it */
5135       /* by the book, as it were. */
5136       /* Each iteration calculates ACC=ACC+MULTAND*MULT */
5137       accunits=1;		   /* accumulator starts at '0' */
5138       *acc=0;			   /* .. (lsu=0) */
5139       shift=0;			   /* no multiplicand shift at first */
5140       madlength=D2U(lhs->digits);  /* this won't change */
5141       mermsup=rhs->lsu+D2U(rhs->digits); /* -> msu+1 of multiplier */
5142 
5143       for (mer=rhs->lsu; mer<mermsup; mer++) {
5144 	/* Here, *mer is the next Unit in the multiplier to use */
5145 	/* If non-zero [optimization] add it... */
5146 	if (*mer!=0) accunits=decUnitAddSub(&acc[shift], accunits-shift,
5147 					    lhs->lsu, madlength, 0,
5148 					    &acc[shift], *mer)
5149 					    + shift;
5150 	 else { /* extend acc with a 0; it will be used shortly */
5151 	  *(acc+accunits)=0;	   /* [this avoids length of <=0 later] */
5152 	  accunits++;
5153 	  }
5154 	/* multiply multiplicand by 10**DECDPUN for next Unit to left */
5155 	shift++;		   /* add this for 'logical length' */
5156 	} /* n */
5157     #if FASTMUL
5158       } /* unchunked units */
5159     #endif
5160     /* common end-path */
5161     #if DECTRACE
5162       decDumpAr('*', acc, accunits);	     /* Show exact result */
5163     #endif
5164 
5165     /* acc now contains the exact result of the multiplication, */
5166     /* possibly with a leading zero unit; build the decNumber from */
5167     /* it, noting if any residue */
5168     res->bits=bits;			     /* set sign */
5169     res->digits=decGetDigits(acc, accunits); /* count digits exactly */
5170 
5171     /* There can be a 31-bit wrap in calculating the exponent. */
5172     /* This can only happen if both input exponents are negative and */
5173     /* both their magnitudes are large.	 If there was a wrap, set a */
5174     /* safe very negative exponent, from which decFinalize() will */
5175     /* raise a hard underflow shortly. */
5176     exponent=lhs->exponent+rhs->exponent;    /* calculate exponent */
5177     if (lhs->exponent<0 && rhs->exponent<0 && exponent>0)
5178       exponent=-2*DECNUMMAXE;		     /* force underflow */
5179     res->exponent=exponent;		     /* OK to overwrite now */
5180 
5181 
5182     /* Set the coefficient.  If any rounding, residue records */
5183     decSetCoeff(res, set, acc, res->digits, &residue, status);
5184     decFinish(res, set, &residue, status);   /* final cleanup */
5185     } while(0);				/* end protected */
5186 
5187   if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
5188   #if DECSUBSET
5189   if (allocrhs!=NULL) free(allocrhs);	/* .. */
5190   if (alloclhs!=NULL) free(alloclhs);	/* .. */
5191   #endif
5192   #if FASTMUL
5193   if (allocrhi!=NULL) free(allocrhi);	/* .. */
5194   if (alloclhi!=NULL) free(alloclhi);	/* .. */
5195   #endif
5196   return res;
5197   } /* decMultiplyOp */
5198 
5199 /* ------------------------------------------------------------------ */
5200 /* decExpOp -- effect exponentiation				      */
5201 /*								      */
5202 /*   This computes C = exp(A)					      */
5203 /*								      */
5204 /*   res is C, the result.  C may be A				      */
5205 /*   rhs is A							      */
5206 /*   set is the context; note that rounding mode has no effect	      */
5207 /*								      */
5208 /* C must have space for set->digits digits. status is updated but    */
5209 /* not set.							      */
5210 /*								      */
5211 /* Restrictions:						      */
5212 /*								      */
5213 /*   digits, emax, and -emin in the context must be less than	      */
5214 /*   2*DEC_MAX_MATH (1999998), and the rhs must be within these	      */
5215 /*   bounds or a zero.	This is an internal routine, so these	      */
5216 /*   restrictions are contractual and not enforced.		      */
5217 /*								      */
5218 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5219 /* almost always be correctly rounded, but may be up to 1 ulp in      */
5220 /* error in rare cases.						      */
5221 /*								      */
5222 /* Finite results will always be full precision and Inexact, except   */
5223 /* when A is a zero or -Infinity (giving 1 or 0 respectively).	      */
5224 /* ------------------------------------------------------------------ */
5225 /* This approach used here is similar to the algorithm described in   */
5226 /*								      */
5227 /*   Variable Precision Exponential Function, T. E. Hull and	      */
5228 /*   A. Abrham, ACM Transactions on Mathematical Software, Vol 12 #2, */
5229 /*   pp79-91, ACM, June 1986.					      */
5230 /*								      */
5231 /* with the main difference being that the iterations in the series   */
5232 /* evaluation are terminated dynamically (which does not require the  */
5233 /* extra variable-precision variables which are expensive in this     */
5234 /* context).							      */
5235 /*								      */
5236 /* The error analysis in Hull & Abrham's paper applies except for the */
5237 /* round-off error accumulation during the series evaluation.  This   */
5238 /* code does not precalculate the number of iterations and so cannot  */
5239 /* use Horner's scheme.	 Instead, the accumulation is done at double- */
5240 /* precision, which ensures that the additions of the terms are exact */
5241 /* and do not accumulate round-off (and any round-off errors in the   */
5242 /* terms themselves move 'to the right' faster than they can	      */
5243 /* accumulate).	 This code also extends the calculation by allowing,  */
5244 /* in the spirit of other decNumber operators, the input to be more   */
5245 /* precise than the result (the precision used is based on the more   */
5246 /* precise of the input or requested result).			      */
5247 /*								      */
5248 /* Implementation notes:					      */
5249 /*								      */
5250 /* 1. This is separated out as decExpOp so it can be called from      */
5251 /*    other Mathematical functions (notably Ln) with a wider range    */
5252 /*    than normal.  In particular, it can handle the slightly wider   */
5253 /*    (double) range needed by Ln (which has to be able to calculate  */
5254 /*    exp(-x) where x can be the tiniest number (Ntiny).	      */
5255 /*								      */
5256 /* 2. Normalizing x to be <=0.1 (instead of <=1) reduces loop	      */
5257 /*    iterations by appoximately a third with additional (although    */
5258 /*    diminishing) returns as the range is reduced to even smaller    */
5259 /*    fractions.  However, h (the power of 10 used to correct the     */
5260 /*    result at the end, see below) must be kept <=8 as otherwise     */
5261 /*    the final result cannot be computed.  Hence the leverage is a   */
5262 /*    sliding value (8-h), where potentially the range is reduced     */
5263 /*    more for smaller values.					      */
5264 /*								      */
5265 /*    The leverage that can be applied in this way is severely	      */
5266 /*    limited by the cost of the raise-to-the power at the end,	      */
5267 /*    which dominates when the number of iterations is small (less    */
5268 /*    than ten) or when rhs is short.  As an example, the adjustment  */
5269 /*    x**10,000,000 needs 31 multiplications, all but one full-width. */
5270 /*								      */
5271 /* 3. The restrictions (especially precision) could be raised with    */
5272 /*    care, but the full decNumber range seems very hard within the   */
5273 /*    32-bit limits.						      */
5274 /*								      */
5275 /* 4. The working precisions for the static buffers are twice the     */
5276 /*    obvious size to allow for calls from decNumberPower.	      */
5277 /* ------------------------------------------------------------------ */
5278 decNumber * decExpOp(decNumber *res, const decNumber *rhs,
5279 			 decContext *set, uInt *status) {
5280   uInt ignore=0;		   /* working status */
5281   Int h;			   /* adjusted exponent for 0.xxxx */
5282   Int p;			   /* working precision */
5283   Int residue;			   /* rounding residue */
5284   uInt needbytes;		   /* for space calculations */
5285   const decNumber *x=rhs;	   /* (may point to safe copy later) */
5286   decContext aset, tset, dset;	   /* working contexts */
5287   Int comp;			   /* work */
5288 
5289   /* the argument is often copied to normalize it, so (unusually) it */
5290   /* is treated like other buffers, using DECBUFFER, +1 in case */
5291   /* DECBUFFER is 0 */
5292   decNumber bufr[D2N(DECBUFFER*2+1)];
5293   decNumber *allocrhs=NULL;	   /* non-NULL if rhs buffer allocated */
5294 
5295   /* the working precision will be no more than set->digits+8+1 */
5296   /* so for on-stack buffers DECBUFFER+9 is used, +1 in case DECBUFFER */
5297   /* is 0 (and twice that for the accumulator) */
5298 
5299   /* buffer for t, term (working precision plus) */
5300   decNumber buft[D2N(DECBUFFER*2+9+1)];
5301   decNumber *allocbuft=NULL;	   /* -> allocated buft, iff allocated */
5302   decNumber *t=buft;		   /* term */
5303   /* buffer for a, accumulator (working precision * 2), at least 9 */
5304   decNumber bufa[D2N(DECBUFFER*4+18+1)];
5305   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
5306   decNumber *a=bufa;		   /* accumulator */
5307   /* decNumber for the divisor term; this needs at most 9 digits */
5308   /* and so can be fixed size [16 so can use standard context] */
5309   decNumber bufd[D2N(16)];
5310   decNumber *d=bufd;		   /* divisor */
5311   decNumber numone;		   /* constant 1 */
5312 
5313   #if DECCHECK
5314   Int iterations=0;		   /* for later sanity check */
5315   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5316   #endif
5317 
5318   do {					/* protect allocated storage */
5319     if (SPECIALARG) {			/* handle infinities and NaNs */
5320       if (decNumberIsInfinite(rhs)) {	/* an infinity */
5321 	if (decNumberIsNegative(rhs))	/* -Infinity -> +0 */
5322 	  decNumberZero(res);
5323 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
5324 	}
5325        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5326       break;}
5327 
5328     if (ISZERO(rhs)) {			/* zeros -> exact 1 */
5329       decNumberZero(res);		/* make clean 1 */
5330       *res->lsu=1;			/* .. */
5331       break;}				/* [no status to set] */
5332 
5333     /* e**x when 0 < x < 0.66 is < 1+3x/2, hence can fast-path */
5334     /* positive and negative tiny cases which will result in inexact */
5335     /* 1.  This also allows the later add-accumulate to always be */
5336     /* exact (because its length will never be more than twice the */
5337     /* working precision). */
5338     /* The comparator (tiny) needs just one digit, so use the */
5339     /* decNumber d for it (reused as the divisor, etc., below); its */
5340     /* exponent is such that if x is positive it will have */
5341     /* set->digits-1 zeros between the decimal point and the digit, */
5342     /* which is 4, and if x is negative one more zero there as the */
5343     /* more precise result will be of the form 0.9999999 rather than */
5344     /* 1.0000001.  Hence, tiny will be 0.0000004  if digits=7 and x>0 */
5345     /* or 0.00000004 if digits=7 and x<0.  If RHS not larger than */
5346     /* this then the result will be 1.000000 */
5347     decNumberZero(d);			/* clean */
5348     *d->lsu=4;				/* set 4 .. */
5349     d->exponent=-set->digits;		/* * 10**(-d) */
5350     if (decNumberIsNegative(rhs)) d->exponent--;  /* negative case */
5351     comp=decCompare(d, rhs, 1);		/* signless compare */
5352     if (comp==BADINT) {
5353       *status|=DEC_Insufficient_storage;
5354       break;}
5355     if (comp>=0) {			/* rhs < d */
5356       Int shift=set->digits-1;
5357       decNumberZero(res);		/* set 1 */
5358       *res->lsu=1;			/* .. */
5359       res->digits=decShiftToMost(res->lsu, 1, shift);
5360       res->exponent=-shift;		     /* make 1.0000... */
5361       *status|=DEC_Inexact | DEC_Rounded;    /* .. inexactly */
5362       break;} /* tiny */
5363 
5364     /* set up the context to be used for calculating a, as this is */
5365     /* used on both paths below */
5366     decContextDefault(&aset, DEC_INIT_DECIMAL64);
5367     /* accumulator bounds are as requested (could underflow) */
5368     aset.emax=set->emax;		/* usual bounds */
5369     aset.emin=set->emin;		/* .. */
5370     aset.clamp=0;			/* and no concrete format */
5371 
5372     /* calculate the adjusted (Hull & Abrham) exponent (where the */
5373     /* decimal point is just to the left of the coefficient msd) */
5374     h=rhs->exponent+rhs->digits;
5375     /* if h>8 then 10**h cannot be calculated safely; however, when */
5376     /* h=8 then exp(|rhs|) will be at least exp(1E+7) which is at */
5377     /* least 6.59E+4342944, so (due to the restriction on Emax/Emin) */
5378     /* overflow (or underflow to 0) is guaranteed -- so this case can */
5379     /* be handled by simply forcing the appropriate excess */
5380     if (h>8) {				/* overflow/underflow */
5381       /* set up here so Power call below will over or underflow to */
5382       /* zero; set accumulator to either 2 or 0.02 */
5383       /* [stack buffer for a is always big enough for this] */
5384       decNumberZero(a);
5385       *a->lsu=2;			/* not 1 but < exp(1) */
5386       if (decNumberIsNegative(rhs)) a->exponent=-2; /* make 0.02 */
5387       h=8;				/* clamp so 10**h computable */
5388       p=9;				/* set a working precision */
5389       }
5390      else {				/* h<=8 */
5391       Int maxlever=(rhs->digits>8?1:0);
5392       /* [could/should increase this for precisions >40 or so, too] */
5393 
5394       /* if h is 8, cannot normalize to a lower upper limit because */
5395       /* the final result will not be computable (see notes above), */
5396       /* but leverage can be applied whenever h is less than 8. */
5397       /* Apply as much as possible, up to a MAXLEVER digits, which */
5398       /* sets the tradeoff against the cost of the later a**(10**h). */
5399       /* As h is increased, the working precision below also */
5400       /* increases to compensate for the "constant digits at the */
5401       /* front" effect. */
5402       Int lever=MINI(8-h, maxlever);	/* leverage attainable */
5403       Int use=-rhs->digits-lever;	/* exponent to use for RHS */
5404       h+=lever;				/* apply leverage selected */
5405       if (h<0) {			/* clamp */
5406 	use+=h;				/* [may end up subnormal] */
5407 	h=0;
5408 	}
5409       /* Take a copy of RHS if it needs normalization (true whenever x>=1) */
5410       if (rhs->exponent!=use) {
5411 	decNumber *newrhs=bufr;		/* assume will fit on stack */
5412 	needbytes=sizeof(decNumber)+(D2U(rhs->digits)-1)*sizeof(Unit);
5413 	if (needbytes>sizeof(bufr)) {	/* need malloc space */
5414 	  allocrhs=(decNumber *)malloc(needbytes);
5415 	  if (allocrhs==NULL) {		/* hopeless -- abandon */
5416 	    *status|=DEC_Insufficient_storage;
5417 	    break;}
5418 	  newrhs=allocrhs;		/* use the allocated space */
5419 	  }
5420 	decNumberCopy(newrhs, rhs);	/* copy to safe space */
5421 	newrhs->exponent=use;		/* normalize; now <1 */
5422 	x=newrhs;			/* ready for use */
5423 	/* decNumberShow(x); */
5424 	}
5425 
5426       /* Now use the usual power series to evaluate exp(x).  The */
5427       /* series starts as 1 + x + x^2/2 ... so prime ready for the */
5428       /* third term by setting the term variable t=x, the accumulator */
5429       /* a=1, and the divisor d=2. */
5430 
5431       /* First determine the working precision.	 From Hull & Abrham */
5432       /* this is set->digits+h+2.  However, if x is 'over-precise' we */
5433       /* need to allow for all its digits to potentially participate */
5434       /* (consider an x where all the excess digits are 9s) so in */
5435       /* this case use x->digits+h+2 */
5436       p=MAXI(x->digits, set->digits)+h+2;    /* [h<=8] */
5437 
5438       /* a and t are variable precision, and depend on p, so space */
5439       /* must be allocated for them if necessary */
5440 
5441       /* the accumulator needs to be able to hold 2p digits so that */
5442       /* the additions on the second and subsequent iterations are */
5443       /* sufficiently exact. */
5444       needbytes=sizeof(decNumber)+(D2U(p*2)-1)*sizeof(Unit);
5445       if (needbytes>sizeof(bufa)) {	/* need malloc space */
5446 	allocbufa=(decNumber *)malloc(needbytes);
5447 	if (allocbufa==NULL) {		/* hopeless -- abandon */
5448 	  *status|=DEC_Insufficient_storage;
5449 	  break;}
5450 	a=allocbufa;			/* use the allocated space */
5451 	}
5452       /* the term needs to be able to hold p digits (which is */
5453       /* guaranteed to be larger than x->digits, so the initial copy */
5454       /* is safe); it may also be used for the raise-to-power */
5455       /* calculation below, which needs an extra two digits */
5456       needbytes=sizeof(decNumber)+(D2U(p+2)-1)*sizeof(Unit);
5457       if (needbytes>sizeof(buft)) {	/* need malloc space */
5458 	allocbuft=(decNumber *)malloc(needbytes);
5459 	if (allocbuft==NULL) {		/* hopeless -- abandon */
5460 	  *status|=DEC_Insufficient_storage;
5461 	  break;}
5462 	t=allocbuft;			/* use the allocated space */
5463 	}
5464 
5465       decNumberCopy(t, x);		/* term=x */
5466       decNumberZero(a); *a->lsu=1;	/* accumulator=1 */
5467       decNumberZero(d); *d->lsu=2;	/* divisor=2 */
5468       decNumberZero(&numone); *numone.lsu=1; /* constant 1 for increment */
5469 
5470       /* set up the contexts for calculating a, t, and d */
5471       decContextDefault(&tset, DEC_INIT_DECIMAL64);
5472       dset=tset;
5473       /* accumulator bounds are set above, set precision now */
5474       aset.digits=p*2;			/* double */
5475       /* term bounds avoid any underflow or overflow */
5476       tset.digits=p;
5477       tset.emin=DEC_MIN_EMIN;		/* [emax is plenty] */
5478       /* [dset.digits=16, etc., are sufficient] */
5479 
5480       /* finally ready to roll */
5481       for (;;) {
5482 	#if DECCHECK
5483 	iterations++;
5484 	#endif
5485 	/* only the status from the accumulation is interesting */
5486 	/* [but it should remain unchanged after first add] */
5487 	decAddOp(a, a, t, &aset, 0, status);	       /* a=a+t */
5488 	decMultiplyOp(t, t, x, &tset, &ignore);	       /* t=t*x */
5489 	decDivideOp(t, t, d, &tset, DIVIDE, &ignore);  /* t=t/d */
5490 	/* the iteration ends when the term cannot affect the result, */
5491 	/* if rounded to p digits, which is when its value is smaller */
5492 	/* than the accumulator by p+1 digits.	There must also be */
5493 	/* full precision in a. */
5494 	if (((a->digits+a->exponent)>=(t->digits+t->exponent+p+1))
5495 	    && (a->digits>=p)) break;
5496 	decAddOp(d, d, &numone, &dset, 0, &ignore);    /* d=d+1 */
5497 	} /* iterate */
5498 
5499       #if DECCHECK
5500       /* just a sanity check; comment out test to show always */
5501       if (iterations>p+3)
5502 	printf("Exp iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5503 	       iterations, *status, p, x->digits);
5504       #endif
5505       } /* h<=8 */
5506 
5507     /* apply postconditioning: a=a**(10**h) -- this is calculated */
5508     /* at a slightly higher precision than Hull & Abrham suggest */
5509     if (h>0) {
5510       Int seenbit=0;		   /* set once a 1-bit is seen */
5511       Int i;			   /* counter */
5512       Int n=powers[h];		   /* always positive */
5513       aset.digits=p+2;		   /* sufficient precision */
5514       /* avoid the overhead and many extra digits of decNumberPower */
5515       /* as all that is needed is the short 'multipliers' loop; here */
5516       /* accumulate the answer into t */
5517       decNumberZero(t); *t->lsu=1; /* acc=1 */
5518       for (i=1;;i++){		   /* for each bit [top bit ignored] */
5519 	/* abandon if have had overflow or terminal underflow */
5520 	if (*status & (DEC_Overflow|DEC_Underflow)) { /* interesting? */
5521 	  if (*status&DEC_Overflow || ISZERO(t)) break;}
5522 	n=n<<1;			   /* move next bit to testable position */
5523 	if (n<0) {		   /* top bit is set */
5524 	  seenbit=1;		   /* OK, have a significant bit */
5525 	  decMultiplyOp(t, t, a, &aset, status); /* acc=acc*x */
5526 	  }
5527 	if (i==31) break;	   /* that was the last bit */
5528 	if (!seenbit) continue;	   /* no need to square 1 */
5529 	decMultiplyOp(t, t, t, &aset, status); /* acc=acc*acc [square] */
5530 	} /*i*/ /* 32 bits */
5531       /* decNumberShow(t); */
5532       a=t;			   /* and carry on using t instead of a */
5533       }
5534 
5535     /* Copy and round the result to res */
5536     residue=1;				/* indicate dirt to right .. */
5537     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
5538     aset.digits=set->digits;		/* [use default rounding] */
5539     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5540     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
5541     } while(0);				/* end protected */
5542 
5543   if (allocrhs !=NULL) free(allocrhs);	/* drop any storage used */
5544   if (allocbufa!=NULL) free(allocbufa); /* .. */
5545   if (allocbuft!=NULL) free(allocbuft); /* .. */
5546   /* [status is handled by caller] */
5547   return res;
5548   } /* decExpOp */
5549 
5550 /* ------------------------------------------------------------------ */
5551 /* Initial-estimate natural logarithm table			      */
5552 /*								      */
5553 /*   LNnn -- 90-entry 16-bit table for values from .10 through .99.   */
5554 /*	     The result is a 4-digit encode of the coefficient (c=the */
5555 /*	     top 14 bits encoding 0-9999) and a 2-digit encode of the */
5556 /*	     exponent (e=the bottom 2 bits encoding 0-3)	      */
5557 /*								      */
5558 /*	     The resulting value is given by:			      */
5559 /*								      */
5560 /*	       v = -c * 10**(-e-3)				      */
5561 /*								      */
5562 /*	     where e and c are extracted from entry k = LNnn[x-10]    */
5563 /*	     where x is truncated (NB) into the range 10 through 99,  */
5564 /*	     and then c = k>>2 and e = k&3.			      */
5565 /* ------------------------------------------------------------------ */
5566 const uShort LNnn[90]={9016,  8652,  8316,  8008,  7724,  7456,	 7208,
5567   6972,	 6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,	 5312,
5568   5164,	 5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,	 4032,
5569  39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5570  29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5571  22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5572  15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5573  10197,	 9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,	 5801,
5574   5341,	 4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5575  10130,	 6046, 20055};
5576 
5577 /* ------------------------------------------------------------------ */
5578 /* decLnOp -- effect natural logarithm				      */
5579 /*								      */
5580 /*   This computes C = ln(A)					      */
5581 /*								      */
5582 /*   res is C, the result.  C may be A				      */
5583 /*   rhs is A							      */
5584 /*   set is the context; note that rounding mode has no effect	      */
5585 /*								      */
5586 /* C must have space for set->digits digits.			      */
5587 /*								      */
5588 /* Notable cases:						      */
5589 /*   A<0 -> Invalid						      */
5590 /*   A=0 -> -Infinity (Exact)					      */
5591 /*   A=+Infinity -> +Infinity (Exact)				      */
5592 /*   A=1 exactly -> 0 (Exact)					      */
5593 /*								      */
5594 /* Restrictions (as for Exp):					      */
5595 /*								      */
5596 /*   digits, emax, and -emin in the context must be less than	      */
5597 /*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
5598 /*   bounds or a zero.	This is an internal routine, so these	      */
5599 /*   restrictions are contractual and not enforced.		      */
5600 /*								      */
5601 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5602 /* almost always be correctly rounded, but may be up to 1 ulp in      */
5603 /* error in rare cases.						      */
5604 /* ------------------------------------------------------------------ */
5605 /* The result is calculated using Newton's method, with each	      */
5606 /* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
5607 /* Epperson 1989.						      */
5608 /*								      */
5609 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5610 /* This has to be calculated at the sum of the precision of x and the */
5611 /* working precision.						      */
5612 /*								      */
5613 /* Implementation notes:					      */
5614 /*								      */
5615 /* 1. This is separated out as decLnOp so it can be called from	      */
5616 /*    other Mathematical functions (e.g., Log 10) with a wider range  */
5617 /*    than normal.  In particular, it can handle the slightly wider   */
5618 /*    (+9+2) range needed by a power function.			      */
5619 /*								      */
5620 /* 2. The speed of this function is about 10x slower than exp, as     */
5621 /*    it typically needs 4-6 iterations for short numbers, and the    */
5622 /*    extra precision needed adds a squaring effect, twice.	      */
5623 /*								      */
5624 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
5625 /*    as these are common requests.  ln(10) is used by log10(x).      */
5626 /*								      */
5627 /* 4. An iteration might be saved by widening the LNnn table, and     */
5628 /*    would certainly save at least one if it were made ten times     */
5629 /*    bigger, too (for truncated fractions 0.100 through 0.999).      */
5630 /*    However, for most practical evaluations, at least four or five  */
5631 /*    iterations will be neede -- so this would only speed up by      */
5632 /*    20-25% and that probably does not justify increasing the table  */
5633 /*    size.							      */
5634 /*								      */
5635 /* 5. The static buffers are larger than might be expected to allow   */
5636 /*    for calls from decNumberPower.				      */
5637 /* ------------------------------------------------------------------ */
5638 decNumber * decLnOp(decNumber *res, const decNumber *rhs,
5639 		    decContext *set, uInt *status) {
5640   uInt ignore=0;		   /* working status accumulator */
5641   uInt needbytes;		   /* for space calculations */
5642   Int residue;			   /* rounding residue */
5643   Int r;			   /* rhs=f*10**r [see below] */
5644   Int p;			   /* working precision */
5645   Int pp;			   /* precision for iteration */
5646   Int t;			   /* work */
5647 
5648   /* buffers for a (accumulator, typically precision+2) and b */
5649   /* (adjustment calculator, same size) */
5650   decNumber bufa[D2N(DECBUFFER+12)];
5651   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
5652   decNumber *a=bufa;		   /* accumulator/work */
5653   decNumber bufb[D2N(DECBUFFER*2+2)];
5654   decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
5655   decNumber *b=bufb;		   /* adjustment/work */
5656 
5657   decNumber  numone;		   /* constant 1 */
5658   decNumber  cmp;		   /* work */
5659   decContext aset, bset;	   /* working contexts */
5660 
5661   #if DECCHECK
5662   Int iterations=0;		   /* for later sanity check */
5663   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5664   #endif
5665 
5666   do {					/* protect allocated storage */
5667     if (SPECIALARG) {			/* handle infinities and NaNs */
5668       if (decNumberIsInfinite(rhs)) {	/* an infinity */
5669 	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
5670 	  *status|=DEC_Invalid_operation;
5671 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
5672 	}
5673        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5674       break;}
5675 
5676     if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
5677       decNumberZero(res);		/* make clean */
5678       res->bits=DECINF|DECNEG;		/* set - infinity */
5679       break;}				/* [no status to set] */
5680 
5681     /* Non-zero negatives are bad... */
5682     if (decNumberIsNegative(rhs)) {	/* -x -> error */
5683       *status|=DEC_Invalid_operation;
5684       break;}
5685 
5686     /* Here, rhs is positive, finite, and in range */
5687 
5688     /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5689     if (rhs->exponent==0 && set->digits<=40) {
5690       #if DECDPUN==1
5691       if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5692       #else
5693       if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
5694       #endif
5695 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5696 	#define LN10 "2.302585092994045684017991454684364207601"
5697 	decNumberFromString(res, LN10, &aset);
5698 	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5699 	break;}
5700       if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5701 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5702 	#define LN2 "0.6931471805599453094172321214581765680755"
5703 	decNumberFromString(res, LN2, &aset);
5704 	*status|=(DEC_Inexact | DEC_Rounded);
5705 	break;}
5706       } /* integer and short */
5707 
5708     /* Determine the working precision.	 This is normally the */
5709     /* requested precision + 2, with a minimum of 9.  However, if */
5710     /* the rhs is 'over-precise' then allow for all its digits to */
5711     /* potentially participate (consider an rhs where all the excess */
5712     /* digits are 9s) so in this case use rhs->digits+2. */
5713     p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5714 
5715     /* Allocate space for the accumulator and the high-precision */
5716     /* adjustment calculator, if necessary.  The accumulator must */
5717     /* be able to hold p digits, and the adjustment up to */
5718     /* rhs->digits+p digits.  They are also made big enough for 16 */
5719     /* digits so that they can be used for calculating the initial */
5720     /* estimate. */
5721     needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5722     if (needbytes>sizeof(bufa)) {     /* need malloc space */
5723       allocbufa=(decNumber *)malloc(needbytes);
5724       if (allocbufa==NULL) {	      /* hopeless -- abandon */
5725 	*status|=DEC_Insufficient_storage;
5726 	break;}
5727       a=allocbufa;		      /* use the allocated space */
5728       }
5729     pp=p+rhs->digits;
5730     needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5731     if (needbytes>sizeof(bufb)) {     /* need malloc space */
5732       allocbufb=(decNumber *)malloc(needbytes);
5733       if (allocbufb==NULL) {	      /* hopeless -- abandon */
5734 	*status|=DEC_Insufficient_storage;
5735 	break;}
5736       b=allocbufb;		      /* use the allocated space */
5737       }
5738 
5739     /* Prepare an initial estimate in acc. Calculate this by */
5740     /* considering the coefficient of x to be a normalized fraction, */
5741     /* f, with the decimal point at far left and multiplied by */
5742     /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
5743     /*	 ln(x) = ln(f) + ln(10)*r */
5744     /* Get the initial estimate for ln(f) from a small lookup */
5745     /* table (see above) indexed by the first two digits of f, */
5746     /* truncated. */
5747 
5748     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5749     r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
5750     decNumberFromInt32(a, r);		/* a=r */
5751     decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
5752     b->exponent=-6;			/*  .. */
5753     decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
5754     /* now get top two digits of rhs into b by simple truncate and */
5755     /* force to integer */
5756     residue=0;				/* (no residue) */
5757     aset.digits=2; aset.round=DEC_ROUND_DOWN;
5758     decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5759     b->exponent=0;			/* make integer */
5760     t=decGetInt(b);			/* [cannot fail] */
5761     if (t<10) t=X10(t);			/* adjust single-digit b */
5762     t=LNnn[t-10];			/* look up ln(b) */
5763     decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
5764     b->exponent=-(t&3)-3;		/* set exponent */
5765     b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
5766     aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5767     decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5768     /* the initial estimate is now in a, with up to 4 digits correct. */
5769     /* When rhs is at or near Nmax the estimate will be low, so we */
5770     /* will approach it from below, avoiding overflow when calling exp. */
5771 
5772     decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
5773 
5774     /* accumulator bounds are as requested (could underflow, but */
5775     /* cannot overflow) */
5776     aset.emax=set->emax;
5777     aset.emin=set->emin;
5778     aset.clamp=0;			/* no concrete format */
5779     /* set up a context to be used for the multiply and subtract */
5780     bset=aset;
5781     bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
5782     bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
5783 					/* [see decExpOp call below] */
5784     /* for each iteration double the number of digits to calculate, */
5785     /* up to a maximum of p */
5786     pp=9;				/* initial precision */
5787     /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5788     /* 34+2, which is ideal for standard-sized numbers] */
5789     aset.digits=pp;			/* working context */
5790     bset.digits=pp+rhs->digits;		/* wider context */
5791     for (;;) {				/* iterate */
5792       #if DECCHECK
5793       iterations++;
5794       if (iterations>24) break;		/* consider 9 * 2**24 */
5795       #endif
5796       /* calculate the adjustment (exp(-a)*x-1) into b.	 This is a */
5797       /* catastrophic subtraction but it really is the difference */
5798       /* from 1 that is of interest. */
5799       /* Use the internal entry point to Exp as it allows the double */
5800       /* range for calculating exp(-a) when a is the tiniest subnormal. */
5801       a->bits^=DECNEG;			/* make -a */
5802       decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
5803       a->bits^=DECNEG;			/* restore sign of a */
5804       /* now multiply by rhs and subtract 1, at the wider precision */
5805       decMultiplyOp(b, b, rhs, &bset, &ignore);	       /* b=b*rhs */
5806       decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5807 
5808       /* the iteration ends when the adjustment cannot affect the */
5809       /* result by >=0.5 ulp (at the requested digits), which */
5810       /* is when its value is smaller than the accumulator by */
5811       /* set->digits+1 digits (or it is zero) -- this is a looser */
5812       /* requirement than for Exp because all that happens to the */
5813       /* accumulator after this is the final rounding (but note that */
5814       /* there must also be full precision in a, or a=0). */
5815 
5816       if (decNumberIsZero(b) ||
5817 	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5818 	if (a->digits==p) break;
5819 	if (decNumberIsZero(a)) {
5820 	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5821 	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
5822 	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
5823 	  break;
5824 	  }
5825 	/* force padding if adjustment has gone to 0 before full length */
5826 	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5827 	}
5828 
5829       /* not done yet ... */
5830       decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
5831       if (pp==p) continue;		     /* precision is at maximum */
5832       /* lengthen the next calculation */
5833       pp=pp*2;				     /* double precision */
5834       if (pp>p) pp=p;			     /* clamp to maximum */
5835       aset.digits=pp;			     /* working context */
5836       bset.digits=pp+rhs->digits;	     /* wider context */
5837       } /* Newton's iteration */
5838 
5839     #if DECCHECK
5840     /* just a sanity check; remove the test to show always */
5841     if (iterations>24)
5842       printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5843 	    iterations, *status, p, rhs->digits);
5844     #endif
5845 
5846     /* Copy and round the result to res */
5847     residue=1;				/* indicate dirt to right */
5848     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
5849     aset.digits=set->digits;		/* [use default rounding] */
5850     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5851     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
5852     } while(0);				/* end protected */
5853 
5854   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5855   if (allocbufb!=NULL) free(allocbufb); /* .. */
5856   /* [status is handled by caller] */
5857   return res;
5858   } /* decLnOp */
5859 
5860 /* ------------------------------------------------------------------ */
5861 /* decQuantizeOp  -- force exponent to requested value		      */
5862 /*								      */
5863 /*   This computes C = op(A, B), where op adjusts the coefficient     */
5864 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
5865 /*   of C has the value B or matches the exponent of B.		      */
5866 /*   The numerical value of C will equal A, except for the effects of */
5867 /*   any rounding that occurred.				      */
5868 /*								      */
5869 /*   res is C, the result.  C may be A or B			      */
5870 /*   lhs is A, the number to adjust				      */
5871 /*   rhs is B, the requested exponent				      */
5872 /*   set is the context						      */
5873 /*   quant is 1 for quantize or 0 for rescale			      */
5874 /*   status is the status accumulator (this can be called without     */
5875 /*	    risk of control loss)				      */
5876 /*								      */
5877 /* C must have space for set->digits digits.			      */
5878 /*								      */
5879 /* Unless there is an error or the result is infinite, the exponent   */
5880 /* after the operation is guaranteed to be that requested.	      */
5881 /* ------------------------------------------------------------------ */
5882 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5883 				 const decNumber *rhs, decContext *set,
5884 				 Flag quant, uInt *status) {
5885   #if DECSUBSET
5886   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
5887   decNumber *allocrhs=NULL;	   /* .., rhs */
5888   #endif
5889   const decNumber *inrhs=rhs;	   /* save original rhs */
5890   Int	reqdigits=set->digits;	   /* requested DIGITS */
5891   Int	reqexp;			   /* requested exponent [-scale] */
5892   Int	residue=0;		   /* rounding residue */
5893   Int	etiny=set->emin-(reqdigits-1);
5894 
5895   #if DECCHECK
5896   if (decCheckOperands(res, lhs, rhs, set)) return res;
5897   #endif
5898 
5899   do {				   /* protect allocated storage */
5900     #if DECSUBSET
5901     if (!set->extended) {
5902       /* reduce operands and set lostDigits status, as needed */
5903       if (lhs->digits>reqdigits) {
5904 	alloclhs=decRoundOperand(lhs, set, status);
5905 	if (alloclhs==NULL) break;
5906 	lhs=alloclhs;
5907 	}
5908       if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
5909 	allocrhs=decRoundOperand(rhs, set, status);
5910 	if (allocrhs==NULL) break;
5911 	rhs=allocrhs;
5912 	}
5913       }
5914     #endif
5915     /* [following code does not require input rounding] */
5916 
5917     /* Handle special values */
5918     if (SPECIALARGS) {
5919       /* NaNs get usual processing */
5920       if (SPECIALARGS & (DECSNAN | DECNAN))
5921 	decNaNs(res, lhs, rhs, set, status);
5922       /* one infinity but not both is bad */
5923       else if ((lhs->bits ^ rhs->bits) & DECINF)
5924 	*status|=DEC_Invalid_operation;
5925       /* both infinity: return lhs */
5926       else decNumberCopy(res, lhs);	     /* [nop if in place] */
5927       break;
5928       }
5929 
5930     /* set requested exponent */
5931     if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
5932      else {				/* rescale -- use value of rhs */
5933       /* Original rhs must be an integer that fits and is in range, */
5934       /* which could be from -1999999997 to +999999999, thanks to */
5935       /* subnormals */
5936       reqexp=decGetInt(inrhs);		     /* [cannot fail] */
5937       }
5938 
5939     #if DECSUBSET
5940     if (!set->extended) etiny=set->emin;     /* no subnormals */
5941     #endif
5942 
5943     if (reqexp==BADINT			     /* bad (rescale only) or .. */
5944      || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
5945      || (reqexp<etiny)			     /* < lowest */
5946      || (reqexp>set->emax)) {		     /* > emax */
5947       *status|=DEC_Invalid_operation;
5948       break;}
5949 
5950     /* the RHS has been processed, so it can be overwritten now if necessary */
5951     if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
5952       decNumberCopy(res, lhs);		     /* [nop if in place] */
5953       res->exponent=reqexp;		     /* .. just set exponent */
5954       #if DECSUBSET
5955       if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
5956       #endif
5957       }
5958      else {				     /* non-zero lhs */
5959       Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
5960       /* if adjusted coefficient will definitely not fit, give up now */
5961       if ((lhs->digits-adjust)>reqdigits) {
5962 	*status|=DEC_Invalid_operation;
5963 	break;
5964 	}
5965 
5966       if (adjust>0) {			     /* increasing exponent */
5967 	/* this will decrease the length of the coefficient by adjust */
5968 	/* digits, and must round as it does so */
5969 	decContext workset;		     /* work */
5970 	workset=*set;			     /* clone rounding, etc. */
5971 	workset.digits=lhs->digits-adjust;   /* set requested length */
5972 	/* [note that the latter can be <1, here] */
5973 	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
5974 	decApplyRound(res, &workset, residue, status);	  /* .. and round */
5975 	residue=0;					  /* [used] */
5976 	/* If just rounded a 999s case, exponent will be off by one; */
5977 	/* adjust back (after checking space), if so. */
5978 	if (res->exponent>reqexp) {
5979 	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
5980 	  /* set->digits==3 */
5981 	  if (res->digits==reqdigits) {	     /* cannot shift by 1 */
5982 	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
5983 	    *status|=DEC_Invalid_operation;
5984 	    break;
5985 	    }
5986 	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
5987 	  res->exponent--;		     /* (re)adjust the exponent. */
5988 	  }
5989 	#if DECSUBSET
5990 	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
5991 	#endif
5992 	} /* increase */
5993        else /* adjust<=0 */ {		     /* decreasing or = exponent */
5994 	/* this will increase the length of the coefficient by -adjust */
5995 	/* digits, by adding zero or more trailing zeros; this is */
5996 	/* already checked for fit, above */
5997 	decNumberCopy(res, lhs);	     /* [it will fit] */
5998 	/* if padding needed (adjust<0), add it now... */
5999 	if (adjust<0) {
6000 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
6001 	  res->exponent+=adjust;	     /* adjust the exponent */
6002 	  }
6003 	} /* decrease */
6004       } /* non-zero */
6005 
6006     /* Check for overflow [do not use Finalize in this case, as an */
6007     /* overflow here is a "don't fit" situation] */
6008     if (res->exponent>set->emax-res->digits+1) {  /* too big */
6009       *status|=DEC_Invalid_operation;
6010       break;
6011       }
6012      else {
6013       decFinalize(res, set, &residue, status);	  /* set subnormal flags */
6014       *status&=~DEC_Underflow;		/* suppress Underflow [754r] */
6015       }
6016     } while(0);				/* end protected */
6017 
6018   #if DECSUBSET
6019   if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
6020   if (alloclhs!=NULL) free(alloclhs);	/* .. */
6021   #endif
6022   return res;
6023   } /* decQuantizeOp */
6024 
6025 /* ------------------------------------------------------------------ */
6026 /* decCompareOp -- compare, min, or max two Numbers		      */
6027 /*								      */
6028 /*   This computes C = A ? B and carries out one of four operations:  */
6029 /*     COMPARE	  -- returns the signum (as a number) giving the      */
6030 /*		     result of a comparison unless one or both	      */
6031 /*		     operands is a NaN (in which case a NaN results)  */
6032 /*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
6033 /*		     Invalid operation.				      */
6034 /*     COMPMAX	  -- returns the larger of the operands, using the    */
6035 /*		     754r maxnum operation			      */
6036 /*     COMPMAXMAG -- ditto, comparing absolute values		      */
6037 /*     COMPMIN	  -- the 754r minnum operation			      */
6038 /*     COMPMINMAG -- ditto, comparing absolute values		      */
6039 /*     COMTOTAL	  -- returns the signum (as a number) giving the      */
6040 /*		     result of a comparison using 754r total ordering */
6041 /*								      */
6042 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
6043 /*   lhs is A							      */
6044 /*   rhs is B							      */
6045 /*   set is the context						      */
6046 /*   op	 is the operation flag					      */
6047 /*   status is the usual accumulator				      */
6048 /*								      */
6049 /* C must have space for one digit for COMPARE or set->digits for     */
6050 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.			      */
6051 /* ------------------------------------------------------------------ */
6052 /* The emphasis here is on speed for common cases, and avoiding	      */
6053 /* coefficient comparison if possible.				      */
6054 /* ------------------------------------------------------------------ */
6055 decNumber * decCompareOp(decNumber *res, const decNumber *lhs,
6056 			 const decNumber *rhs, decContext *set,
6057 			 Flag op, uInt *status) {
6058   #if DECSUBSET
6059   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
6060   decNumber *allocrhs=NULL;	   /* .., rhs */
6061   #endif
6062   Int	result=0;		   /* default result value */
6063   uByte merged;			   /* work */
6064 
6065   #if DECCHECK
6066   if (decCheckOperands(res, lhs, rhs, set)) return res;
6067   #endif
6068 
6069   do {				   /* protect allocated storage */
6070     #if DECSUBSET
6071     if (!set->extended) {
6072       /* reduce operands and set lostDigits status, as needed */
6073       if (lhs->digits>set->digits) {
6074 	alloclhs=decRoundOperand(lhs, set, status);
6075 	if (alloclhs==NULL) {result=BADINT; break;}
6076 	lhs=alloclhs;
6077 	}
6078       if (rhs->digits>set->digits) {
6079 	allocrhs=decRoundOperand(rhs, set, status);
6080 	if (allocrhs==NULL) {result=BADINT; break;}
6081 	rhs=allocrhs;
6082 	}
6083       }
6084     #endif
6085     /* [following code does not require input rounding] */
6086 
6087     /* If total ordering then handle differing signs 'up front' */
6088     if (op==COMPTOTAL) {		/* total ordering */
6089       if (decNumberIsNegative(lhs) & !decNumberIsNegative(rhs)) {
6090 	result=-1;
6091 	break;
6092 	}
6093       if (!decNumberIsNegative(lhs) & decNumberIsNegative(rhs)) {
6094 	result=+1;
6095 	break;
6096 	}
6097       }
6098 
6099     /* handle NaNs specially; let infinities drop through */
6100     /* This assumes sNaN (even just one) leads to NaN. */
6101     merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6102     if (merged) {			/* a NaN bit set */
6103       if (op==COMPARE);			/* result will be NaN */
6104        else if (op==COMPSIG)		/* treat qNaN as sNaN */
6105 	*status|=DEC_Invalid_operation | DEC_sNaN;
6106        else if (op==COMPTOTAL) {	/* total ordering, always finite */
6107 	/* signs are known to be the same; compute the ordering here */
6108 	/* as if the signs are both positive, then invert for negatives */
6109 	if (!decNumberIsNaN(lhs)) result=-1;
6110 	 else if (!decNumberIsNaN(rhs)) result=+1;
6111 	 /* here if both NaNs */
6112 	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6113 	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6114 	 else { /* both NaN or both sNaN */
6115 	  /* now it just depends on the payload */
6116 	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6117 				rhs->lsu, D2U(rhs->digits), 0);
6118 	  /* [Error not possible, as these are 'aligned'] */
6119 	  } /* both same NaNs */
6120 	if (decNumberIsNegative(lhs)) result=-result;
6121 	break;
6122 	} /* total order */
6123 
6124        else if (merged & DECSNAN);	     /* sNaN -> qNaN */
6125        else { /* here if MIN or MAX and one or two quiet NaNs */
6126 	/* min or max -- 754r rules ignore single NaN */
6127 	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6128 	  /* just one NaN; force choice to be the non-NaN operand */
6129 	  op=COMPMAX;
6130 	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6131 			     else result=+1; /* pick lhs */
6132 	  break;
6133 	  }
6134 	} /* max or min */
6135       op=COMPNAN;			     /* use special path */
6136       decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
6137       break;
6138       }
6139     /* have numbers */
6140     if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6141      else result=decCompare(lhs, rhs, 0);    /* sign matters */
6142     } while(0);				     /* end protected */
6143 
6144   if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6145    else {
6146     if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6147       if (op==COMPTOTAL && result==0) {
6148 	/* operands are numerically equal or same NaN (and same sign, */
6149 	/* tested first); if identical, leave result 0 */
6150 	if (lhs->exponent!=rhs->exponent) {
6151 	  if (lhs->exponent<rhs->exponent) result=-1;
6152 	   else result=+1;
6153 	  if (decNumberIsNegative(lhs)) result=-result;
6154 	  } /* lexp!=rexp */
6155 	} /* total-order by exponent */
6156       decNumberZero(res);		/* [always a valid result] */
6157       if (result!=0) {			/* must be -1 or +1 */
6158 	*res->lsu=1;
6159 	if (result<0) res->bits=DECNEG;
6160 	}
6161       }
6162      else if (op==COMPNAN);		/* special, drop through */
6163      else {				/* MAX or MIN, non-NaN result */
6164       Int residue=0;			/* rounding accumulator */
6165       /* choose the operand for the result */
6166       const decNumber *choice;
6167       if (result==0) { /* operands are numerically equal */
6168 	/* choose according to sign then exponent (see 754r) */
6169 	uByte slhs=(lhs->bits & DECNEG);
6170 	uByte srhs=(rhs->bits & DECNEG);
6171 	#if DECSUBSET
6172 	if (!set->extended) {		/* subset: force left-hand */
6173 	  op=COMPMAX;
6174 	  result=+1;
6175 	  }
6176 	else
6177 	#endif
6178 	if (slhs!=srhs) {	   /* signs differ */
6179 	  if (slhs) result=-1;	   /* rhs is max */
6180 	       else result=+1;	   /* lhs is max */
6181 	  }
6182 	 else if (slhs && srhs) {  /* both negative */
6183 	  if (lhs->exponent<rhs->exponent) result=+1;
6184 				      else result=-1;
6185 	  /* [if equal, use lhs, technically identical] */
6186 	  }
6187 	 else {			   /* both positive */
6188 	  if (lhs->exponent>rhs->exponent) result=+1;
6189 				      else result=-1;
6190 	  /* [ditto] */
6191 	  }
6192 	} /* numerically equal */
6193       /* here result will be non-0; reverse if looking for MIN */
6194       if (op==COMPMIN || op==COMPMINMAG) result=-result;
6195       choice=(result>0 ? lhs : rhs);	/* choose */
6196       /* copy chosen to result, rounding if need be */
6197       decCopyFit(res, choice, set, &residue, status);
6198       decFinish(res, set, &residue, status);
6199       }
6200     }
6201   #if DECSUBSET
6202   if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
6203   if (alloclhs!=NULL) free(alloclhs);	/* .. */
6204   #endif
6205   return res;
6206   } /* decCompareOp */
6207 
6208 /* ------------------------------------------------------------------ */
6209 /* decCompare -- compare two decNumbers by numerical value	      */
6210 /*								      */
6211 /*  This routine compares A ? B without altering them.		      */
6212 /*								      */
6213 /*  Arg1 is A, a decNumber which is not a NaN			      */
6214 /*  Arg2 is B, a decNumber which is not a NaN			      */
6215 /*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
6216 /*								      */
6217 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6218 /*  (the only possible failure is an allocation error)		      */
6219 /* ------------------------------------------------------------------ */
6220 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6221 		      Flag abs) {
6222   Int	result;			   /* result value */
6223   Int	sigr;			   /* rhs signum */
6224   Int	compare;		   /* work */
6225 
6226   result=1;				     /* assume signum(lhs) */
6227   if (ISZERO(lhs)) result=0;
6228   if (abs) {
6229     if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
6230     /* RHS is non-zero */
6231     if (result==0) return -1;		     /* LHS is 0; RHS wins */
6232     /* [here, both non-zero, result=1] */
6233     }
6234    else {				     /* signs matter */
6235     if (result && decNumberIsNegative(lhs)) result=-1;
6236     sigr=1;				     /* compute signum(rhs) */
6237     if (ISZERO(rhs)) sigr=0;
6238      else if (decNumberIsNegative(rhs)) sigr=-1;
6239     if (result > sigr) return +1;	     /* L > R, return 1 */
6240     if (result < sigr) return -1;	     /* L < R, return -1 */
6241     if (result==0) return 0;		       /* both 0 */
6242     }
6243 
6244   /* signums are the same; both are non-zero */
6245   if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
6246     if (decNumberIsInfinite(rhs)) {
6247       if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6248        else result=-result;		     /* only rhs infinite */
6249       }
6250     return result;
6251     }
6252   /* must compare the coefficients, allowing for exponents */
6253   if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
6254     /* swap sides, and sign */
6255     const decNumber *temp=lhs;
6256     lhs=rhs;
6257     rhs=temp;
6258     result=-result;
6259     }
6260   compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6261 			 rhs->lsu, D2U(rhs->digits),
6262 			 rhs->exponent-lhs->exponent);
6263   if (compare!=BADINT) compare*=result;	     /* comparison succeeded */
6264   return compare;
6265   } /* decCompare */
6266 
6267 /* ------------------------------------------------------------------ */
6268 /* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
6269 /*								      */
6270 /*  This routine compares A ? B*10**E where A and B are unit arrays   */
6271 /*  A is a plain integer					      */
6272 /*  B has an exponent of E (which must be non-negative)		      */
6273 /*								      */
6274 /*  Arg1 is A first Unit (lsu)					      */
6275 /*  Arg2 is A length in Units					      */
6276 /*  Arg3 is B first Unit (lsu)					      */
6277 /*  Arg4 is B length in Units					      */
6278 /*  Arg5 is E (0 if the units are aligned)			      */
6279 /*								      */
6280 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6281 /*  (the only possible failure is an allocation error, which can      */
6282 /*  only occur if E!=0)						      */
6283 /* ------------------------------------------------------------------ */
6284 static Int decUnitCompare(const Unit *a, Int alength,
6285 			  const Unit *b, Int blength, Int exp) {
6286   Unit	*acc;			   /* accumulator for result */
6287   Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6288   Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
6289   Int	accunits, need;		   /* units in use or needed for acc */
6290   const Unit *l, *r, *u;	   /* work */
6291   Int	expunits, exprem, result;  /* .. */
6292 
6293   if (exp==0) {			   /* aligned; fastpath */
6294     if (alength>blength) return 1;
6295     if (alength<blength) return -1;
6296     /* same number of units in both -- need unit-by-unit compare */
6297     l=a+alength-1;
6298     r=b+alength-1;
6299     for (;l>=a; l--, r--) {
6300       if (*l>*r) return 1;
6301       if (*l<*r) return -1;
6302       }
6303     return 0;			   /* all units match */
6304     } /* aligned */
6305 
6306   /* Unaligned.	 If one is >1 unit longer than the other, padded */
6307   /* approximately, then can return easily */
6308   if (alength>blength+(Int)D2U(exp)) return 1;
6309   if (alength+1<blength+(Int)D2U(exp)) return -1;
6310 
6311   /* Need to do a real subtract.  For this, a result buffer is needed */
6312   /* even though only the sign is of interest.	Its length needs */
6313   /* to be the larger of alength and padded blength, +2 */
6314   need=blength+D2U(exp);		/* maximum real length of B */
6315   if (need<alength) need=alength;
6316   need+=2;
6317   acc=accbuff;				/* assume use local buffer */
6318   if (need*sizeof(Unit)>sizeof(accbuff)) {
6319     allocacc=(Unit *)malloc(need*sizeof(Unit));
6320     if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
6321     acc=allocacc;
6322     }
6323   /* Calculate units and remainder from exponent. */
6324   expunits=exp/DECDPUN;
6325   exprem=exp%DECDPUN;
6326   /* subtract [A+B*(-m)] */
6327   accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6328 			 -(Int)powers[exprem]);
6329   /* [UnitAddSub result may have leading zeros, even on zero] */
6330   if (accunits<0) result=-1;		/* negative result */
6331    else {				/* non-negative result */
6332     /* check units of the result before freeing any storage */
6333     for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6334     result=(*u==0 ? 0 : +1);
6335     }
6336   /* clean up and return the result */
6337   if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
6338   return result;
6339   } /* decUnitCompare */
6340 
6341 /* ------------------------------------------------------------------ */
6342 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
6343 /*								      */
6344 /*  This routine performs the calculation:			      */
6345 /*								      */
6346 /*  C=A+(B*M)							      */
6347 /*								      */
6348 /*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
6349 /*								      */
6350 /*  A may be shorter or longer than B.				      */
6351 /*								      */
6352 /*  Leading zeros are not removed after a calculation.	The result is */
6353 /*  either the same length as the longer of A and B (adding any	      */
6354 /*  shift), or one Unit longer than that (if a Unit carry occurred).  */
6355 /*								      */
6356 /*  A and B content are not altered unless C is also A or B.	      */
6357 /*  C may be the same array as A or B, but only if no zero padding is */
6358 /*  requested (that is, C may be B only if bshift==0).		      */
6359 /*  C is filled from the lsu; only those units necessary to complete  */
6360 /*  the calculation are referenced.				      */
6361 /*								      */
6362 /*  Arg1 is A first Unit (lsu)					      */
6363 /*  Arg2 is A length in Units					      */
6364 /*  Arg3 is B first Unit (lsu)					      */
6365 /*  Arg4 is B length in Units					      */
6366 /*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
6367 /*  Arg6 is C first Unit (lsu)					      */
6368 /*  Arg7 is M, the multiplier					      */
6369 /*								      */
6370 /*  returns the count of Units written to C, which will be non-zero   */
6371 /*  and negated if the result is negative.  That is, the sign of the  */
6372 /*  returned Int is the sign of the result (positive for zero) and    */
6373 /*  the absolute value of the Int is the count of Units.	      */
6374 /*								      */
6375 /*  It is the caller's responsibility to make sure that C size is     */
6376 /*  safe, allowing space if necessary for a one-Unit carry.	      */
6377 /*								      */
6378 /*  This routine is severely performance-critical; *any* change here  */
6379 /*  must be measured (timed) to assure no performance degradation.    */
6380 /*  In particular, trickery here tends to be counter-productive, as   */
6381 /*  increased complexity of code hurts register optimizations on      */
6382 /*  register-poor architectures.  Avoiding divisions is nearly	      */
6383 /*  always a Good Idea, however.				      */
6384 /*								      */
6385 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
6386 /* (IBM Warwick, UK) for some of the ideas used in this routine.      */
6387 /* ------------------------------------------------------------------ */
6388 static Int decUnitAddSub(const Unit *a, Int alength,
6389 			 const Unit *b, Int blength, Int bshift,
6390 			 Unit *c, Int m) {
6391   const Unit *alsu=a;		   /* A lsu [need to remember it] */
6392   Unit *clsu=c;			   /* C ditto */
6393   Unit *minC;			   /* low water mark for C */
6394   Unit *maxC;			   /* high water mark for C */
6395   eInt carry=0;			   /* carry integer (could be Long) */
6396   Int  add;			   /* work */
6397   #if DECDPUN<=4		   /* myriadal, millenary, etc. */
6398   Int  est;			   /* estimated quotient */
6399   #endif
6400 
6401   #if DECTRACE
6402   if (alength<1 || blength<1)
6403     printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6404   #endif
6405 
6406   maxC=c+alength;		   /* A is usually the longer */
6407   minC=c+blength;		   /* .. and B the shorter */
6408   if (bshift!=0) {		   /* B is shifted; low As copy across */
6409     minC+=bshift;
6410     /* if in place [common], skip copy unless there's a gap [rare] */
6411     if (a==c && bshift<=alength) {
6412       c+=bshift;
6413       a+=bshift;
6414       }
6415      else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
6416       if (a<alsu+alength) *c=*a;
6417        else *c=0;
6418       }
6419     }
6420   if (minC>maxC) { /* swap */
6421     Unit *hold=minC;
6422     minC=maxC;
6423     maxC=hold;
6424     }
6425 
6426   /* For speed, do the addition as two loops; the first where both A */
6427   /* and B contribute, and the second (if necessary) where only one or */
6428   /* other of the numbers contribute. */
6429   /* Carry handling is the same (i.e., duplicated) in each case. */
6430   for (; c<minC; c++) {
6431     carry+=*a;
6432     a++;
6433     carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
6434     b++;				/* here is not a win] */
6435     /* here carry is new Unit of digits; it could be +ve or -ve */
6436     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6437       *c=(Unit)carry;
6438       carry=0;
6439       continue;
6440       }
6441     #if DECDPUN==4			     /* use divide-by-multiply */
6442       if (carry>=0) {
6443 	est=(((ueInt)carry>>11)*53687)>>18;
6444 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6445 	carry=est;			     /* likely quotient [89%] */
6446 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6447 	carry++;
6448 	*c-=DECDPUNMAX+1;
6449 	continue;
6450 	}
6451       /* negative case */
6452       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6453       est=(((ueInt)carry>>11)*53687)>>18;
6454       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6455       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6456       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6457       carry++;
6458       *c-=DECDPUNMAX+1;
6459     #elif DECDPUN==3
6460       if (carry>=0) {
6461 	est=(((ueInt)carry>>3)*16777)>>21;
6462 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6463 	carry=est;			     /* likely quotient [99%] */
6464 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6465 	carry++;
6466 	*c-=DECDPUNMAX+1;
6467 	continue;
6468 	}
6469       /* negative case */
6470       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6471       est=(((ueInt)carry>>3)*16777)>>21;
6472       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6473       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6474       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6475       carry++;
6476       *c-=DECDPUNMAX+1;
6477     #elif DECDPUN<=2
6478       /* Can use QUOT10 as carry <= 4 digits */
6479       if (carry>=0) {
6480 	est=QUOT10(carry, DECDPUN);
6481 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6482 	carry=est;			     /* quotient */
6483 	continue;
6484 	}
6485       /* negative case */
6486       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6487       est=QUOT10(carry, DECDPUN);
6488       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6489       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6490     #else
6491       /* remainder operator is undefined if negative, so must test */
6492       if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
6493 	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
6494 	carry=1;
6495 	continue;
6496 	}
6497       if (carry>=0) {
6498 	*c=(Unit)(carry%(DECDPUNMAX+1));
6499 	carry=carry/(DECDPUNMAX+1);
6500 	continue;
6501 	}
6502       /* negative case */
6503       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6504       *c=(Unit)(carry%(DECDPUNMAX+1));
6505       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6506     #endif
6507     } /* c */
6508 
6509   /* now may have one or other to complete */
6510   /* [pretest to avoid loop setup/shutdown] */
6511   if (c<maxC) for (; c<maxC; c++) {
6512     if (a<alsu+alength) {		/* still in A */
6513       carry+=*a;
6514       a++;
6515       }
6516      else {				/* inside B */
6517       carry+=((eInt)*b)*m;
6518       b++;
6519       }
6520     /* here carry is new Unit of digits; it could be +ve or -ve and */
6521     /* magnitude up to DECDPUNMAX squared */
6522     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6523       *c=(Unit)carry;
6524       carry=0;
6525       continue;
6526       }
6527     /* result for this unit is negative or >DECDPUNMAX */
6528     #if DECDPUN==4			     /* use divide-by-multiply */
6529       if (carry>=0) {
6530 	est=(((ueInt)carry>>11)*53687)>>18;
6531 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6532 	carry=est;			     /* likely quotient [79.7%] */
6533 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6534 	carry++;
6535 	*c-=DECDPUNMAX+1;
6536 	continue;
6537 	}
6538       /* negative case */
6539       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6540       est=(((ueInt)carry>>11)*53687)>>18;
6541       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6542       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6543       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6544       carry++;
6545       *c-=DECDPUNMAX+1;
6546     #elif DECDPUN==3
6547       if (carry>=0) {
6548 	est=(((ueInt)carry>>3)*16777)>>21;
6549 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6550 	carry=est;			     /* likely quotient [99%] */
6551 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6552 	carry++;
6553 	*c-=DECDPUNMAX+1;
6554 	continue;
6555 	}
6556       /* negative case */
6557       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6558       est=(((ueInt)carry>>3)*16777)>>21;
6559       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6560       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6561       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6562       carry++;
6563       *c-=DECDPUNMAX+1;
6564     #elif DECDPUN<=2
6565       if (carry>=0) {
6566 	est=QUOT10(carry, DECDPUN);
6567 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6568 	carry=est;			     /* quotient */
6569 	continue;
6570 	}
6571       /* negative case */
6572       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6573       est=QUOT10(carry, DECDPUN);
6574       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6575       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6576     #else
6577       if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
6578 	*c=(Unit)(carry-(DECDPUNMAX+1));
6579 	carry=1;
6580 	continue;
6581 	}
6582       /* remainder operator is undefined if negative, so must test */
6583       if (carry>=0) {
6584 	*c=(Unit)(carry%(DECDPUNMAX+1));
6585 	carry=carry/(DECDPUNMAX+1);
6586 	continue;
6587 	}
6588       /* negative case */
6589       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6590       *c=(Unit)(carry%(DECDPUNMAX+1));
6591       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6592     #endif
6593     } /* c */
6594 
6595   /* OK, all A and B processed; might still have carry or borrow */
6596   /* return number of Units in the result, negated if a borrow */
6597   if (carry==0) return c-clsu;	   /* no carry, so no more to do */
6598   if (carry>0) {		   /* positive carry */
6599     *c=(Unit)carry;		   /* place as new unit */
6600     c++;			   /* .. */
6601     return c-clsu;
6602     }
6603   /* -ve carry: it's a borrow; complement needed */
6604   add=1;			   /* temporary carry... */
6605   for (c=clsu; c<maxC; c++) {
6606     add=DECDPUNMAX+add-*c;
6607     if (add<=DECDPUNMAX) {
6608       *c=(Unit)add;
6609       add=0;
6610       }
6611      else {
6612       *c=0;
6613       add=1;
6614       }
6615     }
6616   /* add an extra unit iff it would be non-zero */
6617   #if DECTRACE
6618     printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6619   #endif
6620   if ((add-carry-1)!=0) {
6621     *c=(Unit)(add-carry-1);
6622     c++;		      /* interesting, include it */
6623     }
6624   return clsu-c;	      /* -ve result indicates borrowed */
6625   } /* decUnitAddSub */
6626 
6627 /* ------------------------------------------------------------------ */
6628 /* decTrim -- trim trailing zeros or normalize			      */
6629 /*								      */
6630 /*   dn is the number to trim or normalize			      */
6631 /*   set is the context to use to check for clamp		      */
6632 /*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
6633 /*   dropped returns the number of discarded trailing zeros	      */
6634 /*   returns dn							      */
6635 /*								      */
6636 /* If clamp is set in the context then the number of zeros trimmed    */
6637 /* may be limited if the exponent is high.			      */
6638 /* All fields are updated as required.	This is a utility operation,  */
6639 /* so special values are unchanged and no error is possible.	      */
6640 /* ------------------------------------------------------------------ */
6641 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6642 			   Int *dropped) {
6643   Int	d, exp;			   /* work */
6644   uInt	cut;			   /* .. */
6645   Unit	*up;			   /* -> current Unit */
6646 
6647   #if DECCHECK
6648   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6649   #endif
6650 
6651   *dropped=0;				/* assume no zeros dropped */
6652   if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
6653     || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
6654   if (ISZERO(dn)) {			/* .. or 0 */
6655     dn->exponent=0;			/* (sign is preserved) */
6656     return dn;
6657     }
6658 
6659   /* have a finite number which is even */
6660   exp=dn->exponent;
6661   cut=1;			   /* digit (1-DECDPUN) in Unit */
6662   up=dn->lsu;			   /* -> current Unit */
6663   for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6664     /* slice by powers */
6665     #if DECDPUN<=4
6666       uInt quot=QUOT10(*up, cut);
6667       if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
6668     #else
6669       if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
6670     #endif
6671     /* have a trailing 0 */
6672     if (!all) {			   /* trimming */
6673       /* [if exp>0 then all trailing 0s are significant for trim] */
6674       if (exp<=0) {		   /* if digit might be significant */
6675 	if (exp==0) break;	   /* then quit */
6676 	exp++;			   /* next digit might be significant */
6677 	}
6678       }
6679     cut++;			   /* next power */
6680     if (cut>DECDPUN) {		   /* need new Unit */
6681       up++;
6682       cut=1;
6683       }
6684     } /* d */
6685   if (d==0) return dn;		   /* none to drop */
6686 
6687   /* may need to limit drop if clamping */
6688   if (set->clamp) {
6689     Int maxd=set->emax-set->digits+1-dn->exponent;
6690     if (maxd<=0) return dn;	   /* nothing possible */
6691     if (d>maxd) d=maxd;
6692     }
6693 
6694   /* effect the drop */
6695   decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6696   dn->exponent+=d;		   /* maintain numerical value */
6697   dn->digits-=d;		   /* new length */
6698   *dropped=d;			   /* report the count */
6699   return dn;
6700   } /* decTrim */
6701 
6702 /* ------------------------------------------------------------------ */
6703 /* decReverse -- reverse a Unit array in place			      */
6704 /*								      */
6705 /*   ulo    is the start of the array				      */
6706 /*   uhi    is the end of the array (highest Unit to include)	      */
6707 /*								      */
6708 /* The units ulo through uhi are reversed in place (if the number     */
6709 /* of units is odd, the middle one is untouched).  Note that the      */
6710 /* digit(s) in each unit are unaffected.			      */
6711 /* ------------------------------------------------------------------ */
6712 static void decReverse(Unit *ulo, Unit *uhi) {
6713   Unit temp;
6714   for (; ulo<uhi; ulo++, uhi--) {
6715     temp=*ulo;
6716     *ulo=*uhi;
6717     *uhi=temp;
6718     }
6719   return;
6720   } /* decReverse */
6721 
6722 /* ------------------------------------------------------------------ */
6723 /* decShiftToMost -- shift digits in array towards most significant   */
6724 /*								      */
6725 /*   uar    is the array					      */
6726 /*   digits is the count of digits in use in the array		      */
6727 /*   shift  is the number of zeros to pad with (least significant);   */
6728 /*     it must be zero or positive				      */
6729 /*								      */
6730 /*   returns the new length of the integer in the array, in digits    */
6731 /*								      */
6732 /* No overflow is permitted (that is, the uar array must be known to  */
6733 /* be large enough to hold the result, after shifting).		      */
6734 /* ------------------------------------------------------------------ */
6735 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6736   Unit	*target, *source, *first;  /* work */
6737   Int	cut;			   /* odd 0's to add */
6738   uInt	next;			   /* work */
6739 
6740   if (shift==0) return digits;	   /* [fastpath] nothing to do */
6741   if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
6742     *uar=(Unit)(*uar*powers[shift]);
6743     return digits+shift;
6744     }
6745 
6746   next=0;			   /* all paths */
6747   source=uar+D2U(digits)-1;	   /* where msu comes from */
6748   target=source+D2U(shift);	   /* where upper part of first cut goes */
6749   cut=DECDPUN-MSUDIGITS(shift);	   /* where to slice */
6750   if (cut==0) {			   /* unit-boundary case */
6751     for (; source>=uar; source--, target--) *target=*source;
6752     }
6753    else {
6754     first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6755     for (; source>=uar; source--, target--) {
6756       /* split the source Unit and accumulate remainder for next */
6757       #if DECDPUN<=4
6758 	uInt quot=QUOT10(*source, cut);
6759 	uInt rem=*source-quot*powers[cut];
6760 	next+=quot;
6761       #else
6762 	uInt rem=*source%powers[cut];
6763 	next+=*source/powers[cut];
6764       #endif
6765       if (target<=first) *target=(Unit)next;   /* write to target iff valid */
6766       next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
6767       }
6768     } /* shift-move */
6769 
6770   /* propagate any partial unit to one below and clear the rest */
6771   for (; target>=uar; target--) {
6772     *target=(Unit)next;
6773     next=0;
6774     }
6775   return digits+shift;
6776   } /* decShiftToMost */
6777 
6778 /* ------------------------------------------------------------------ */
6779 /* decShiftToLeast -- shift digits in array towards least significant */
6780 /*								      */
6781 /*   uar   is the array						      */
6782 /*   units is length of the array, in units			      */
6783 /*   shift is the number of digits to remove from the lsu end; it     */
6784 /*     must be zero or positive and <= than units*DECDPUN.	      */
6785 /*								      */
6786 /*   returns the new length of the integer in the array, in units     */
6787 /*								      */
6788 /* Removed digits are discarded (lost).	 Units not required to hold   */
6789 /* the final result are unchanged.				      */
6790 /* ------------------------------------------------------------------ */
6791 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6792   Unit	*target, *up;		   /* work */
6793   Int	cut, count;		   /* work */
6794   Int	quot, rem;		   /* for division */
6795 
6796   if (shift==0) return units;	   /* [fastpath] nothing to do */
6797   if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
6798     *uar=0;			   /* all digits cleared gives zero */
6799     return 1;			   /* leaves just the one */
6800     }
6801 
6802   target=uar;			   /* both paths */
6803   cut=MSUDIGITS(shift);
6804   if (cut==DECDPUN) {		   /* unit-boundary case; easy */
6805     up=uar+D2U(shift);
6806     for (; up<uar+units; target++, up++) *target=*up;
6807     return target-uar;
6808     }
6809 
6810   /* messier */
6811   up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
6812   count=units*DECDPUN-shift;	   /* the maximum new length */
6813   #if DECDPUN<=4
6814     quot=QUOT10(*up, cut);
6815   #else
6816     quot=*up/powers[cut];
6817   #endif
6818   for (; ; target++) {
6819     *target=(Unit)quot;
6820     count-=(DECDPUN-cut);
6821     if (count<=0) break;
6822     up++;
6823     quot=*up;
6824     #if DECDPUN<=4
6825       quot=QUOT10(quot, cut);
6826       rem=*up-quot*powers[cut];
6827     #else
6828       rem=quot%powers[cut];
6829       quot=quot/powers[cut];
6830     #endif
6831     *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6832     count-=cut;
6833     if (count<=0) break;
6834     }
6835   return target-uar+1;
6836   } /* decShiftToLeast */
6837 
6838 #if DECSUBSET
6839 /* ------------------------------------------------------------------ */
6840 /* decRoundOperand -- round an operand	[used for subset only]	      */
6841 /*								      */
6842 /*   dn is the number to round (dn->digits is > set->digits)	      */
6843 /*   set is the relevant context				      */
6844 /*   status is the status accumulator				      */
6845 /*								      */
6846 /*   returns an allocated decNumber with the rounded result.	      */
6847 /*								      */
6848 /* lostDigits and other status may be set by this.		      */
6849 /*								      */
6850 /* Since the input is an operand, it must not be modified.	      */
6851 /* Instead, return an allocated decNumber, rounded as required.	      */
6852 /* It is the caller's responsibility to free the allocated storage.   */
6853 /*								      */
6854 /* If no storage is available then the result cannot be used, so NULL */
6855 /* is returned.							      */
6856 /* ------------------------------------------------------------------ */
6857 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6858 				  uInt *status) {
6859   decNumber *res;			/* result structure */
6860   uInt newstatus=0;			/* status from round */
6861   Int  residue=0;			/* rounding accumulator */
6862 
6863   /* Allocate storage for the returned decNumber, big enough for the */
6864   /* length specified by the context */
6865   res=(decNumber *)malloc(sizeof(decNumber)
6866 			  +(D2U(set->digits)-1)*sizeof(Unit));
6867   if (res==NULL) {
6868     *status|=DEC_Insufficient_storage;
6869     return NULL;
6870     }
6871   decCopyFit(res, dn, set, &residue, &newstatus);
6872   decApplyRound(res, set, residue, &newstatus);
6873 
6874   /* If that set Inexact then "lost digits" is raised... */
6875   if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6876   *status|=newstatus;
6877   return res;
6878   } /* decRoundOperand */
6879 #endif
6880 
6881 /* ------------------------------------------------------------------ */
6882 /* decCopyFit -- copy a number, truncating the coefficient if needed  */
6883 /*								      */
6884 /*   dest is the target decNumber				      */
6885 /*   src  is the source decNumber				      */
6886 /*   set is the context [used for length (digits) and rounding mode]  */
6887 /*   residue is the residue accumulator				      */
6888 /*   status contains the current status to be updated		      */
6889 /*								      */
6890 /* (dest==src is allowed and will be a no-op if fits)		      */
6891 /* All fields are updated as required.				      */
6892 /* ------------------------------------------------------------------ */
6893 static void decCopyFit(decNumber *dest, const decNumber *src,
6894 		       decContext *set, Int *residue, uInt *status) {
6895   dest->bits=src->bits;
6896   dest->exponent=src->exponent;
6897   decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6898   } /* decCopyFit */
6899 
6900 /* ------------------------------------------------------------------ */
6901 /* decSetCoeff -- set the coefficient of a number		      */
6902 /*								      */
6903 /*   dn	   is the number whose coefficient array is to be set.	      */
6904 /*	   It must have space for set->digits digits		      */
6905 /*   set   is the context [for size]				      */
6906 /*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
6907 /*   len   is digits in the source coefficient [may be dn->digits]    */
6908 /*   residue is the residue accumulator.  This has values as in	      */
6909 /*	   decApplyRound, and will be unchanged unless the	      */
6910 /*	   target size is less than len.  In this case, the	      */
6911 /*	   coefficient is truncated and the residue is updated to     */
6912 /*	   reflect the previous residue and the dropped digits.	      */
6913 /*   status is the status accumulator, as usual			      */
6914 /*								      */
6915 /* The coefficient may already be in the number, or it can be an      */
6916 /* external intermediate array.	 If it is in the number, lsu must ==  */
6917 /* dn->lsu and len must == dn->digits.				      */
6918 /*								      */
6919 /* Note that the coefficient length (len) may be < set->digits, and   */
6920 /* in this case this merely copies the coefficient (or is a no-op     */
6921 /* if dn->lsu==lsu).						      */
6922 /*								      */
6923 /* Note also that (only internally, from decQuantizeOp and	      */
6924 /* decSetSubnormal) the value of set->digits may be less than one,    */
6925 /* indicating a round to left.	This routine handles that case	      */
6926 /* correctly; caller ensures space.				      */
6927 /*								      */
6928 /* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
6929 /* updated as necessary.   dn->bits (sign) is unchanged.	      */
6930 /*								      */
6931 /* DEC_Rounded status is set if any digits are discarded.	      */
6932 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
6933 /*			 incoming residue was non-0 (implies rounded) */
6934 /* ------------------------------------------------------------------ */
6935 /* mapping array: maps 0-9 to canonical residues, so that a residue */
6936 /* can be adjusted in the range [-1, +1] and achieve correct rounding */
6937 /*			       0  1  2	3  4  5	 6  7  8  9 */
6938 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6939 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
6940 			Int len, Int *residue, uInt *status) {
6941   Int	discard;	      /* number of digits to discard */
6942   uInt	cut;		      /* cut point in Unit */
6943   const Unit *up;	      /* work */
6944   Unit	*target;	      /* .. */
6945   Int	count;		      /* .. */
6946   #if DECDPUN<=4
6947   uInt	temp;		      /* .. */
6948   #endif
6949 
6950   discard=len-set->digits;    /* digits to discard */
6951   if (discard<=0) {	      /* no digits are being discarded */
6952     if (dn->lsu!=lsu) {	      /* copy needed */
6953       /* copy the coefficient array to the result number; no shift needed */
6954       count=len;	      /* avoids D2U */
6955       up=lsu;
6956       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6957 	*target=*up;
6958       dn->digits=len;	      /* set the new length */
6959       }
6960     /* dn->exponent and residue are unchanged, record any inexactitude */
6961     if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
6962     return;
6963     }
6964 
6965   /* some digits must be discarded ... */
6966   dn->exponent+=discard;      /* maintain numerical value */
6967   *status|=DEC_Rounded;	      /* accumulate Rounded status */
6968   if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
6969 
6970   if (discard>len) {	      /* everything, +1, is being discarded */
6971     /* guard digit is 0 */
6972     /* residue is all the number [NB could be all 0s] */
6973     if (*residue<=0) {	      /* not already positive */
6974       count=len;	      /* avoids D2U */
6975       for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
6976 	*residue=1;
6977 	break;		      /* no need to check any others */
6978 	}
6979       }
6980     if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
6981     *dn->lsu=0;		      /* coefficient will now be 0 */
6982     dn->digits=1;	      /* .. */
6983     return;
6984     } /* total discard */
6985 
6986   /* partial discard [most common case] */
6987   /* here, at least the first (most significant) discarded digit exists */
6988 
6989   /* spin up the number, noting residue during the spin, until get to */
6990   /* the Unit with the first discarded digit.  When reach it, extract */
6991   /* it and remember its position */
6992   count=0;
6993   for (up=lsu;; up++) {
6994     count+=DECDPUN;
6995     if (count>=discard) break; /* full ones all checked */
6996     if (*up!=0) *residue=1;
6997     } /* up */
6998 
6999   /* here up -> Unit with first discarded digit */
7000   cut=discard-(count-DECDPUN)-1;
7001   if (cut==DECDPUN-1) {	      /* unit-boundary case (fast) */
7002     Unit half=(Unit)powers[DECDPUN]>>1;
7003     /* set residue directly */
7004     if (*up>=half) {
7005       if (*up>half) *residue=7;
7006       else *residue+=5;	      /* add sticky bit */
7007       }
7008      else { /* <half */
7009       if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
7010       }
7011     if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
7012       *dn->lsu=0;	      /* .. result is 0 */
7013       dn->digits=1;	      /* .. */
7014       }
7015      else {		      /* shift to least */
7016       count=set->digits;      /* now digits to end up with */
7017       dn->digits=count;	      /* set the new length */
7018       up++;		      /* move to next */
7019       /* on unit boundary, so shift-down copy loop is simple */
7020       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7021 	*target=*up;
7022       }
7023     } /* unit-boundary case */
7024 
7025    else { /* discard digit is in low digit(s), and not top digit */
7026     uInt  discard1;		   /* first discarded digit */
7027     uInt  quot, rem;		   /* for divisions */
7028     if (cut==0) quot=*up;	   /* is at bottom of unit */
7029      else /* cut>0 */ {		   /* it's not at bottom of unit */
7030       #if DECDPUN<=4
7031 	quot=QUOT10(*up, cut);
7032 	rem=*up-quot*powers[cut];
7033       #else
7034 	rem=*up%powers[cut];
7035 	quot=*up/powers[cut];
7036       #endif
7037       if (rem!=0) *residue=1;
7038       }
7039     /* discard digit is now at bottom of quot */
7040     #if DECDPUN<=4
7041       temp=(quot*6554)>>16;	   /* fast /10 */
7042       /* Vowels algorithm here not a win (9 instructions) */
7043       discard1=quot-X10(temp);
7044       quot=temp;
7045     #else
7046       discard1=quot%10;
7047       quot=quot/10;
7048     #endif
7049     /* here, discard1 is the guard digit, and residue is everything */
7050     /* else [use mapping array to accumulate residue safely] */
7051     *residue+=resmap[discard1];
7052     cut++;			   /* update cut */
7053     /* here: up -> Unit of the array with bottom digit */
7054     /*	     cut is the division point for each Unit */
7055     /*	     quot holds the uncut high-order digits for the current unit */
7056     if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
7057       *dn->lsu=0;		   /* .. result is 0 */
7058       dn->digits=1;		   /* .. */
7059       }
7060      else {			   /* shift to least needed */
7061       count=set->digits;	   /* now digits to end up with */
7062       dn->digits=count;		   /* set the new length */
7063       /* shift-copy the coefficient array to the result number */
7064       for (target=dn->lsu; ; target++) {
7065 	*target=(Unit)quot;
7066 	count-=(DECDPUN-cut);
7067 	if (count<=0) break;
7068 	up++;
7069 	quot=*up;
7070 	#if DECDPUN<=4
7071 	  quot=QUOT10(quot, cut);
7072 	  rem=*up-quot*powers[cut];
7073 	#else
7074 	  rem=quot%powers[cut];
7075 	  quot=quot/powers[cut];
7076 	#endif
7077 	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7078 	count-=cut;
7079 	if (count<=0) break;
7080 	} /* shift-copy loop */
7081       } /* shift to least */
7082     } /* not unit boundary */
7083 
7084   if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7085   return;
7086   } /* decSetCoeff */
7087 
7088 /* ------------------------------------------------------------------ */
7089 /* decApplyRound -- apply pending rounding to a number		      */
7090 /*								      */
7091 /*   dn	   is the number, with space for set->digits digits	      */
7092 /*   set   is the context [for size and rounding mode]		      */
7093 /*   residue indicates pending rounding, being any accumulated	      */
7094 /*	   guard and sticky information.  It may be:		      */
7095 /*	   6-9: rounding digit is >5				      */
7096 /*	   5:	rounding digit is exactly half-way		      */
7097 /*	   1-4: rounding digit is <5 and >0			      */
7098 /*	   0:	the coefficient is exact			      */
7099 /*	  -1:	as 1, but the hidden digits are subtractive, that     */
7100 /*		is, of the opposite sign to dn.	 In this case the     */
7101 /*		coefficient must be non-0.  This case occurs when     */
7102 /*		subtracting a small number (which can be reduced to   */
7103 /*		a sticky bit); see decAddOp.			      */
7104 /*   status is the status accumulator, as usual			      */
7105 /*								      */
7106 /* This routine applies rounding while keeping the length of the      */
7107 /* coefficient constant.  The exponent and status are unchanged	      */
7108 /* except if:							      */
7109 /*								      */
7110 /*   -- the coefficient was increased and is all nines (in which      */
7111 /*	case Overflow could occur, and is handled directly here so    */
7112 /*	the caller does not need to re-test for overflow)	      */
7113 /*								      */
7114 /*   -- the coefficient was decreased and becomes all nines (in which */
7115 /*	case Underflow could occur, and is also handled directly).    */
7116 /*								      */
7117 /* All fields in dn are updated as required.			      */
7118 /*								      */
7119 /* ------------------------------------------------------------------ */
7120 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7121 			  uInt *status) {
7122   Int  bump;		      /* 1 if coefficient needs to be incremented */
7123 			      /* -1 if coefficient needs to be decremented */
7124 
7125   if (residue==0) return;     /* nothing to apply */
7126 
7127   bump=0;		      /* assume a smooth ride */
7128 
7129   /* now decide whether, and how, to round, depending on mode */
7130   switch (set->round) {
7131     case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
7132       /* This is the same as DEC_ROUND_DOWN unless there is a */
7133       /* positive residue and the lsd of dn is 0 or 5, in which case */
7134       /* it is bumped; when residue is <0, the number is therefore */
7135       /* bumped down unless the final digit was 1 or 6 (in which */
7136       /* case it is bumped down and then up -- a no-op) */
7137       Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
7138       if (residue<0 && lsd5!=1) bump=-1;
7139        else if (residue>0 && lsd5==0) bump=1;
7140       /* [bump==1 could be applied directly; use common path for clarity] */
7141       break;} /* r-05 */
7142 
7143     case DEC_ROUND_DOWN: {
7144       /* no change, except if negative residue */
7145       if (residue<0) bump=-1;
7146       break;} /* r-d */
7147 
7148     case DEC_ROUND_HALF_DOWN: {
7149       if (residue>5) bump=1;
7150       break;} /* r-h-d */
7151 
7152     case DEC_ROUND_HALF_EVEN: {
7153       if (residue>5) bump=1;		/* >0.5 goes up */
7154        else if (residue==5) {		/* exactly 0.5000... */
7155 	/* 0.5 goes up iff [new] lsd is odd */
7156 	if (*dn->lsu & 0x01) bump=1;
7157 	}
7158       break;} /* r-h-e */
7159 
7160     case DEC_ROUND_HALF_UP: {
7161       if (residue>=5) bump=1;
7162       break;} /* r-h-u */
7163 
7164     case DEC_ROUND_UP: {
7165       if (residue>0) bump=1;
7166       break;} /* r-u */
7167 
7168     case DEC_ROUND_CEILING: {
7169       /* same as _UP for positive numbers, and as _DOWN for negatives */
7170       /* [negative residue cannot occur on 0] */
7171       if (decNumberIsNegative(dn)) {
7172 	if (residue<0) bump=-1;
7173 	}
7174        else {
7175 	if (residue>0) bump=1;
7176 	}
7177       break;} /* r-c */
7178 
7179     case DEC_ROUND_FLOOR: {
7180       /* same as _UP for negative numbers, and as _DOWN for positive */
7181       /* [negative residue cannot occur on 0] */
7182       if (!decNumberIsNegative(dn)) {
7183 	if (residue<0) bump=-1;
7184 	}
7185        else {
7186 	if (residue>0) bump=1;
7187 	}
7188       break;} /* r-f */
7189 
7190     default: {	    /* e.g., DEC_ROUND_MAX */
7191       *status|=DEC_Invalid_context;
7192       #if DECTRACE || (DECCHECK && DECVERB)
7193       printf("Unknown rounding mode: %d\n", set->round);
7194       #endif
7195       break;}
7196     } /* switch */
7197 
7198   /* now bump the number, up or down, if need be */
7199   if (bump==0) return;			     /* no action required */
7200 
7201   /* Simply use decUnitAddSub unless bumping up and the number is */
7202   /* all nines.	 In this special case set to 100... explicitly */
7203   /* and adjust the exponent by one (as otherwise could overflow */
7204   /* the array) */
7205   /* Similarly handle all-nines result if bumping down. */
7206   if (bump>0) {
7207     Unit *up;				     /* work */
7208     uInt count=dn->digits;		     /* digits to be checked */
7209     for (up=dn->lsu; ; up++) {
7210       if (count<=DECDPUN) {
7211 	/* this is the last Unit (the msu) */
7212 	if (*up!=powers[count]-1) break;     /* not still 9s */
7213 	/* here if it, too, is all nines */
7214 	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
7215 	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7216 	dn->exponent++;			     /* and bump exponent */
7217 	/* [which, very rarely, could cause Overflow...] */
7218 	if ((dn->exponent+dn->digits)>set->emax+1) {
7219 	  decSetOverflow(dn, set, status);
7220 	  }
7221 	return;				     /* done */
7222 	}
7223       /* a full unit to check, with more to come */
7224       if (*up!=DECDPUNMAX) break;	     /* not still 9s */
7225       count-=DECDPUN;
7226       } /* up */
7227     } /* bump>0 */
7228    else {				     /* -1 */
7229     /* here checking for a pre-bump of 1000... (leading 1, all */
7230     /* other digits zero) */
7231     Unit *up, *sup;			     /* work */
7232     uInt count=dn->digits;		     /* digits to be checked */
7233     for (up=dn->lsu; ; up++) {
7234       if (count<=DECDPUN) {
7235 	/* this is the last Unit (the msu) */
7236 	if (*up!=powers[count-1]) break;     /* not 100.. */
7237 	/* here if have the 1000... case */
7238 	sup=up;				     /* save msu pointer */
7239 	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
7240 	/* others all to all-nines, too */
7241 	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7242 	dn->exponent--;			     /* and bump exponent */
7243 
7244 	/* iff the number was at the subnormal boundary (exponent=etiny) */
7245 	/* then the exponent is now out of range, so it will in fact get */
7246 	/* clamped to etiny and the final 9 dropped. */
7247 	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7248 	/*	  dn->exponent, set->digits); */
7249 	if (dn->exponent+1==set->emin-set->digits+1) {
7250 	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
7251 	   else {
7252 	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
7253 	    dn->digits--;
7254 	    }
7255 	  dn->exponent++;
7256 	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7257 	  }
7258 	return;				     /* done */
7259 	}
7260 
7261       /* a full unit to check, with more to come */
7262       if (*up!=0) break;		     /* not still 0s */
7263       count-=DECDPUN;
7264       } /* up */
7265 
7266     } /* bump<0 */
7267 
7268   /* Actual bump needed.  Do it. */
7269   decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7270   } /* decApplyRound */
7271 
7272 #if DECSUBSET
7273 /* ------------------------------------------------------------------ */
7274 /* decFinish -- finish processing a number			      */
7275 /*								      */
7276 /*   dn is the number						      */
7277 /*   set is the context						      */
7278 /*   residue is the rounding accumulator (as in decApplyRound)	      */
7279 /*   status is the accumulator					      */
7280 /*								      */
7281 /* This finishes off the current number by:			      */
7282 /*    1. If not extended:					      */
7283 /*	 a. Converting a zero result to clean '0'		      */
7284 /*	 b. Reducing positive exponents to 0, if would fit in digits  */
7285 /*    2. Checking for overflow and subnormals (always)		      */
7286 /* Note this is just Finalize when no subset arithmetic.	      */
7287 /* All fields are updated as required.				      */
7288 /* ------------------------------------------------------------------ */
7289 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7290 		      uInt *status) {
7291   if (!set->extended) {
7292     if ISZERO(dn) {		   /* value is zero */
7293       dn->exponent=0;		   /* clean exponent .. */
7294       dn->bits=0;		   /* .. and sign */
7295       return;			   /* no error possible */
7296       }
7297     if (dn->exponent>=0) {	   /* non-negative exponent */
7298       /* >0; reduce to integer if possible */
7299       if (set->digits >= (dn->exponent+dn->digits)) {
7300 	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7301 	dn->exponent=0;
7302 	}
7303       }
7304     } /* !extended */
7305 
7306   decFinalize(dn, set, residue, status);
7307   } /* decFinish */
7308 #endif
7309 
7310 /* ------------------------------------------------------------------ */
7311 /* decFinalize -- final check, clamp, and round of a number	      */
7312 /*								      */
7313 /*   dn is the number						      */
7314 /*   set is the context						      */
7315 /*   residue is the rounding accumulator (as in decApplyRound)	      */
7316 /*   status is the status accumulator				      */
7317 /*								      */
7318 /* This finishes off the current number by checking for subnormal     */
7319 /* results, applying any pending rounding, checking for overflow,     */
7320 /* and applying any clamping.					      */
7321 /* Underflow and overflow conditions are raised as appropriate.	      */
7322 /* All fields are updated as required.				      */
7323 /* ------------------------------------------------------------------ */
7324 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7325 			uInt *status) {
7326   Int shift;				/* shift needed if clamping */
7327   Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */
7328 
7329   /* Must be careful, here, when checking the exponent as the */
7330   /* adjusted exponent could overflow 31 bits [because it may already */
7331   /* be up to twice the expected]. */
7332 
7333   /* First test for subnormal.	This must be done before any final */
7334   /* round as the result could be rounded to Nmin or 0. */
7335   if (dn->exponent<=tinyexp) {		/* prefilter */
7336     Int comp;
7337     decNumber nmin;
7338     /* A very nasty case here is dn == Nmin and residue<0 */
7339     if (dn->exponent<tinyexp) {
7340       /* Go handle subnormals; this will apply round if needed. */
7341       decSetSubnormal(dn, set, residue, status);
7342       return;
7343       }
7344     /* Equals case: only subnormal if dn=Nmin and negative residue */
7345     decNumberZero(&nmin);
7346     nmin.lsu[0]=1;
7347     nmin.exponent=set->emin;
7348     comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
7349     if (comp==BADINT) {				  /* oops */
7350       *status|=DEC_Insufficient_storage;	  /* abandon... */
7351       return;
7352       }
7353     if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
7354       decApplyRound(dn, set, *residue, status);	  /* might force down */
7355       decSetSubnormal(dn, set, residue, status);
7356       return;
7357       }
7358     }
7359 
7360   /* now apply any pending round (this could raise overflow). */
7361   if (*residue!=0) decApplyRound(dn, set, *residue, status);
7362 
7363   /* Check for overflow [redundant in the 'rare' case] or clamp */
7364   if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
7365 
7366 
7367   /* here when might have an overflow or clamp to do */
7368   if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
7369     decSetOverflow(dn, set, status);
7370     return;
7371     }
7372   /* here when the result is normal but in clamp range */
7373   if (!set->clamp) return;
7374 
7375   /* here when need to apply the IEEE exponent clamp (fold-down) */
7376   shift=dn->exponent-(set->emax-set->digits+1);
7377 
7378   /* shift coefficient (if non-zero) */
7379   if (!ISZERO(dn)) {
7380     dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7381     }
7382   dn->exponent-=shift;	 /* adjust the exponent to match */
7383   *status|=DEC_Clamped;	 /* and record the dirty deed */
7384   return;
7385   } /* decFinalize */
7386 
7387 /* ------------------------------------------------------------------ */
7388 /* decSetOverflow -- set number to proper overflow value	      */
7389 /*								      */
7390 /*   dn is the number (used for sign [only] and result)		      */
7391 /*   set is the context [used for the rounding mode, etc.]	      */
7392 /*   status contains the current status to be updated		      */
7393 /*								      */
7394 /* This sets the sign of a number and sets its value to either	      */
7395 /* Infinity or the maximum finite value, depending on the sign of     */
7396 /* dn and the rounding mode, following IEEE 854 rules.		      */
7397 /* ------------------------------------------------------------------ */
7398 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7399   Flag needmax=0;		   /* result is maximum finite value */
7400   uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */
7401 
7402   if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
7403     Int emax=set->emax;			     /* limit value */
7404     if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
7405     if (dn->exponent>emax) {		     /* clamp required */
7406       dn->exponent=emax;
7407       *status|=DEC_Clamped;
7408       }
7409     return;
7410     }
7411 
7412   decNumberZero(dn);
7413   switch (set->round) {
7414     case DEC_ROUND_DOWN: {
7415       needmax=1;		   /* never Infinity */
7416       break;} /* r-d */
7417     case DEC_ROUND_05UP: {
7418       needmax=1;		   /* never Infinity */
7419       break;} /* r-05 */
7420     case DEC_ROUND_CEILING: {
7421       if (sign) needmax=1;	   /* Infinity if non-negative */
7422       break;} /* r-c */
7423     case DEC_ROUND_FLOOR: {
7424       if (!sign) needmax=1;	   /* Infinity if negative */
7425       break;} /* r-f */
7426     default: break;		   /* Infinity in all other cases */
7427     }
7428   if (needmax) {
7429     decSetMaxValue(dn, set);
7430     dn->bits=sign;		   /* set sign */
7431     }
7432    else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
7433   *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7434   } /* decSetOverflow */
7435 
7436 /* ------------------------------------------------------------------ */
7437 /* decSetMaxValue -- set number to +Nmax (maximum normal value)	      */
7438 /*								      */
7439 /*   dn is the number to set					      */
7440 /*   set is the context [used for digits and emax]		      */
7441 /*								      */
7442 /* This sets the number to the maximum positive value.		      */
7443 /* ------------------------------------------------------------------ */
7444 static void decSetMaxValue(decNumber *dn, decContext *set) {
7445   Unit *up;			   /* work */
7446   Int count=set->digits;	   /* nines to add */
7447   dn->digits=count;
7448   /* fill in all nines to set maximum value */
7449   for (up=dn->lsu; ; up++) {
7450     if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
7451      else {				/* this is the msu */
7452       *up=(Unit)(powers[count]-1);
7453       break;
7454       }
7455     count-=DECDPUN;		   /* filled those digits */
7456     } /* up */
7457   dn->bits=0;			   /* + sign */
7458   dn->exponent=set->emax-set->digits+1;
7459   } /* decSetMaxValue */
7460 
7461 /* ------------------------------------------------------------------ */
7462 /* decSetSubnormal -- process value whose exponent is <Emin	      */
7463 /*								      */
7464 /*   dn is the number (used as input as well as output; it may have   */
7465 /*	   an allowed subnormal value, which may need to be rounded)  */
7466 /*   set is the context [used for the rounding mode]		      */
7467 /*   residue is any pending residue				      */
7468 /*   status contains the current status to be updated		      */
7469 /*								      */
7470 /* If subset mode, set result to zero and set Underflow flags.	      */
7471 /*								      */
7472 /* Value may be zero with a low exponent; this does not set Subnormal */
7473 /* but the exponent will be clamped to Etiny.			      */
7474 /*								      */
7475 /* Otherwise ensure exponent is not out of range, and round as	      */
7476 /* necessary.  Underflow is set if the result is Inexact.	      */
7477 /* ------------------------------------------------------------------ */
7478 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7479 			    uInt *status) {
7480   decContext workset;	      /* work */
7481   Int	     etiny, adjust;   /* .. */
7482 
7483   #if DECSUBSET
7484   /* simple set to zero and 'hard underflow' for subset */
7485   if (!set->extended) {
7486     decNumberZero(dn);
7487     /* always full overflow */
7488     *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7489     return;
7490     }
7491   #endif
7492 
7493   /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7494   /* (Etiny) if needed */
7495   etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */
7496 
7497   if ISZERO(dn) {			/* value is zero */
7498     /* residue can never be non-zero here */
7499     #if DECCHECK
7500       if (*residue!=0) {
7501 	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7502 	*status|=DEC_Invalid_operation;
7503 	}
7504     #endif
7505     if (dn->exponent<etiny) {		/* clamp required */
7506       dn->exponent=etiny;
7507       *status|=DEC_Clamped;
7508       }
7509     return;
7510     }
7511 
7512   *status|=DEC_Subnormal;		/* have a non-zero subnormal */
7513   adjust=etiny-dn->exponent;		/* calculate digits to remove */
7514   if (adjust<=0) {			/* not out of range; unrounded */
7515     /* residue can never be non-zero here, except in the Nmin-residue */
7516     /* case (which is a subnormal result), so can take fast-path here */
7517     /* it may already be inexact (from setting the coefficient) */
7518     if (*status&DEC_Inexact) *status|=DEC_Underflow;
7519     return;
7520     }
7521 
7522   /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7523   /* [this code is similar to that in rescale] */
7524   workset=*set;				/* clone rounding, etc. */
7525   workset.digits=dn->digits-adjust;	/* set requested length */
7526   workset.emin-=adjust;			/* and adjust emin to match */
7527   /* [note that the latter can be <1, here, similar to Rescale case] */
7528   decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7529   decApplyRound(dn, &workset, *residue, status);
7530 
7531   /* Use 754R/854 default rule: Underflow is set iff Inexact */
7532   /* [independent of whether trapped] */
7533   if (*status&DEC_Inexact) *status|=DEC_Underflow;
7534 
7535   /* if rounded up a 999s case, exponent will be off by one; adjust */
7536   /* back if so [it will fit, because it was shortened earlier] */
7537   if (dn->exponent>etiny) {
7538     dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7539     dn->exponent--;			/* (re)adjust the exponent. */
7540     }
7541 
7542   /* if rounded to zero, it is by definition clamped... */
7543   if (ISZERO(dn)) *status|=DEC_Clamped;
7544   } /* decSetSubnormal */
7545 
7546 /* ------------------------------------------------------------------ */
7547 /* decCheckMath - check entry conditions for a math function	      */
7548 /*								      */
7549 /*   This checks the context and the operand			      */
7550 /*								      */
7551 /*   rhs is the operand to check				      */
7552 /*   set is the context to check				      */
7553 /*   status is unchanged if both are good			      */
7554 /*								      */
7555 /* returns non-zero if status is changed, 0 otherwise		      */
7556 /*								      */
7557 /* Restrictions enforced:					      */
7558 /*								      */
7559 /*   digits, emax, and -emin in the context must be less than	      */
7560 /*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
7561 /*   non-zero.	Invalid_operation is set in the status if a	      */
7562 /*   restriction is violated.					      */
7563 /* ------------------------------------------------------------------ */
7564 static uInt decCheckMath(const decNumber *rhs, decContext *set,
7565 			 uInt *status) {
7566   uInt save=*status;			     /* record */
7567   if (set->digits>DEC_MAX_MATH
7568    || set->emax>DEC_MAX_MATH
7569    || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7570    else if ((rhs->digits>DEC_MAX_MATH
7571      || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7572      || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7573      && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7574   return (*status!=save);
7575   } /* decCheckMath */
7576 
7577 /* ------------------------------------------------------------------ */
7578 /* decGetInt -- get integer from a number			      */
7579 /*								      */
7580 /*   dn is the number [which will not be altered]		      */
7581 /*								      */
7582 /*   returns one of:						      */
7583 /*     BADINT if there is a non-zero fraction			      */
7584 /*     the converted integer					      */
7585 /*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
7586 /*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
7587 /*								      */
7588 /* This checks and gets a whole number from the input decNumber.      */
7589 /* The sign can be determined from dn by the caller when BIGEVEN or   */
7590 /* BIGODD is returned.						      */
7591 /* ------------------------------------------------------------------ */
7592 static Int decGetInt(const decNumber *dn) {
7593   Int  theInt;				/* result accumulator */
7594   const Unit *up;			/* work */
7595   Int  got;				/* digits (real or not) processed */
7596   Int  ilength=dn->digits+dn->exponent; /* integral length */
7597   Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */
7598 
7599   /* The number must be an integer that fits in 10 digits */
7600   /* Assert, here, that 10 is enough for any rescale Etiny */
7601   #if DEC_MAX_EMAX > 999999999
7602     #error GetInt may need updating [for Emax]
7603   #endif
7604   #if DEC_MIN_EMIN < -999999999
7605     #error GetInt may need updating [for Emin]
7606   #endif
7607   if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */
7608 
7609   up=dn->lsu;				/* ready for lsu */
7610   theInt=0;				/* ready to accumulate */
7611   if (dn->exponent>=0) {		/* relatively easy */
7612     /* no fractional part [usual]; allow for positive exponent */
7613     got=dn->exponent;
7614     }
7615    else { /* -ve exponent; some fractional part to check and discard */
7616     Int count=-dn->exponent;		/* digits to discard */
7617     /* spin up whole units until reach the Unit with the unit digit */
7618     for (; count>=DECDPUN; up++) {
7619       if (*up!=0) return BADINT;	/* non-zero Unit to discard */
7620       count-=DECDPUN;
7621       }
7622     if (count==0) got=0;		/* [a multiple of DECDPUN] */
7623      else {				/* [not multiple of DECDPUN] */
7624       Int rem;				/* work */
7625       /* slice off fraction digits and check for non-zero */
7626       #if DECDPUN<=4
7627 	theInt=QUOT10(*up, count);
7628 	rem=*up-theInt*powers[count];
7629       #else
7630 	rem=*up%powers[count];		/* slice off discards */
7631 	theInt=*up/powers[count];
7632       #endif
7633       if (rem!=0) return BADINT;	/* non-zero fraction */
7634       /* it looks good */
7635       got=DECDPUN-count;		/* number of digits so far */
7636       up++;				/* ready for next */
7637       }
7638     }
7639   /* now it's known there's no fractional part */
7640 
7641   /* tricky code now, to accumulate up to 9.3 digits */
7642   if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7643 
7644   if (ilength<11) {
7645     Int save=theInt;
7646     /* collect any remaining unit(s) */
7647     for (; got<ilength; up++) {
7648       theInt+=*up*powers[got];
7649       got+=DECDPUN;
7650       }
7651     if (ilength==10) {			/* need to check for wrap */
7652       if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7653 	 /* [that test also disallows the BADINT result case] */
7654        else if (neg && theInt>1999999997) ilength=11;
7655        else if (!neg && theInt>999999999) ilength=11;
7656       if (ilength==11) theInt=save;	/* restore correct low bit */
7657       }
7658     }
7659 
7660   if (ilength>10) {			/* too big */
7661     if (theInt&1) return BIGODD;	/* bottom bit 1 */
7662     return BIGEVEN;			/* bottom bit 0 */
7663     }
7664 
7665   if (neg) theInt=-theInt;		/* apply sign */
7666   return theInt;
7667   } /* decGetInt */
7668 
7669 /* ------------------------------------------------------------------ */
7670 /* decDecap -- decapitate the coefficient of a number		      */
7671 /*								      */
7672 /*   dn	  is the number to be decapitated			      */
7673 /*   drop is the number of digits to be removed from the left of dn;  */
7674 /*     this must be <= dn->digits (if equal, the coefficient is	      */
7675 /*     set to 0)						      */
7676 /*								      */
7677 /* Returns dn; dn->digits will be <= the initial digits less drop     */
7678 /* (after removing drop digits there may be leading zero digits	      */
7679 /* which will also be removed).	 Only dn->lsu and dn->digits change.  */
7680 /* ------------------------------------------------------------------ */
7681 static decNumber *decDecap(decNumber *dn, Int drop) {
7682   Unit *msu;				/* -> target cut point */
7683   Int cut;				/* work */
7684   if (drop>=dn->digits) {		/* losing the whole thing */
7685     #if DECCHECK
7686     if (drop>dn->digits)
7687       printf("decDecap called with drop>digits [%ld>%ld]\n",
7688 	     (LI)drop, (LI)dn->digits);
7689     #endif
7690     dn->lsu[0]=0;
7691     dn->digits=1;
7692     return dn;
7693     }
7694   msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
7695   cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
7696   if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
7697   /* that may have left leading zero digits, so do a proper count... */
7698   dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7699   return dn;
7700   } /* decDecap */
7701 
7702 /* ------------------------------------------------------------------ */
7703 /* decBiStr -- compare string with pairwise options		      */
7704 /*								      */
7705 /*   targ is the string to compare				      */
7706 /*   str1 is one of the strings to compare against (length may be 0)  */
7707 /*   str2 is the other; it must be the same length as str1	      */
7708 /*								      */
7709 /*   returns 1 if strings compare equal, (that is, it is the same     */
7710 /*   length as str1 and str2, and each character of targ is in either */
7711 /*   str1 or str2 in the corresponding position), or 0 otherwise      */
7712 /*								      */
7713 /* This is used for generic caseless compare, including the awkward   */
7714 /* case of the Turkish dotted and dotless Is.  Use as (for example):  */
7715 /*   if (decBiStr(test, "mike", "MIKE")) ...			      */
7716 /* ------------------------------------------------------------------ */
7717 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7718   for (;;targ++, str1++, str2++) {
7719     if (*targ!=*str1 && *targ!=*str2) return 0;
7720     /* *targ has a match in one (or both, if terminator) */
7721     if (*targ=='\0') break;
7722     } /* forever */
7723   return 1;
7724   } /* decBiStr */
7725 
7726 /* ------------------------------------------------------------------ */
7727 /* decNaNs -- handle NaN operand or operands			      */
7728 /*								      */
7729 /*   res     is the result number				      */
7730 /*   lhs     is the first operand				      */
7731 /*   rhs     is the second operand, or NULL if none		      */
7732 /*   context is used to limit payload length			      */
7733 /*   status  contains the current status			      */
7734 /*   returns res in case convenient				      */
7735 /*								      */
7736 /* Called when one or both operands is a NaN, and propagates the      */
7737 /* appropriate result to res.  When an sNaN is found, it is changed   */
7738 /* to a qNaN and Invalid operation is set.			      */
7739 /* ------------------------------------------------------------------ */
7740 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7741 			   const decNumber *rhs, decContext *set,
7742 			   uInt *status) {
7743   /* This decision tree ends up with LHS being the source pointer, */
7744   /* and status updated if need be */
7745   if (lhs->bits & DECSNAN)
7746     *status|=DEC_Invalid_operation | DEC_sNaN;
7747    else if (rhs==NULL);
7748    else if (rhs->bits & DECSNAN) {
7749     lhs=rhs;
7750     *status|=DEC_Invalid_operation | DEC_sNaN;
7751     }
7752    else if (lhs->bits & DECNAN);
7753    else lhs=rhs;
7754 
7755   /* propagate the payload */
7756   if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
7757    else { /* too long */
7758     const Unit *ul;
7759     Unit *ur, *uresp1;
7760     /* copy safe number of units, then decapitate */
7761     res->bits=lhs->bits;		/* need sign etc. */
7762     uresp1=res->lsu+D2U(set->digits);
7763     for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7764     res->digits=D2U(set->digits)*DECDPUN;
7765     /* maybe still too long */
7766     if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7767     }
7768 
7769   res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
7770   res->bits|=DECNAN;	      /* .. preserving sign */
7771   res->exponent=0;	      /* clean exponent */
7772 			      /* [coefficient was copied/decapitated] */
7773   return res;
7774   } /* decNaNs */
7775 
7776 /* ------------------------------------------------------------------ */
7777 /* decStatus -- apply non-zero status				      */
7778 /*								      */
7779 /*   dn	    is the number to set if error			      */
7780 /*   status contains the current status (not yet in context)	      */
7781 /*   set    is the context					      */
7782 /*								      */
7783 /* If the status is an error status, the number is set to a NaN,      */
7784 /* unless the error was an overflow, divide-by-zero, or underflow,    */
7785 /* in which case the number will have already been set.		      */
7786 /*								      */
7787 /* The context status is then updated with the new status.  Note that */
7788 /* this may raise a signal, so control may never return from this     */
7789 /* routine (hence resources must be recovered before it is called).   */
7790 /* ------------------------------------------------------------------ */
7791 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7792   if (status & DEC_NaNs) {		/* error status -> NaN */
7793     /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7794     if (status & DEC_sNaN) status&=~DEC_sNaN;
7795      else {
7796       decNumberZero(dn);		/* other error: clean throughout */
7797       dn->bits=DECNAN;			/* and make a quiet NaN */
7798       }
7799     }
7800   decContextSetStatus(set, status);	/* [may not return] */
7801   return;
7802   } /* decStatus */
7803 
7804 /* ------------------------------------------------------------------ */
7805 /* decGetDigits -- count digits in a Units array		      */
7806 /*								      */
7807 /*   uar is the Unit array holding the number (this is often an	      */
7808 /*	    accumulator of some sort)				      */
7809 /*   len is the length of the array in units [>=1]		      */
7810 /*								      */
7811 /*   returns the number of (significant) digits in the array	      */
7812 /*								      */
7813 /* All leading zeros are excluded, except the last if the array has   */
7814 /* only zero Units.						      */
7815 /* ------------------------------------------------------------------ */
7816 /* This may be called twice during some operations. */
7817 static Int decGetDigits(Unit *uar, Int len) {
7818   Unit *up=uar+(len-1);		   /* -> msu */
7819   Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
7820   #if DECDPUN>4
7821   uInt const *pow;		   /* work */
7822   #endif
7823 				   /* (at least 1 in final msu) */
7824   #if DECCHECK
7825   if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7826   #endif
7827 
7828   for (; up>=uar; up--) {
7829     if (*up==0) {		   /* unit is all 0s */
7830       if (digits==1) break;	   /* a zero has one digit */
7831       digits-=DECDPUN;		   /* adjust for 0 unit */
7832       continue;}
7833     /* found the first (most significant) non-zero Unit */
7834     #if DECDPUN>1		   /* not done yet */
7835     if (*up<10) break;		   /* is 1-9 */
7836     digits++;
7837     #if DECDPUN>2		   /* not done yet */
7838     if (*up<100) break;		   /* is 10-99 */
7839     digits++;
7840     #if DECDPUN>3		   /* not done yet */
7841     if (*up<1000) break;	   /* is 100-999 */
7842     digits++;
7843     #if DECDPUN>4		   /* count the rest ... */
7844     for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7845     #endif
7846     #endif
7847     #endif
7848     #endif
7849     break;
7850     } /* up */
7851   return digits;
7852   } /* decGetDigits */
7853 
7854 #if DECTRACE | DECCHECK
7855 /* ------------------------------------------------------------------ */
7856 /* decNumberShow -- display a number [debug aid]		      */
7857 /*   dn is the number to show					      */
7858 /*								      */
7859 /* Shows: sign, exponent, coefficient (msu first), digits	      */
7860 /*    or: sign, special-value					      */
7861 /* ------------------------------------------------------------------ */
7862 /* this is public so other modules can use it */
7863 void decNumberShow(const decNumber *dn) {
7864   const Unit *up;		   /* work */
7865   uInt u, d;			   /* .. */
7866   Int cut;			   /* .. */
7867   char isign='+';		   /* main sign */
7868   if (dn==NULL) {
7869     printf("NULL\n");
7870     return;}
7871   if (decNumberIsNegative(dn)) isign='-';
7872   printf(" >> %c ", isign);
7873   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
7874     if (decNumberIsInfinite(dn)) printf("Infinity");
7875      else {				     /* a NaN */
7876       if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
7877        else printf("NaN");
7878       }
7879     /* if coefficient and exponent are 0, no more to do */
7880     if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
7881       printf("\n");
7882       return;}
7883     /* drop through to report other information */
7884     printf(" ");
7885     }
7886 
7887   /* now carefully display the coefficient */
7888   up=dn->lsu+D2U(dn->digits)-1;		/* msu */
7889   printf("%ld", (LI)*up);
7890   for (up=up-1; up>=dn->lsu; up--) {
7891     u=*up;
7892     printf(":");
7893     for (cut=DECDPUN-1; cut>=0; cut--) {
7894       d=u/powers[cut];
7895       u-=d*powers[cut];
7896       printf("%ld", (LI)d);
7897       } /* cut */
7898     } /* up */
7899   if (dn->exponent!=0) {
7900     char esign='+';
7901     if (dn->exponent<0) esign='-';
7902     printf(" E%c%ld", esign, (LI)abs(dn->exponent));
7903     }
7904   printf(" [%ld]\n", (LI)dn->digits);
7905   } /* decNumberShow */
7906 #endif
7907 
7908 #if DECTRACE || DECCHECK
7909 /* ------------------------------------------------------------------ */
7910 /* decDumpAr -- display a unit array [debug/check aid]		      */
7911 /*   name is a single-character tag name			      */
7912 /*   ar	  is the array to display				      */
7913 /*   len  is the length of the array in Units			      */
7914 /* ------------------------------------------------------------------ */
7915 static void decDumpAr(char name, const Unit *ar, Int len) {
7916   Int i;
7917   const char *spec;
7918   #if DECDPUN==9
7919     spec="%09d ";
7920   #elif DECDPUN==8
7921     spec="%08d ";
7922   #elif DECDPUN==7
7923     spec="%07d ";
7924   #elif DECDPUN==6
7925     spec="%06d ";
7926   #elif DECDPUN==5
7927     spec="%05d ";
7928   #elif DECDPUN==4
7929     spec="%04d ";
7930   #elif DECDPUN==3
7931     spec="%03d ";
7932   #elif DECDPUN==2
7933     spec="%02d ";
7934   #else
7935     spec="%d ";
7936   #endif
7937   printf("  :%c: ", name);
7938   for (i=len-1; i>=0; i--) {
7939     if (i==len-1) printf("%ld ", (LI)ar[i]);
7940      else printf(spec, ar[i]);
7941     }
7942   printf("\n");
7943   return;}
7944 #endif
7945 
7946 #if DECCHECK
7947 /* ------------------------------------------------------------------ */
7948 /* decCheckOperands -- check operand(s) to a routine		      */
7949 /*   res is the result structure (not checked; it will be set to      */
7950 /*	    quiet NaN if error found (and it is not NULL))	      */
7951 /*   lhs is the first operand (may be DECUNRESU)		      */
7952 /*   rhs is the second (may be DECUNUSED)			      */
7953 /*   set is the context (may be DECUNCONT)			      */
7954 /*   returns 0 if both operands, and the context are clean, or 1      */
7955 /*     otherwise (in which case the context will show an error,	      */
7956 /*     unless NULL).  Note that res is not cleaned; caller should     */
7957 /*     handle this so res=NULL case is safe.			      */
7958 /* The caller is expected to abandon immediately if 1 is returned.    */
7959 /* ------------------------------------------------------------------ */
7960 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7961 			     const decNumber *rhs, decContext *set) {
7962   Flag bad=0;
7963   if (set==NULL) {		   /* oops; hopeless */
7964     #if DECTRACE || DECVERB
7965     printf("Reference to context is NULL.\n");
7966     #endif
7967     bad=1;
7968     return 1;}
7969    else if (set!=DECUNCONT
7970      && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
7971     bad=1;
7972     #if DECTRACE || DECVERB
7973     printf("Bad context [digits=%ld round=%ld].\n",
7974 	   (LI)set->digits, (LI)set->round);
7975     #endif
7976     }
7977    else {
7978     if (res==NULL) {
7979       bad=1;
7980       #if DECTRACE
7981       /* this one not DECVERB as standard tests include NULL */
7982       printf("Reference to result is NULL.\n");
7983       #endif
7984       }
7985     if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
7986     if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
7987     }
7988   if (bad) {
7989     if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
7990     if (res!=DECUNRESU && res!=NULL) {
7991       decNumberZero(res);
7992       res->bits=DECNAN;	      /* qNaN */
7993       }
7994     }
7995   return bad;
7996   } /* decCheckOperands */
7997 
7998 /* ------------------------------------------------------------------ */
7999 /* decCheckNumber -- check a number				      */
8000 /*   dn is the number to check					      */
8001 /*   returns 0 if the number is clean, or 1 otherwise		      */
8002 /*								      */
8003 /* The number is considered valid if it could be a result from some   */
8004 /* operation in some valid context.				      */
8005 /* ------------------------------------------------------------------ */
8006 static Flag decCheckNumber(const decNumber *dn) {
8007   const Unit *up;	      /* work */
8008   uInt maxuint;		      /* .. */
8009   Int ae, d, digits;	      /* .. */
8010   Int emin, emax;	      /* .. */
8011 
8012   if (dn==NULL) {	      /* hopeless */
8013     #if DECTRACE
8014     /* this one not DECVERB as standard tests include NULL */
8015     printf("Reference to decNumber is NULL.\n");
8016     #endif
8017     return 1;}
8018 
8019   /* check special values */
8020   if (dn->bits & DECSPECIAL) {
8021     if (dn->exponent!=0) {
8022       #if DECTRACE || DECVERB
8023       printf("Exponent %ld (not 0) for a special value [%02x].\n",
8024 	     (LI)dn->exponent, dn->bits);
8025       #endif
8026       return 1;}
8027 
8028     /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
8029     if (decNumberIsInfinite(dn)) {
8030       if (dn->digits!=1) {
8031 	#if DECTRACE || DECVERB
8032 	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
8033 	#endif
8034 	return 1;}
8035       if (*dn->lsu!=0) {
8036 	#if DECTRACE || DECVERB
8037 	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
8038 	#endif
8039 	decDumpAr('I', dn->lsu, D2U(dn->digits));
8040 	return 1;}
8041       } /* Inf */
8042     /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8043     /*		   concrete formats (decimal64, etc.). */
8044     return 0;
8045     }
8046 
8047   /* check the coefficient */
8048   if (dn->digits<1 || dn->digits>DECNUMMAXP) {
8049     #if DECTRACE || DECVERB
8050     printf("Digits %ld in number.\n", (LI)dn->digits);
8051     #endif
8052     return 1;}
8053 
8054   d=dn->digits;
8055 
8056   for (up=dn->lsu; d>0; up++) {
8057     if (d>DECDPUN) maxuint=DECDPUNMAX;
8058      else {		      /* reached the msu */
8059       maxuint=powers[d]-1;
8060       if (dn->digits>1 && *up<powers[d-1]) {
8061 	#if DECTRACE || DECVERB
8062 	printf("Leading 0 in number.\n");
8063 	decNumberShow(dn);
8064 	#endif
8065 	return 1;}
8066       }
8067     if (*up>maxuint) {
8068       #if DECTRACE || DECVERB
8069       printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8070 	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8071       #endif
8072       return 1;}
8073     d-=DECDPUN;
8074     }
8075 
8076   /* check the exponent.  Note that input operands can have exponents */
8077   /* which are out of the set->emin/set->emax and set->digits range */
8078   /* (just as they can have more digits than set->digits). */
8079   ae=dn->exponent+dn->digits-1;	   /* adjusted exponent */
8080   emax=DECNUMMAXE;
8081   emin=DECNUMMINE;
8082   digits=DECNUMMAXP;
8083   if (ae<emin-(digits-1)) {
8084     #if DECTRACE || DECVERB
8085     printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8086     decNumberShow(dn);
8087     #endif
8088     return 1;}
8089   if (ae>+emax) {
8090     #if DECTRACE || DECVERB
8091     printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8092     decNumberShow(dn);
8093     #endif
8094     return 1;}
8095 
8096   return 0;		 /* it's OK */
8097   } /* decCheckNumber */
8098 
8099 /* ------------------------------------------------------------------ */
8100 /* decCheckInexact -- check a normal finite inexact result has digits */
8101 /*   dn is the number to check					      */
8102 /*   set is the context (for status and precision)		      */
8103 /*   sets Invalid operation, etc., if some digits are missing	      */
8104 /* [this check is not made for DECSUBSET compilation or when	      */
8105 /* subnormal is not set]					      */
8106 /* ------------------------------------------------------------------ */
8107 static void decCheckInexact(const decNumber *dn, decContext *set) {
8108   #if !DECSUBSET && DECEXTFLAG
8109     if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8110      && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8111       #if DECTRACE || DECVERB
8112       printf("Insufficient digits [%ld] on normal Inexact result.\n",
8113 	     (LI)dn->digits);
8114       decNumberShow(dn);
8115       #endif
8116       decContextSetStatus(set, DEC_Invalid_operation);
8117       }
8118   #else
8119     /* next is a noop for quiet compiler */
8120     if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8121   #endif
8122   return;
8123   } /* decCheckInexact */
8124 #endif
8125 
8126 #if DECALLOC
8127 #undef malloc
8128 #undef free
8129 /* ------------------------------------------------------------------ */
8130 /* decMalloc -- accountable allocation routine			      */
8131 /*   n is the number of bytes to allocate			      */
8132 /*								      */
8133 /* Semantics is the same as the stdlib malloc routine, but bytes      */
8134 /* allocated are accounted for globally, and corruption fences are    */
8135 /* added before and after the 'actual' storage.			      */
8136 /* ------------------------------------------------------------------ */
8137 /* This routine allocates storage with an extra twelve bytes; 8 are   */
8138 /* at the start and hold:					      */
8139 /*   0-3 the original length requested				      */
8140 /*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
8141 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8142 /* ------------------------------------------------------------------ */
8143 static void *decMalloc(size_t n) {
8144   uInt	size=n+12;		   /* true size */
8145   void	*alloc;			   /* -> allocated storage */
8146   uInt	*j;			   /* work */
8147   uByte *b, *b0;		   /* .. */
8148 
8149   alloc=malloc(size);		   /* -> allocated storage */
8150   if (alloc==NULL) return NULL;	   /* out of strorage */
8151   b0=(uByte *)alloc;		   /* as bytes */
8152   decAllocBytes+=n;		   /* account for storage */
8153   j=(uInt *)alloc;		   /* -> first four bytes */
8154   *j=n;				   /* save n */
8155   /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
8156   for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8157   for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8158   return b0+8;			   /* -> play area */
8159   } /* decMalloc */
8160 
8161 /* ------------------------------------------------------------------ */
8162 /* decFree -- accountable free routine				      */
8163 /*   alloc is the storage to free				      */
8164 /*								      */
8165 /* Semantics is the same as the stdlib malloc routine, except that    */
8166 /* the global storage accounting is updated and the fences are	      */
8167 /* checked to ensure that no routine has written 'out of bounds'.     */
8168 /* ------------------------------------------------------------------ */
8169 /* This routine first checks that the fences have not been corrupted. */
8170 /* It then frees the storage using the 'truw' storage address (that   */
8171 /* is, offset by 8).						      */
8172 /* ------------------------------------------------------------------ */
8173 static void decFree(void *alloc) {
8174   uInt	*j, n;			   /* pointer, original length */
8175   uByte *b, *b0;		   /* work */
8176 
8177   if (alloc==NULL) return;	   /* allowed; it's a nop */
8178   b0=(uByte *)alloc;		   /* as bytes */
8179   b0-=8;			   /* -> true start of storage */
8180   j=(uInt *)b0;			   /* -> first four bytes */
8181   n=*j;				   /* lift */
8182   for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8183     printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8184 	   b-b0-8, (Int)b0);
8185   for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8186     printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8187 	   b-b0-8, (Int)b0, n);
8188   free(b0);			   /* drop the storage */
8189   decAllocBytes-=n;		   /* account for storage */
8190   /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8191   } /* decFree */
8192 #define malloc(a) decMalloc(a)
8193 #define free(a) decFree(a)
8194 #endif
8195