xref: /openbmc/qemu/libdecnumber/decNumber.c (revision 38a01e55)
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 static 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 static const uShort LNnn[90] = {
5567   9016,  8652,  8316,  8008,  7724,  7456,  7208,
5568   6972,	 6748,	6540,  6340,  6148,  5968,  5792,  5628,  5464,	 5312,
5569   5164,	 5020,	4884,  4748,  4620,  4496,  4376,  4256,  4144,	 4032,
5570  39233, 38181, 37157, 36157, 35181, 34229, 33297, 32389, 31501, 30629,
5571  29777, 28945, 28129, 27329, 26545, 25777, 25021, 24281, 23553, 22837,
5572  22137, 21445, 20769, 20101, 19445, 18801, 18165, 17541, 16925, 16321,
5573  15721, 15133, 14553, 13985, 13421, 12865, 12317, 11777, 11241, 10717,
5574  10197,	 9685,	9177,  8677,  8185,  7697,  7213,  6737,  6269,	 5801,
5575   5341,	 4889,	4437, 39930, 35534, 31186, 26886, 22630, 18418, 14254,
5576  10130,	 6046, 20055};
5577 
5578 /* ------------------------------------------------------------------ */
5579 /* decLnOp -- effect natural logarithm				      */
5580 /*								      */
5581 /*   This computes C = ln(A)					      */
5582 /*								      */
5583 /*   res is C, the result.  C may be A				      */
5584 /*   rhs is A							      */
5585 /*   set is the context; note that rounding mode has no effect	      */
5586 /*								      */
5587 /* C must have space for set->digits digits.			      */
5588 /*								      */
5589 /* Notable cases:						      */
5590 /*   A<0 -> Invalid						      */
5591 /*   A=0 -> -Infinity (Exact)					      */
5592 /*   A=+Infinity -> +Infinity (Exact)				      */
5593 /*   A=1 exactly -> 0 (Exact)					      */
5594 /*								      */
5595 /* Restrictions (as for Exp):					      */
5596 /*								      */
5597 /*   digits, emax, and -emin in the context must be less than	      */
5598 /*   DEC_MAX_MATH+11 (1000010), and the rhs must be within these      */
5599 /*   bounds or a zero.	This is an internal routine, so these	      */
5600 /*   restrictions are contractual and not enforced.		      */
5601 /*								      */
5602 /* A finite result is rounded using DEC_ROUND_HALF_EVEN; it will      */
5603 /* almost always be correctly rounded, but may be up to 1 ulp in      */
5604 /* error in rare cases.						      */
5605 /* ------------------------------------------------------------------ */
5606 /* The result is calculated using Newton's method, with each	      */
5607 /* iteration calculating a' = a + x * exp(-a) - 1.  See, for example, */
5608 /* Epperson 1989.						      */
5609 /*								      */
5610 /* The iteration ends when the adjustment x*exp(-a)-1 is tiny enough. */
5611 /* This has to be calculated at the sum of the precision of x and the */
5612 /* working precision.						      */
5613 /*								      */
5614 /* Implementation notes:					      */
5615 /*								      */
5616 /* 1. This is separated out as decLnOp so it can be called from	      */
5617 /*    other Mathematical functions (e.g., Log 10) with a wider range  */
5618 /*    than normal.  In particular, it can handle the slightly wider   */
5619 /*    (+9+2) range needed by a power function.			      */
5620 /*								      */
5621 /* 2. The speed of this function is about 10x slower than exp, as     */
5622 /*    it typically needs 4-6 iterations for short numbers, and the    */
5623 /*    extra precision needed adds a squaring effect, twice.	      */
5624 /*								      */
5625 /* 3. Fastpaths are included for ln(10) and ln(2), up to length 40,   */
5626 /*    as these are common requests.  ln(10) is used by log10(x).      */
5627 /*								      */
5628 /* 4. An iteration might be saved by widening the LNnn table, and     */
5629 /*    would certainly save at least one if it were made ten times     */
5630 /*    bigger, too (for truncated fractions 0.100 through 0.999).      */
5631 /*    However, for most practical evaluations, at least four or five  */
5632 /*    iterations will be neede -- so this would only speed up by      */
5633 /*    20-25% and that probably does not justify increasing the table  */
5634 /*    size.							      */
5635 /*								      */
5636 /* 5. The static buffers are larger than might be expected to allow   */
5637 /*    for calls from decNumberPower.				      */
5638 /* ------------------------------------------------------------------ */
5639 static decNumber *decLnOp(decNumber *res, const decNumber *rhs,
5640                           decContext *set, uInt *status) {
5641   uInt ignore=0;		   /* working status accumulator */
5642   uInt needbytes;		   /* for space calculations */
5643   Int residue;			   /* rounding residue */
5644   Int r;			   /* rhs=f*10**r [see below] */
5645   Int p;			   /* working precision */
5646   Int pp;			   /* precision for iteration */
5647   Int t;			   /* work */
5648 
5649   /* buffers for a (accumulator, typically precision+2) and b */
5650   /* (adjustment calculator, same size) */
5651   decNumber bufa[D2N(DECBUFFER+12)];
5652   decNumber *allocbufa=NULL;	   /* -> allocated bufa, iff allocated */
5653   decNumber *a=bufa;		   /* accumulator/work */
5654   decNumber bufb[D2N(DECBUFFER*2+2)];
5655   decNumber *allocbufb=NULL;	   /* -> allocated bufa, iff allocated */
5656   decNumber *b=bufb;		   /* adjustment/work */
5657 
5658   decNumber  numone;		   /* constant 1 */
5659   decNumber  cmp;		   /* work */
5660   decContext aset, bset;	   /* working contexts */
5661 
5662   #if DECCHECK
5663   Int iterations=0;		   /* for later sanity check */
5664   if (decCheckOperands(res, DECUNUSED, rhs, set)) return res;
5665   #endif
5666 
5667   do {					/* protect allocated storage */
5668     if (SPECIALARG) {			/* handle infinities and NaNs */
5669       if (decNumberIsInfinite(rhs)) {	/* an infinity */
5670 	if (decNumberIsNegative(rhs))	/* -Infinity -> error */
5671 	  *status|=DEC_Invalid_operation;
5672 	 else decNumberCopy(res, rhs);	/* +Infinity -> self */
5673 	}
5674        else decNaNs(res, rhs, NULL, set, status); /* a NaN */
5675       break;}
5676 
5677     if (ISZERO(rhs)) {			/* +/- zeros -> -Infinity */
5678       decNumberZero(res);		/* make clean */
5679       res->bits=DECINF|DECNEG;		/* set - infinity */
5680       break;}				/* [no status to set] */
5681 
5682     /* Non-zero negatives are bad... */
5683     if (decNumberIsNegative(rhs)) {	/* -x -> error */
5684       *status|=DEC_Invalid_operation;
5685       break;}
5686 
5687     /* Here, rhs is positive, finite, and in range */
5688 
5689     /* lookaside fastpath code for ln(2) and ln(10) at common lengths */
5690     if (rhs->exponent==0 && set->digits<=40) {
5691       #if DECDPUN==1
5692       if (rhs->lsu[0]==0 && rhs->lsu[1]==1 && rhs->digits==2) { /* ln(10) */
5693       #else
5694       if (rhs->lsu[0]==10 && rhs->digits==2) {			/* ln(10) */
5695       #endif
5696 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5697 	#define LN10 "2.302585092994045684017991454684364207601"
5698 	decNumberFromString(res, LN10, &aset);
5699 	*status|=(DEC_Inexact | DEC_Rounded); /* is inexact */
5700 	break;}
5701       if (rhs->lsu[0]==2 && rhs->digits==1) { /* ln(2) */
5702 	aset=*set; aset.round=DEC_ROUND_HALF_EVEN;
5703 	#define LN2 "0.6931471805599453094172321214581765680755"
5704 	decNumberFromString(res, LN2, &aset);
5705 	*status|=(DEC_Inexact | DEC_Rounded);
5706 	break;}
5707       } /* integer and short */
5708 
5709     /* Determine the working precision.	 This is normally the */
5710     /* requested precision + 2, with a minimum of 9.  However, if */
5711     /* the rhs is 'over-precise' then allow for all its digits to */
5712     /* potentially participate (consider an rhs where all the excess */
5713     /* digits are 9s) so in this case use rhs->digits+2. */
5714     p=MAXI(rhs->digits, MAXI(set->digits, 7))+2;
5715 
5716     /* Allocate space for the accumulator and the high-precision */
5717     /* adjustment calculator, if necessary.  The accumulator must */
5718     /* be able to hold p digits, and the adjustment up to */
5719     /* rhs->digits+p digits.  They are also made big enough for 16 */
5720     /* digits so that they can be used for calculating the initial */
5721     /* estimate. */
5722     needbytes=sizeof(decNumber)+(D2U(MAXI(p,16))-1)*sizeof(Unit);
5723     if (needbytes>sizeof(bufa)) {     /* need malloc space */
5724       allocbufa=(decNumber *)malloc(needbytes);
5725       if (allocbufa==NULL) {	      /* hopeless -- abandon */
5726 	*status|=DEC_Insufficient_storage;
5727 	break;}
5728       a=allocbufa;		      /* use the allocated space */
5729       }
5730     pp=p+rhs->digits;
5731     needbytes=sizeof(decNumber)+(D2U(MAXI(pp,16))-1)*sizeof(Unit);
5732     if (needbytes>sizeof(bufb)) {     /* need malloc space */
5733       allocbufb=(decNumber *)malloc(needbytes);
5734       if (allocbufb==NULL) {	      /* hopeless -- abandon */
5735 	*status|=DEC_Insufficient_storage;
5736 	break;}
5737       b=allocbufb;		      /* use the allocated space */
5738       }
5739 
5740     /* Prepare an initial estimate in acc. Calculate this by */
5741     /* considering the coefficient of x to be a normalized fraction, */
5742     /* f, with the decimal point at far left and multiplied by */
5743     /* 10**r.  Then, rhs=f*10**r and 0.1<=f<1, and */
5744     /*	 ln(x) = ln(f) + ln(10)*r */
5745     /* Get the initial estimate for ln(f) from a small lookup */
5746     /* table (see above) indexed by the first two digits of f, */
5747     /* truncated. */
5748 
5749     decContextDefault(&aset, DEC_INIT_DECIMAL64); /* 16-digit extended */
5750     r=rhs->exponent+rhs->digits;	/* 'normalised' exponent */
5751     decNumberFromInt32(a, r);		/* a=r */
5752     decNumberFromInt32(b, 2302585);	/* b=ln(10) (2.302585) */
5753     b->exponent=-6;			/*  .. */
5754     decMultiplyOp(a, a, b, &aset, &ignore);  /* a=a*b */
5755     /* now get top two digits of rhs into b by simple truncate and */
5756     /* force to integer */
5757     residue=0;				/* (no residue) */
5758     aset.digits=2; aset.round=DEC_ROUND_DOWN;
5759     decCopyFit(b, rhs, &aset, &residue, &ignore); /* copy & shorten */
5760     b->exponent=0;			/* make integer */
5761     t=decGetInt(b);			/* [cannot fail] */
5762     if (t<10) t=X10(t);			/* adjust single-digit b */
5763     t=LNnn[t-10];			/* look up ln(b) */
5764     decNumberFromInt32(b, t>>2);	/* b=ln(b) coefficient */
5765     b->exponent=-(t&3)-3;		/* set exponent */
5766     b->bits=DECNEG;			/* ln(0.10)->ln(0.99) always -ve */
5767     aset.digits=16; aset.round=DEC_ROUND_HALF_EVEN; /* restore */
5768     decAddOp(a, a, b, &aset, 0, &ignore); /* acc=a+b */
5769     /* the initial estimate is now in a, with up to 4 digits correct. */
5770     /* When rhs is at or near Nmax the estimate will be low, so we */
5771     /* will approach it from below, avoiding overflow when calling exp. */
5772 
5773     decNumberZero(&numone); *numone.lsu=1;   /* constant 1 for adjustment */
5774 
5775     /* accumulator bounds are as requested (could underflow, but */
5776     /* cannot overflow) */
5777     aset.emax=set->emax;
5778     aset.emin=set->emin;
5779     aset.clamp=0;			/* no concrete format */
5780     /* set up a context to be used for the multiply and subtract */
5781     bset=aset;
5782     bset.emax=DEC_MAX_MATH*2;		/* use double bounds for the */
5783     bset.emin=-DEC_MAX_MATH*2;		/* adjustment calculation */
5784 					/* [see decExpOp call below] */
5785     /* for each iteration double the number of digits to calculate, */
5786     /* up to a maximum of p */
5787     pp=9;				/* initial precision */
5788     /* [initially 9 as then the sequence starts 7+2, 16+2, and */
5789     /* 34+2, which is ideal for standard-sized numbers] */
5790     aset.digits=pp;			/* working context */
5791     bset.digits=pp+rhs->digits;		/* wider context */
5792     for (;;) {				/* iterate */
5793       #if DECCHECK
5794       iterations++;
5795       if (iterations>24) break;		/* consider 9 * 2**24 */
5796       #endif
5797       /* calculate the adjustment (exp(-a)*x-1) into b.	 This is a */
5798       /* catastrophic subtraction but it really is the difference */
5799       /* from 1 that is of interest. */
5800       /* Use the internal entry point to Exp as it allows the double */
5801       /* range for calculating exp(-a) when a is the tiniest subnormal. */
5802       a->bits^=DECNEG;			/* make -a */
5803       decExpOp(b, a, &bset, &ignore);	/* b=exp(-a) */
5804       a->bits^=DECNEG;			/* restore sign of a */
5805       /* now multiply by rhs and subtract 1, at the wider precision */
5806       decMultiplyOp(b, b, rhs, &bset, &ignore);	       /* b=b*rhs */
5807       decAddOp(b, b, &numone, &bset, DECNEG, &ignore); /* b=b-1 */
5808 
5809       /* the iteration ends when the adjustment cannot affect the */
5810       /* result by >=0.5 ulp (at the requested digits), which */
5811       /* is when its value is smaller than the accumulator by */
5812       /* set->digits+1 digits (or it is zero) -- this is a looser */
5813       /* requirement than for Exp because all that happens to the */
5814       /* accumulator after this is the final rounding (but note that */
5815       /* there must also be full precision in a, or a=0). */
5816 
5817       if (decNumberIsZero(b) ||
5818 	  (a->digits+a->exponent)>=(b->digits+b->exponent+set->digits+1)) {
5819 	if (a->digits==p) break;
5820 	if (decNumberIsZero(a)) {
5821 	  decCompareOp(&cmp, rhs, &numone, &aset, COMPARE, &ignore); /* rhs=1 ? */
5822 	  if (cmp.lsu[0]==0) a->exponent=0;	       /* yes, exact 0 */
5823 	   else *status|=(DEC_Inexact | DEC_Rounded);  /* no, inexact */
5824 	  break;
5825 	  }
5826 	/* force padding if adjustment has gone to 0 before full length */
5827 	if (decNumberIsZero(b)) b->exponent=a->exponent-p;
5828 	}
5829 
5830       /* not done yet ... */
5831       decAddOp(a, a, b, &aset, 0, &ignore);  /* a=a+b for next estimate */
5832       if (pp==p) continue;		     /* precision is at maximum */
5833       /* lengthen the next calculation */
5834       pp=pp*2;				     /* double precision */
5835       if (pp>p) pp=p;			     /* clamp to maximum */
5836       aset.digits=pp;			     /* working context */
5837       bset.digits=pp+rhs->digits;	     /* wider context */
5838       } /* Newton's iteration */
5839 
5840     #if DECCHECK
5841     /* just a sanity check; remove the test to show always */
5842     if (iterations>24)
5843       printf("Ln iterations=%ld, status=%08lx, p=%ld, d=%ld\n",
5844 	    iterations, *status, p, rhs->digits);
5845     #endif
5846 
5847     /* Copy and round the result to res */
5848     residue=1;				/* indicate dirt to right */
5849     if (ISZERO(a)) residue=0;		/* .. unless underflowed to 0 */
5850     aset.digits=set->digits;		/* [use default rounding] */
5851     decCopyFit(res, a, &aset, &residue, status); /* copy & shorten */
5852     decFinish(res, set, &residue, status);	 /* cleanup/set flags */
5853     } while(0);				/* end protected */
5854 
5855   if (allocbufa!=NULL) free(allocbufa); /* drop any storage used */
5856   if (allocbufb!=NULL) free(allocbufb); /* .. */
5857   /* [status is handled by caller] */
5858   return res;
5859   } /* decLnOp */
5860 
5861 /* ------------------------------------------------------------------ */
5862 /* decQuantizeOp  -- force exponent to requested value		      */
5863 /*								      */
5864 /*   This computes C = op(A, B), where op adjusts the coefficient     */
5865 /*   of C (by rounding or shifting) such that the exponent (-scale)   */
5866 /*   of C has the value B or matches the exponent of B.		      */
5867 /*   The numerical value of C will equal A, except for the effects of */
5868 /*   any rounding that occurred.				      */
5869 /*								      */
5870 /*   res is C, the result.  C may be A or B			      */
5871 /*   lhs is A, the number to adjust				      */
5872 /*   rhs is B, the requested exponent				      */
5873 /*   set is the context						      */
5874 /*   quant is 1 for quantize or 0 for rescale			      */
5875 /*   status is the status accumulator (this can be called without     */
5876 /*	    risk of control loss)				      */
5877 /*								      */
5878 /* C must have space for set->digits digits.			      */
5879 /*								      */
5880 /* Unless there is an error or the result is infinite, the exponent   */
5881 /* after the operation is guaranteed to be that requested.	      */
5882 /* ------------------------------------------------------------------ */
5883 static decNumber * decQuantizeOp(decNumber *res, const decNumber *lhs,
5884 				 const decNumber *rhs, decContext *set,
5885 				 Flag quant, uInt *status) {
5886   #if DECSUBSET
5887   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
5888   decNumber *allocrhs=NULL;	   /* .., rhs */
5889   #endif
5890   const decNumber *inrhs=rhs;	   /* save original rhs */
5891   Int	reqdigits=set->digits;	   /* requested DIGITS */
5892   Int	reqexp;			   /* requested exponent [-scale] */
5893   Int	residue=0;		   /* rounding residue */
5894   Int	etiny=set->emin-(reqdigits-1);
5895 
5896   #if DECCHECK
5897   if (decCheckOperands(res, lhs, rhs, set)) return res;
5898   #endif
5899 
5900   do {				   /* protect allocated storage */
5901     #if DECSUBSET
5902     if (!set->extended) {
5903       /* reduce operands and set lostDigits status, as needed */
5904       if (lhs->digits>reqdigits) {
5905 	alloclhs=decRoundOperand(lhs, set, status);
5906 	if (alloclhs==NULL) break;
5907 	lhs=alloclhs;
5908 	}
5909       if (rhs->digits>reqdigits) { /* [this only checks lostDigits] */
5910 	allocrhs=decRoundOperand(rhs, set, status);
5911 	if (allocrhs==NULL) break;
5912 	rhs=allocrhs;
5913 	}
5914       }
5915     #endif
5916     /* [following code does not require input rounding] */
5917 
5918     /* Handle special values */
5919     if (SPECIALARGS) {
5920       /* NaNs get usual processing */
5921       if (SPECIALARGS & (DECSNAN | DECNAN))
5922 	decNaNs(res, lhs, rhs, set, status);
5923       /* one infinity but not both is bad */
5924       else if ((lhs->bits ^ rhs->bits) & DECINF)
5925 	*status|=DEC_Invalid_operation;
5926       /* both infinity: return lhs */
5927       else decNumberCopy(res, lhs);	     /* [nop if in place] */
5928       break;
5929       }
5930 
5931     /* set requested exponent */
5932     if (quant) reqexp=inrhs->exponent;	/* quantize -- match exponents */
5933      else {				/* rescale -- use value of rhs */
5934       /* Original rhs must be an integer that fits and is in range, */
5935       /* which could be from -1999999997 to +999999999, thanks to */
5936       /* subnormals */
5937       reqexp=decGetInt(inrhs);		     /* [cannot fail] */
5938       }
5939 
5940     #if DECSUBSET
5941     if (!set->extended) etiny=set->emin;     /* no subnormals */
5942     #endif
5943 
5944     if (reqexp==BADINT			     /* bad (rescale only) or .. */
5945      || reqexp==BIGODD || reqexp==BIGEVEN    /* very big (ditto) or .. */
5946      || (reqexp<etiny)			     /* < lowest */
5947      || (reqexp>set->emax)) {		     /* > emax */
5948       *status|=DEC_Invalid_operation;
5949       break;}
5950 
5951     /* the RHS has been processed, so it can be overwritten now if necessary */
5952     if (ISZERO(lhs)) {			     /* zero coefficient unchanged */
5953       decNumberCopy(res, lhs);		     /* [nop if in place] */
5954       res->exponent=reqexp;		     /* .. just set exponent */
5955       #if DECSUBSET
5956       if (!set->extended) res->bits=0;	     /* subset specification; no -0 */
5957       #endif
5958       }
5959      else {				     /* non-zero lhs */
5960       Int adjust=reqexp-lhs->exponent;	     /* digit adjustment needed */
5961       /* if adjusted coefficient will definitely not fit, give up now */
5962       if ((lhs->digits-adjust)>reqdigits) {
5963 	*status|=DEC_Invalid_operation;
5964 	break;
5965 	}
5966 
5967       if (adjust>0) {			     /* increasing exponent */
5968 	/* this will decrease the length of the coefficient by adjust */
5969 	/* digits, and must round as it does so */
5970 	decContext workset;		     /* work */
5971 	workset=*set;			     /* clone rounding, etc. */
5972 	workset.digits=lhs->digits-adjust;   /* set requested length */
5973 	/* [note that the latter can be <1, here] */
5974 	decCopyFit(res, lhs, &workset, &residue, status); /* fit to result */
5975 	decApplyRound(res, &workset, residue, status);	  /* .. and round */
5976 	residue=0;					  /* [used] */
5977 	/* If just rounded a 999s case, exponent will be off by one; */
5978 	/* adjust back (after checking space), if so. */
5979 	if (res->exponent>reqexp) {
5980 	  /* re-check needed, e.g., for quantize(0.9999, 0.001) under */
5981 	  /* set->digits==3 */
5982 	  if (res->digits==reqdigits) {	     /* cannot shift by 1 */
5983 	    *status&=~(DEC_Inexact | DEC_Rounded); /* [clean these] */
5984 	    *status|=DEC_Invalid_operation;
5985 	    break;
5986 	    }
5987 	  res->digits=decShiftToMost(res->lsu, res->digits, 1); /* shift */
5988 	  res->exponent--;		     /* (re)adjust the exponent. */
5989 	  }
5990 	#if DECSUBSET
5991 	if (ISZERO(res) && !set->extended) res->bits=0; /* subset; no -0 */
5992 	#endif
5993 	} /* increase */
5994        else /* adjust<=0 */ {		     /* decreasing or = exponent */
5995 	/* this will increase the length of the coefficient by -adjust */
5996 	/* digits, by adding zero or more trailing zeros; this is */
5997 	/* already checked for fit, above */
5998 	decNumberCopy(res, lhs);	     /* [it will fit] */
5999 	/* if padding needed (adjust<0), add it now... */
6000 	if (adjust<0) {
6001 	  res->digits=decShiftToMost(res->lsu, res->digits, -adjust);
6002 	  res->exponent+=adjust;	     /* adjust the exponent */
6003 	  }
6004 	} /* decrease */
6005       } /* non-zero */
6006 
6007     /* Check for overflow [do not use Finalize in this case, as an */
6008     /* overflow here is a "don't fit" situation] */
6009     if (res->exponent>set->emax-res->digits+1) {  /* too big */
6010       *status|=DEC_Invalid_operation;
6011       break;
6012       }
6013      else {
6014       decFinalize(res, set, &residue, status);	  /* set subnormal flags */
6015       *status&=~DEC_Underflow;		/* suppress Underflow [754r] */
6016       }
6017     } while(0);				/* end protected */
6018 
6019   #if DECSUBSET
6020   if (allocrhs!=NULL) free(allocrhs);	/* drop any storage used */
6021   if (alloclhs!=NULL) free(alloclhs);	/* .. */
6022   #endif
6023   return res;
6024   } /* decQuantizeOp */
6025 
6026 /* ------------------------------------------------------------------ */
6027 /* decCompareOp -- compare, min, or max two Numbers		      */
6028 /*								      */
6029 /*   This computes C = A ? B and carries out one of four operations:  */
6030 /*     COMPARE	  -- returns the signum (as a number) giving the      */
6031 /*		     result of a comparison unless one or both	      */
6032 /*		     operands is a NaN (in which case a NaN results)  */
6033 /*     COMPSIG	  -- as COMPARE except that a quiet NaN raises	      */
6034 /*		     Invalid operation.				      */
6035 /*     COMPMAX	  -- returns the larger of the operands, using the    */
6036 /*		     754r maxnum operation			      */
6037 /*     COMPMAXMAG -- ditto, comparing absolute values		      */
6038 /*     COMPMIN	  -- the 754r minnum operation			      */
6039 /*     COMPMINMAG -- ditto, comparing absolute values		      */
6040 /*     COMTOTAL	  -- returns the signum (as a number) giving the      */
6041 /*		     result of a comparison using 754r total ordering */
6042 /*								      */
6043 /*   res is C, the result.  C may be A and/or B (e.g., X=X?X)	      */
6044 /*   lhs is A							      */
6045 /*   rhs is B							      */
6046 /*   set is the context						      */
6047 /*   op	 is the operation flag					      */
6048 /*   status is the usual accumulator				      */
6049 /*								      */
6050 /* C must have space for one digit for COMPARE or set->digits for     */
6051 /* COMPMAX, COMPMIN, COMPMAXMAG, or COMPMINMAG.			      */
6052 /* ------------------------------------------------------------------ */
6053 /* The emphasis here is on speed for common cases, and avoiding	      */
6054 /* coefficient comparison if possible.				      */
6055 /* ------------------------------------------------------------------ */
6056 static decNumber *decCompareOp(decNumber *res, const decNumber *lhs,
6057                                const decNumber *rhs, decContext *set,
6058                                Flag op, uInt *status) {
6059   #if DECSUBSET
6060   decNumber *alloclhs=NULL;	   /* non-NULL if rounded lhs allocated */
6061   decNumber *allocrhs=NULL;	   /* .., rhs */
6062   #endif
6063   Int	result=0;		   /* default result value */
6064   uByte merged;			   /* work */
6065 
6066   #if DECCHECK
6067   if (decCheckOperands(res, lhs, rhs, set)) return res;
6068   #endif
6069 
6070   do {				   /* protect allocated storage */
6071     #if DECSUBSET
6072     if (!set->extended) {
6073       /* reduce operands and set lostDigits status, as needed */
6074       if (lhs->digits>set->digits) {
6075 	alloclhs=decRoundOperand(lhs, set, status);
6076 	if (alloclhs==NULL) {result=BADINT; break;}
6077 	lhs=alloclhs;
6078 	}
6079       if (rhs->digits>set->digits) {
6080 	allocrhs=decRoundOperand(rhs, set, status);
6081 	if (allocrhs==NULL) {result=BADINT; break;}
6082 	rhs=allocrhs;
6083 	}
6084       }
6085     #endif
6086     /* [following code does not require input rounding] */
6087 
6088     /* If total ordering then handle differing signs 'up front' */
6089     if (op==COMPTOTAL) {		/* total ordering */
6090       if (decNumberIsNegative(lhs) && !decNumberIsNegative(rhs)) {
6091 	result=-1;
6092 	break;
6093 	}
6094       if (!decNumberIsNegative(lhs) && decNumberIsNegative(rhs)) {
6095 	result=+1;
6096 	break;
6097 	}
6098       }
6099 
6100     /* handle NaNs specially; let infinities drop through */
6101     /* This assumes sNaN (even just one) leads to NaN. */
6102     merged=(lhs->bits | rhs->bits) & (DECSNAN | DECNAN);
6103     if (merged) {			/* a NaN bit set */
6104       if (op==COMPARE);			/* result will be NaN */
6105        else if (op==COMPSIG)		/* treat qNaN as sNaN */
6106 	*status|=DEC_Invalid_operation | DEC_sNaN;
6107        else if (op==COMPTOTAL) {	/* total ordering, always finite */
6108 	/* signs are known to be the same; compute the ordering here */
6109 	/* as if the signs are both positive, then invert for negatives */
6110 	if (!decNumberIsNaN(lhs)) result=-1;
6111 	 else if (!decNumberIsNaN(rhs)) result=+1;
6112 	 /* here if both NaNs */
6113 	 else if (decNumberIsSNaN(lhs) && decNumberIsQNaN(rhs)) result=-1;
6114 	 else if (decNumberIsQNaN(lhs) && decNumberIsSNaN(rhs)) result=+1;
6115 	 else { /* both NaN or both sNaN */
6116 	  /* now it just depends on the payload */
6117 	  result=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6118 				rhs->lsu, D2U(rhs->digits), 0);
6119 	  /* [Error not possible, as these are 'aligned'] */
6120 	  } /* both same NaNs */
6121 	if (decNumberIsNegative(lhs)) result=-result;
6122 	break;
6123 	} /* total order */
6124 
6125        else if (merged & DECSNAN);	     /* sNaN -> qNaN */
6126        else { /* here if MIN or MAX and one or two quiet NaNs */
6127 	/* min or max -- 754r rules ignore single NaN */
6128 	if (!decNumberIsNaN(lhs) || !decNumberIsNaN(rhs)) {
6129 	  /* just one NaN; force choice to be the non-NaN operand */
6130 	  op=COMPMAX;
6131 	  if (lhs->bits & DECNAN) result=-1; /* pick rhs */
6132 			     else result=+1; /* pick lhs */
6133 	  break;
6134 	  }
6135 	} /* max or min */
6136       op=COMPNAN;			     /* use special path */
6137       decNaNs(res, lhs, rhs, set, status);   /* propagate NaN */
6138       break;
6139       }
6140     /* have numbers */
6141     if (op==COMPMAXMAG || op==COMPMINMAG) result=decCompare(lhs, rhs, 1);
6142      else result=decCompare(lhs, rhs, 0);    /* sign matters */
6143     } while(0);				     /* end protected */
6144 
6145   if (result==BADINT) *status|=DEC_Insufficient_storage; /* rare */
6146    else {
6147     if (op==COMPARE || op==COMPSIG ||op==COMPTOTAL) { /* returning signum */
6148       if (op==COMPTOTAL && result==0) {
6149 	/* operands are numerically equal or same NaN (and same sign, */
6150 	/* tested first); if identical, leave result 0 */
6151 	if (lhs->exponent!=rhs->exponent) {
6152 	  if (lhs->exponent<rhs->exponent) result=-1;
6153 	   else result=+1;
6154 	  if (decNumberIsNegative(lhs)) result=-result;
6155 	  } /* lexp!=rexp */
6156 	} /* total-order by exponent */
6157       decNumberZero(res);		/* [always a valid result] */
6158       if (result!=0) {			/* must be -1 or +1 */
6159 	*res->lsu=1;
6160 	if (result<0) res->bits=DECNEG;
6161 	}
6162       }
6163      else if (op==COMPNAN);		/* special, drop through */
6164      else {				/* MAX or MIN, non-NaN result */
6165       Int residue=0;			/* rounding accumulator */
6166       /* choose the operand for the result */
6167       const decNumber *choice;
6168       if (result==0) { /* operands are numerically equal */
6169 	/* choose according to sign then exponent (see 754r) */
6170 	uByte slhs=(lhs->bits & DECNEG);
6171 	uByte srhs=(rhs->bits & DECNEG);
6172 	#if DECSUBSET
6173 	if (!set->extended) {		/* subset: force left-hand */
6174 	  op=COMPMAX;
6175 	  result=+1;
6176 	  }
6177 	else
6178 	#endif
6179 	if (slhs!=srhs) {	   /* signs differ */
6180 	  if (slhs) result=-1;	   /* rhs is max */
6181 	       else result=+1;	   /* lhs is max */
6182 	  }
6183 	 else if (slhs && srhs) {  /* both negative */
6184 	  if (lhs->exponent<rhs->exponent) result=+1;
6185 				      else result=-1;
6186 	  /* [if equal, use lhs, technically identical] */
6187 	  }
6188 	 else {			   /* both positive */
6189 	  if (lhs->exponent>rhs->exponent) result=+1;
6190 				      else result=-1;
6191 	  /* [ditto] */
6192 	  }
6193 	} /* numerically equal */
6194       /* here result will be non-0; reverse if looking for MIN */
6195       if (op==COMPMIN || op==COMPMINMAG) result=-result;
6196       choice=(result>0 ? lhs : rhs);	/* choose */
6197       /* copy chosen to result, rounding if need be */
6198       decCopyFit(res, choice, set, &residue, status);
6199       decFinish(res, set, &residue, status);
6200       }
6201     }
6202   #if DECSUBSET
6203   if (allocrhs!=NULL) free(allocrhs);	/* free any storage used */
6204   if (alloclhs!=NULL) free(alloclhs);	/* .. */
6205   #endif
6206   return res;
6207   } /* decCompareOp */
6208 
6209 /* ------------------------------------------------------------------ */
6210 /* decCompare -- compare two decNumbers by numerical value	      */
6211 /*								      */
6212 /*  This routine compares A ? B without altering them.		      */
6213 /*								      */
6214 /*  Arg1 is A, a decNumber which is not a NaN			      */
6215 /*  Arg2 is B, a decNumber which is not a NaN			      */
6216 /*  Arg3 is 1 for a sign-independent compare, 0 otherwise	      */
6217 /*								      */
6218 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6219 /*  (the only possible failure is an allocation error)		      */
6220 /* ------------------------------------------------------------------ */
6221 static Int decCompare(const decNumber *lhs, const decNumber *rhs,
6222 		      Flag abs) {
6223   Int	result;			   /* result value */
6224   Int	sigr;			   /* rhs signum */
6225   Int	compare;		   /* work */
6226 
6227   result=1;				     /* assume signum(lhs) */
6228   if (ISZERO(lhs)) result=0;
6229   if (abs) {
6230     if (ISZERO(rhs)) return result;	     /* LHS wins or both 0 */
6231     /* RHS is non-zero */
6232     if (result==0) return -1;		     /* LHS is 0; RHS wins */
6233     /* [here, both non-zero, result=1] */
6234     }
6235    else {				     /* signs matter */
6236     if (result && decNumberIsNegative(lhs)) result=-1;
6237     sigr=1;				     /* compute signum(rhs) */
6238     if (ISZERO(rhs)) sigr=0;
6239      else if (decNumberIsNegative(rhs)) sigr=-1;
6240     if (result > sigr) return +1;	     /* L > R, return 1 */
6241     if (result < sigr) return -1;	     /* L < R, return -1 */
6242     if (result==0) return 0;		       /* both 0 */
6243     }
6244 
6245   /* signums are the same; both are non-zero */
6246   if ((lhs->bits | rhs->bits) & DECINF) {    /* one or more infinities */
6247     if (decNumberIsInfinite(rhs)) {
6248       if (decNumberIsInfinite(lhs)) result=0;/* both infinite */
6249        else result=-result;		     /* only rhs infinite */
6250       }
6251     return result;
6252     }
6253   /* must compare the coefficients, allowing for exponents */
6254   if (lhs->exponent>rhs->exponent) {	     /* LHS exponent larger */
6255     /* swap sides, and sign */
6256     const decNumber *temp=lhs;
6257     lhs=rhs;
6258     rhs=temp;
6259     result=-result;
6260     }
6261   compare=decUnitCompare(lhs->lsu, D2U(lhs->digits),
6262 			 rhs->lsu, D2U(rhs->digits),
6263 			 rhs->exponent-lhs->exponent);
6264   if (compare!=BADINT) compare*=result;	     /* comparison succeeded */
6265   return compare;
6266   } /* decCompare */
6267 
6268 /* ------------------------------------------------------------------ */
6269 /* decUnitCompare -- compare two >=0 integers in Unit arrays	      */
6270 /*								      */
6271 /*  This routine compares A ? B*10**E where A and B are unit arrays   */
6272 /*  A is a plain integer					      */
6273 /*  B has an exponent of E (which must be non-negative)		      */
6274 /*								      */
6275 /*  Arg1 is A first Unit (lsu)					      */
6276 /*  Arg2 is A length in Units					      */
6277 /*  Arg3 is B first Unit (lsu)					      */
6278 /*  Arg4 is B length in Units					      */
6279 /*  Arg5 is E (0 if the units are aligned)			      */
6280 /*								      */
6281 /*  returns -1, 0, or 1 for A<B, A==B, or A>B, or BADINT if failure   */
6282 /*  (the only possible failure is an allocation error, which can      */
6283 /*  only occur if E!=0)						      */
6284 /* ------------------------------------------------------------------ */
6285 static Int decUnitCompare(const Unit *a, Int alength,
6286 			  const Unit *b, Int blength, Int exp) {
6287   Unit	*acc;			   /* accumulator for result */
6288   Unit	accbuff[SD2U(DECBUFFER*2+1)]; /* local buffer */
6289   Unit	*allocacc=NULL;		   /* -> allocated acc buffer, iff allocated */
6290   Int	accunits, need;		   /* units in use or needed for acc */
6291   const Unit *l, *r, *u;	   /* work */
6292   Int	expunits, exprem, result;  /* .. */
6293 
6294   if (exp==0) {			   /* aligned; fastpath */
6295     if (alength>blength) return 1;
6296     if (alength<blength) return -1;
6297     /* same number of units in both -- need unit-by-unit compare */
6298     l=a+alength-1;
6299     r=b+alength-1;
6300     for (;l>=a; l--, r--) {
6301       if (*l>*r) return 1;
6302       if (*l<*r) return -1;
6303       }
6304     return 0;			   /* all units match */
6305     } /* aligned */
6306 
6307   /* Unaligned.	 If one is >1 unit longer than the other, padded */
6308   /* approximately, then can return easily */
6309   if (alength>blength+(Int)D2U(exp)) return 1;
6310   if (alength+1<blength+(Int)D2U(exp)) return -1;
6311 
6312   /* Need to do a real subtract.  For this, a result buffer is needed */
6313   /* even though only the sign is of interest.	Its length needs */
6314   /* to be the larger of alength and padded blength, +2 */
6315   need=blength+D2U(exp);		/* maximum real length of B */
6316   if (need<alength) need=alength;
6317   need+=2;
6318   acc=accbuff;				/* assume use local buffer */
6319   if (need*sizeof(Unit)>sizeof(accbuff)) {
6320     allocacc=(Unit *)malloc(need*sizeof(Unit));
6321     if (allocacc==NULL) return BADINT;	/* hopeless -- abandon */
6322     acc=allocacc;
6323     }
6324   /* Calculate units and remainder from exponent. */
6325   expunits=exp/DECDPUN;
6326   exprem=exp%DECDPUN;
6327   /* subtract [A+B*(-m)] */
6328   accunits=decUnitAddSub(a, alength, b, blength, expunits, acc,
6329 			 -(Int)powers[exprem]);
6330   /* [UnitAddSub result may have leading zeros, even on zero] */
6331   if (accunits<0) result=-1;		/* negative result */
6332    else {				/* non-negative result */
6333     /* check units of the result before freeing any storage */
6334     for (u=acc; u<acc+accunits-1 && *u==0;) u++;
6335     result=(*u==0 ? 0 : +1);
6336     }
6337   /* clean up and return the result */
6338   if (allocacc!=NULL) free(allocacc);	/* drop any storage used */
6339   return result;
6340   } /* decUnitCompare */
6341 
6342 /* ------------------------------------------------------------------ */
6343 /* decUnitAddSub -- add or subtract two >=0 integers in Unit arrays   */
6344 /*								      */
6345 /*  This routine performs the calculation:			      */
6346 /*								      */
6347 /*  C=A+(B*M)							      */
6348 /*								      */
6349 /*  Where M is in the range -DECDPUNMAX through +DECDPUNMAX.	      */
6350 /*								      */
6351 /*  A may be shorter or longer than B.				      */
6352 /*								      */
6353 /*  Leading zeros are not removed after a calculation.	The result is */
6354 /*  either the same length as the longer of A and B (adding any	      */
6355 /*  shift), or one Unit longer than that (if a Unit carry occurred).  */
6356 /*								      */
6357 /*  A and B content are not altered unless C is also A or B.	      */
6358 /*  C may be the same array as A or B, but only if no zero padding is */
6359 /*  requested (that is, C may be B only if bshift==0).		      */
6360 /*  C is filled from the lsu; only those units necessary to complete  */
6361 /*  the calculation are referenced.				      */
6362 /*								      */
6363 /*  Arg1 is A first Unit (lsu)					      */
6364 /*  Arg2 is A length in Units					      */
6365 /*  Arg3 is B first Unit (lsu)					      */
6366 /*  Arg4 is B length in Units					      */
6367 /*  Arg5 is B shift in Units  (>=0; pads with 0 units if positive)    */
6368 /*  Arg6 is C first Unit (lsu)					      */
6369 /*  Arg7 is M, the multiplier					      */
6370 /*								      */
6371 /*  returns the count of Units written to C, which will be non-zero   */
6372 /*  and negated if the result is negative.  That is, the sign of the  */
6373 /*  returned Int is the sign of the result (positive for zero) and    */
6374 /*  the absolute value of the Int is the count of Units.	      */
6375 /*								      */
6376 /*  It is the caller's responsibility to make sure that C size is     */
6377 /*  safe, allowing space if necessary for a one-Unit carry.	      */
6378 /*								      */
6379 /*  This routine is severely performance-critical; *any* change here  */
6380 /*  must be measured (timed) to assure no performance degradation.    */
6381 /*  In particular, trickery here tends to be counter-productive, as   */
6382 /*  increased complexity of code hurts register optimizations on      */
6383 /*  register-poor architectures.  Avoiding divisions is nearly	      */
6384 /*  always a Good Idea, however.				      */
6385 /*								      */
6386 /* Special thanks to Rick McGuire (IBM Cambridge, MA) and Dave Clark  */
6387 /* (IBM Warwick, UK) for some of the ideas used in this routine.      */
6388 /* ------------------------------------------------------------------ */
6389 static Int decUnitAddSub(const Unit *a, Int alength,
6390 			 const Unit *b, Int blength, Int bshift,
6391 			 Unit *c, Int m) {
6392   const Unit *alsu=a;		   /* A lsu [need to remember it] */
6393   Unit *clsu=c;			   /* C ditto */
6394   Unit *minC;			   /* low water mark for C */
6395   Unit *maxC;			   /* high water mark for C */
6396   eInt carry=0;			   /* carry integer (could be Long) */
6397   Int  add;			   /* work */
6398   #if DECDPUN<=4		   /* myriadal, millenary, etc. */
6399   Int  est;			   /* estimated quotient */
6400   #endif
6401 
6402   #if DECTRACE
6403   if (alength<1 || blength<1)
6404     printf("decUnitAddSub: alen blen m %ld %ld [%ld]\n", alength, blength, m);
6405   #endif
6406 
6407   maxC=c+alength;		   /* A is usually the longer */
6408   minC=c+blength;		   /* .. and B the shorter */
6409   if (bshift!=0) {		   /* B is shifted; low As copy across */
6410     minC+=bshift;
6411     /* if in place [common], skip copy unless there's a gap [rare] */
6412     if (a==c && bshift<=alength) {
6413       c+=bshift;
6414       a+=bshift;
6415       }
6416      else for (; c<clsu+bshift; a++, c++) {  /* copy needed */
6417       if (a<alsu+alength) *c=*a;
6418        else *c=0;
6419       }
6420     }
6421   if (minC>maxC) { /* swap */
6422     Unit *hold=minC;
6423     minC=maxC;
6424     maxC=hold;
6425     }
6426 
6427   /* For speed, do the addition as two loops; the first where both A */
6428   /* and B contribute, and the second (if necessary) where only one or */
6429   /* other of the numbers contribute. */
6430   /* Carry handling is the same (i.e., duplicated) in each case. */
6431   for (; c<minC; c++) {
6432     carry+=*a;
6433     a++;
6434     carry+=((eInt)*b)*m;		/* [special-casing m=1/-1 */
6435     b++;				/* here is not a win] */
6436     /* here carry is new Unit of digits; it could be +ve or -ve */
6437     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6438       *c=(Unit)carry;
6439       carry=0;
6440       continue;
6441       }
6442     #if DECDPUN==4			     /* use divide-by-multiply */
6443       if (carry>=0) {
6444 	est=(((ueInt)carry>>11)*53687)>>18;
6445 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6446 	carry=est;			     /* likely quotient [89%] */
6447 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6448 	carry++;
6449 	*c-=DECDPUNMAX+1;
6450 	continue;
6451 	}
6452       /* negative case */
6453       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6454       est=(((ueInt)carry>>11)*53687)>>18;
6455       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6456       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6457       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6458       carry++;
6459       *c-=DECDPUNMAX+1;
6460     #elif DECDPUN==3
6461       if (carry>=0) {
6462 	est=(((ueInt)carry>>3)*16777)>>21;
6463 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6464 	carry=est;			     /* likely quotient [99%] */
6465 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6466 	carry++;
6467 	*c-=DECDPUNMAX+1;
6468 	continue;
6469 	}
6470       /* negative case */
6471       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6472       est=(((ueInt)carry>>3)*16777)>>21;
6473       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6474       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6475       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6476       carry++;
6477       *c-=DECDPUNMAX+1;
6478     #elif DECDPUN<=2
6479       /* Can use QUOT10 as carry <= 4 digits */
6480       if (carry>=0) {
6481 	est=QUOT10(carry, DECDPUN);
6482 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6483 	carry=est;			     /* quotient */
6484 	continue;
6485 	}
6486       /* negative case */
6487       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6488       est=QUOT10(carry, DECDPUN);
6489       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6490       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6491     #else
6492       /* remainder operator is undefined if negative, so must test */
6493       if ((ueInt)carry<(DECDPUNMAX+1)*2) {   /* fastpath carry +1 */
6494 	*c=(Unit)(carry-(DECDPUNMAX+1));     /* [helps additions] */
6495 	carry=1;
6496 	continue;
6497 	}
6498       if (carry>=0) {
6499 	*c=(Unit)(carry%(DECDPUNMAX+1));
6500 	carry=carry/(DECDPUNMAX+1);
6501 	continue;
6502 	}
6503       /* negative case */
6504       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6505       *c=(Unit)(carry%(DECDPUNMAX+1));
6506       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6507     #endif
6508     } /* c */
6509 
6510   /* now may have one or other to complete */
6511   /* [pretest to avoid loop setup/shutdown] */
6512   if (c<maxC) for (; c<maxC; c++) {
6513     if (a<alsu+alength) {		/* still in A */
6514       carry+=*a;
6515       a++;
6516       }
6517      else {				/* inside B */
6518       carry+=((eInt)*b)*m;
6519       b++;
6520       }
6521     /* here carry is new Unit of digits; it could be +ve or -ve and */
6522     /* magnitude up to DECDPUNMAX squared */
6523     if ((ueInt)carry<=DECDPUNMAX) {	/* fastpath 0-DECDPUNMAX */
6524       *c=(Unit)carry;
6525       carry=0;
6526       continue;
6527       }
6528     /* result for this unit is negative or >DECDPUNMAX */
6529     #if DECDPUN==4			     /* use divide-by-multiply */
6530       if (carry>=0) {
6531 	est=(((ueInt)carry>>11)*53687)>>18;
6532 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6533 	carry=est;			     /* likely quotient [79.7%] */
6534 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6535 	carry++;
6536 	*c-=DECDPUNMAX+1;
6537 	continue;
6538 	}
6539       /* negative case */
6540       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6541       est=(((ueInt)carry>>11)*53687)>>18;
6542       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6543       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6544       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6545       carry++;
6546       *c-=DECDPUNMAX+1;
6547     #elif DECDPUN==3
6548       if (carry>=0) {
6549 	est=(((ueInt)carry>>3)*16777)>>21;
6550 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6551 	carry=est;			     /* likely quotient [99%] */
6552 	if (*c<DECDPUNMAX+1) continue;	     /* estimate was correct */
6553 	carry++;
6554 	*c-=DECDPUNMAX+1;
6555 	continue;
6556 	}
6557       /* negative case */
6558       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6559       est=(((ueInt)carry>>3)*16777)>>21;
6560       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6561       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6562       if (*c<DECDPUNMAX+1) continue;	     /* was OK */
6563       carry++;
6564       *c-=DECDPUNMAX+1;
6565     #elif DECDPUN<=2
6566       if (carry>=0) {
6567 	est=QUOT10(carry, DECDPUN);
6568 	*c=(Unit)(carry-est*(DECDPUNMAX+1)); /* remainder */
6569 	carry=est;			     /* quotient */
6570 	continue;
6571 	}
6572       /* negative case */
6573       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6574       est=QUOT10(carry, DECDPUN);
6575       *c=(Unit)(carry-est*(DECDPUNMAX+1));
6576       carry=est-(DECDPUNMAX+1);		     /* correctly negative */
6577     #else
6578       if ((ueInt)carry<(DECDPUNMAX+1)*2){    /* fastpath carry 1 */
6579 	*c=(Unit)(carry-(DECDPUNMAX+1));
6580 	carry=1;
6581 	continue;
6582 	}
6583       /* remainder operator is undefined if negative, so must test */
6584       if (carry>=0) {
6585 	*c=(Unit)(carry%(DECDPUNMAX+1));
6586 	carry=carry/(DECDPUNMAX+1);
6587 	continue;
6588 	}
6589       /* negative case */
6590       carry=carry+(eInt)(DECDPUNMAX+1)*(DECDPUNMAX+1); /* make positive */
6591       *c=(Unit)(carry%(DECDPUNMAX+1));
6592       carry=carry/(DECDPUNMAX+1)-(DECDPUNMAX+1);
6593     #endif
6594     } /* c */
6595 
6596   /* OK, all A and B processed; might still have carry or borrow */
6597   /* return number of Units in the result, negated if a borrow */
6598   if (carry==0) return c-clsu;	   /* no carry, so no more to do */
6599   if (carry>0) {		   /* positive carry */
6600     *c=(Unit)carry;		   /* place as new unit */
6601     c++;			   /* .. */
6602     return c-clsu;
6603     }
6604   /* -ve carry: it's a borrow; complement needed */
6605   add=1;			   /* temporary carry... */
6606   for (c=clsu; c<maxC; c++) {
6607     add=DECDPUNMAX+add-*c;
6608     if (add<=DECDPUNMAX) {
6609       *c=(Unit)add;
6610       add=0;
6611       }
6612      else {
6613       *c=0;
6614       add=1;
6615       }
6616     }
6617   /* add an extra unit iff it would be non-zero */
6618   #if DECTRACE
6619     printf("UAS borrow: add %ld, carry %ld\n", add, carry);
6620   #endif
6621   if ((add-carry-1)!=0) {
6622     *c=(Unit)(add-carry-1);
6623     c++;		      /* interesting, include it */
6624     }
6625   return clsu-c;	      /* -ve result indicates borrowed */
6626   } /* decUnitAddSub */
6627 
6628 /* ------------------------------------------------------------------ */
6629 /* decTrim -- trim trailing zeros or normalize			      */
6630 /*								      */
6631 /*   dn is the number to trim or normalize			      */
6632 /*   set is the context to use to check for clamp		      */
6633 /*   all is 1 to remove all trailing zeros, 0 for just fraction ones  */
6634 /*   dropped returns the number of discarded trailing zeros	      */
6635 /*   returns dn							      */
6636 /*								      */
6637 /* If clamp is set in the context then the number of zeros trimmed    */
6638 /* may be limited if the exponent is high.			      */
6639 /* All fields are updated as required.	This is a utility operation,  */
6640 /* so special values are unchanged and no error is possible.	      */
6641 /* ------------------------------------------------------------------ */
6642 static decNumber * decTrim(decNumber *dn, decContext *set, Flag all,
6643 			   Int *dropped) {
6644   Int	d, exp;			   /* work */
6645   uInt	cut;			   /* .. */
6646   Unit	*up;			   /* -> current Unit */
6647 
6648   #if DECCHECK
6649   if (decCheckOperands(dn, DECUNUSED, DECUNUSED, DECUNCONT)) return dn;
6650   #endif
6651 
6652   *dropped=0;				/* assume no zeros dropped */
6653   if ((dn->bits & DECSPECIAL)		/* fast exit if special .. */
6654     || (*dn->lsu & 0x01)) return dn;	/* .. or odd */
6655   if (ISZERO(dn)) {			/* .. or 0 */
6656     dn->exponent=0;			/* (sign is preserved) */
6657     return dn;
6658     }
6659 
6660   /* have a finite number which is even */
6661   exp=dn->exponent;
6662   cut=1;			   /* digit (1-DECDPUN) in Unit */
6663   up=dn->lsu;			   /* -> current Unit */
6664   for (d=0; d<dn->digits-1; d++) { /* [don't strip the final digit] */
6665     /* slice by powers */
6666     #if DECDPUN<=4
6667       uInt quot=QUOT10(*up, cut);
6668       if ((*up-quot*powers[cut])!=0) break;  /* found non-0 digit */
6669     #else
6670       if (*up%powers[cut]!=0) break;	     /* found non-0 digit */
6671     #endif
6672     /* have a trailing 0 */
6673     if (!all) {			   /* trimming */
6674       /* [if exp>0 then all trailing 0s are significant for trim] */
6675       if (exp<=0) {		   /* if digit might be significant */
6676 	if (exp==0) break;	   /* then quit */
6677 	exp++;			   /* next digit might be significant */
6678 	}
6679       }
6680     cut++;			   /* next power */
6681     if (cut>DECDPUN) {		   /* need new Unit */
6682       up++;
6683       cut=1;
6684       }
6685     } /* d */
6686   if (d==0) return dn;		   /* none to drop */
6687 
6688   /* may need to limit drop if clamping */
6689   if (set->clamp) {
6690     Int maxd=set->emax-set->digits+1-dn->exponent;
6691     if (maxd<=0) return dn;	   /* nothing possible */
6692     if (d>maxd) d=maxd;
6693     }
6694 
6695   /* effect the drop */
6696   decShiftToLeast(dn->lsu, D2U(dn->digits), d);
6697   dn->exponent+=d;		   /* maintain numerical value */
6698   dn->digits-=d;		   /* new length */
6699   *dropped=d;			   /* report the count */
6700   return dn;
6701   } /* decTrim */
6702 
6703 /* ------------------------------------------------------------------ */
6704 /* decReverse -- reverse a Unit array in place			      */
6705 /*								      */
6706 /*   ulo    is the start of the array				      */
6707 /*   uhi    is the end of the array (highest Unit to include)	      */
6708 /*								      */
6709 /* The units ulo through uhi are reversed in place (if the number     */
6710 /* of units is odd, the middle one is untouched).  Note that the      */
6711 /* digit(s) in each unit are unaffected.			      */
6712 /* ------------------------------------------------------------------ */
6713 static void decReverse(Unit *ulo, Unit *uhi) {
6714   Unit temp;
6715   for (; ulo<uhi; ulo++, uhi--) {
6716     temp=*ulo;
6717     *ulo=*uhi;
6718     *uhi=temp;
6719     }
6720   return;
6721   } /* decReverse */
6722 
6723 /* ------------------------------------------------------------------ */
6724 /* decShiftToMost -- shift digits in array towards most significant   */
6725 /*								      */
6726 /*   uar    is the array					      */
6727 /*   digits is the count of digits in use in the array		      */
6728 /*   shift  is the number of zeros to pad with (least significant);   */
6729 /*     it must be zero or positive				      */
6730 /*								      */
6731 /*   returns the new length of the integer in the array, in digits    */
6732 /*								      */
6733 /* No overflow is permitted (that is, the uar array must be known to  */
6734 /* be large enough to hold the result, after shifting).		      */
6735 /* ------------------------------------------------------------------ */
6736 static Int decShiftToMost(Unit *uar, Int digits, Int shift) {
6737   Unit	*target, *source, *first;  /* work */
6738   Int	cut;			   /* odd 0's to add */
6739   uInt	next;			   /* work */
6740 
6741   if (shift==0) return digits;	   /* [fastpath] nothing to do */
6742   if ((digits+shift)<=DECDPUN) {   /* [fastpath] single-unit case */
6743     *uar=(Unit)(*uar*powers[shift]);
6744     return digits+shift;
6745     }
6746 
6747   next=0;			   /* all paths */
6748   source=uar+D2U(digits)-1;	   /* where msu comes from */
6749   target=source+D2U(shift);	   /* where upper part of first cut goes */
6750   cut=DECDPUN-MSUDIGITS(shift);	   /* where to slice */
6751   if (cut==0) {			   /* unit-boundary case */
6752     for (; source>=uar; source--, target--) *target=*source;
6753     }
6754    else {
6755     first=uar+D2U(digits+shift)-1; /* where msu of source will end up */
6756     for (; source>=uar; source--, target--) {
6757       /* split the source Unit and accumulate remainder for next */
6758       #if DECDPUN<=4
6759 	uInt quot=QUOT10(*source, cut);
6760 	uInt rem=*source-quot*powers[cut];
6761 	next+=quot;
6762       #else
6763 	uInt rem=*source%powers[cut];
6764 	next+=*source/powers[cut];
6765       #endif
6766       if (target<=first) *target=(Unit)next;   /* write to target iff valid */
6767       next=rem*powers[DECDPUN-cut];	       /* save remainder for next Unit */
6768       }
6769     } /* shift-move */
6770 
6771   /* propagate any partial unit to one below and clear the rest */
6772   for (; target>=uar; target--) {
6773     *target=(Unit)next;
6774     next=0;
6775     }
6776   return digits+shift;
6777   } /* decShiftToMost */
6778 
6779 /* ------------------------------------------------------------------ */
6780 /* decShiftToLeast -- shift digits in array towards least significant */
6781 /*								      */
6782 /*   uar   is the array						      */
6783 /*   units is length of the array, in units			      */
6784 /*   shift is the number of digits to remove from the lsu end; it     */
6785 /*     must be zero or positive and <= than units*DECDPUN.	      */
6786 /*								      */
6787 /*   returns the new length of the integer in the array, in units     */
6788 /*								      */
6789 /* Removed digits are discarded (lost).	 Units not required to hold   */
6790 /* the final result are unchanged.				      */
6791 /* ------------------------------------------------------------------ */
6792 static Int decShiftToLeast(Unit *uar, Int units, Int shift) {
6793   Unit	*target, *up;		   /* work */
6794   Int	cut, count;		   /* work */
6795   Int	quot, rem;		   /* for division */
6796 
6797   if (shift==0) return units;	   /* [fastpath] nothing to do */
6798   if (shift==units*DECDPUN) {	   /* [fastpath] little to do */
6799     *uar=0;			   /* all digits cleared gives zero */
6800     return 1;			   /* leaves just the one */
6801     }
6802 
6803   target=uar;			   /* both paths */
6804   cut=MSUDIGITS(shift);
6805   if (cut==DECDPUN) {		   /* unit-boundary case; easy */
6806     up=uar+D2U(shift);
6807     for (; up<uar+units; target++, up++) *target=*up;
6808     return target-uar;
6809     }
6810 
6811   /* messier */
6812   up=uar+D2U(shift-cut);	   /* source; correct to whole Units */
6813   count=units*DECDPUN-shift;	   /* the maximum new length */
6814   #if DECDPUN<=4
6815     quot=QUOT10(*up, cut);
6816   #else
6817     quot=*up/powers[cut];
6818   #endif
6819   for (; ; target++) {
6820     *target=(Unit)quot;
6821     count-=(DECDPUN-cut);
6822     if (count<=0) break;
6823     up++;
6824     quot=*up;
6825     #if DECDPUN<=4
6826       quot=QUOT10(quot, cut);
6827       rem=*up-quot*powers[cut];
6828     #else
6829       rem=quot%powers[cut];
6830       quot=quot/powers[cut];
6831     #endif
6832     *target=(Unit)(*target+rem*powers[DECDPUN-cut]);
6833     count-=cut;
6834     if (count<=0) break;
6835     }
6836   return target-uar+1;
6837   } /* decShiftToLeast */
6838 
6839 #if DECSUBSET
6840 /* ------------------------------------------------------------------ */
6841 /* decRoundOperand -- round an operand	[used for subset only]	      */
6842 /*								      */
6843 /*   dn is the number to round (dn->digits is > set->digits)	      */
6844 /*   set is the relevant context				      */
6845 /*   status is the status accumulator				      */
6846 /*								      */
6847 /*   returns an allocated decNumber with the rounded result.	      */
6848 /*								      */
6849 /* lostDigits and other status may be set by this.		      */
6850 /*								      */
6851 /* Since the input is an operand, it must not be modified.	      */
6852 /* Instead, return an allocated decNumber, rounded as required.	      */
6853 /* It is the caller's responsibility to free the allocated storage.   */
6854 /*								      */
6855 /* If no storage is available then the result cannot be used, so NULL */
6856 /* is returned.							      */
6857 /* ------------------------------------------------------------------ */
6858 static decNumber *decRoundOperand(const decNumber *dn, decContext *set,
6859 				  uInt *status) {
6860   decNumber *res;			/* result structure */
6861   uInt newstatus=0;			/* status from round */
6862   Int  residue=0;			/* rounding accumulator */
6863 
6864   /* Allocate storage for the returned decNumber, big enough for the */
6865   /* length specified by the context */
6866   res=(decNumber *)malloc(sizeof(decNumber)
6867 			  +(D2U(set->digits)-1)*sizeof(Unit));
6868   if (res==NULL) {
6869     *status|=DEC_Insufficient_storage;
6870     return NULL;
6871     }
6872   decCopyFit(res, dn, set, &residue, &newstatus);
6873   decApplyRound(res, set, residue, &newstatus);
6874 
6875   /* If that set Inexact then "lost digits" is raised... */
6876   if (newstatus & DEC_Inexact) newstatus|=DEC_Lost_digits;
6877   *status|=newstatus;
6878   return res;
6879   } /* decRoundOperand */
6880 #endif
6881 
6882 /* ------------------------------------------------------------------ */
6883 /* decCopyFit -- copy a number, truncating the coefficient if needed  */
6884 /*								      */
6885 /*   dest is the target decNumber				      */
6886 /*   src  is the source decNumber				      */
6887 /*   set is the context [used for length (digits) and rounding mode]  */
6888 /*   residue is the residue accumulator				      */
6889 /*   status contains the current status to be updated		      */
6890 /*								      */
6891 /* (dest==src is allowed and will be a no-op if fits)		      */
6892 /* All fields are updated as required.				      */
6893 /* ------------------------------------------------------------------ */
6894 static void decCopyFit(decNumber *dest, const decNumber *src,
6895 		       decContext *set, Int *residue, uInt *status) {
6896   dest->bits=src->bits;
6897   dest->exponent=src->exponent;
6898   decSetCoeff(dest, set, src->lsu, src->digits, residue, status);
6899   } /* decCopyFit */
6900 
6901 /* ------------------------------------------------------------------ */
6902 /* decSetCoeff -- set the coefficient of a number		      */
6903 /*								      */
6904 /*   dn	   is the number whose coefficient array is to be set.	      */
6905 /*	   It must have space for set->digits digits		      */
6906 /*   set   is the context [for size]				      */
6907 /*   lsu   -> lsu of the source coefficient [may be dn->lsu]	      */
6908 /*   len   is digits in the source coefficient [may be dn->digits]    */
6909 /*   residue is the residue accumulator.  This has values as in	      */
6910 /*	   decApplyRound, and will be unchanged unless the	      */
6911 /*	   target size is less than len.  In this case, the	      */
6912 /*	   coefficient is truncated and the residue is updated to     */
6913 /*	   reflect the previous residue and the dropped digits.	      */
6914 /*   status is the status accumulator, as usual			      */
6915 /*								      */
6916 /* The coefficient may already be in the number, or it can be an      */
6917 /* external intermediate array.	 If it is in the number, lsu must ==  */
6918 /* dn->lsu and len must == dn->digits.				      */
6919 /*								      */
6920 /* Note that the coefficient length (len) may be < set->digits, and   */
6921 /* in this case this merely copies the coefficient (or is a no-op     */
6922 /* if dn->lsu==lsu).						      */
6923 /*								      */
6924 /* Note also that (only internally, from decQuantizeOp and	      */
6925 /* decSetSubnormal) the value of set->digits may be less than one,    */
6926 /* indicating a round to left.	This routine handles that case	      */
6927 /* correctly; caller ensures space.				      */
6928 /*								      */
6929 /* dn->digits, dn->lsu (and as required), and dn->exponent are	      */
6930 /* updated as necessary.   dn->bits (sign) is unchanged.	      */
6931 /*								      */
6932 /* DEC_Rounded status is set if any digits are discarded.	      */
6933 /* DEC_Inexact status is set if any non-zero digits are discarded, or */
6934 /*			 incoming residue was non-0 (implies rounded) */
6935 /* ------------------------------------------------------------------ */
6936 /* mapping array: maps 0-9 to canonical residues, so that a residue */
6937 /* can be adjusted in the range [-1, +1] and achieve correct rounding */
6938 /*			       0  1  2	3  4  5	 6  7  8  9 */
6939 static const uByte resmap[10]={0, 3, 3, 3, 3, 5, 7, 7, 7, 7};
6940 static void decSetCoeff(decNumber *dn, decContext *set, const Unit *lsu,
6941 			Int len, Int *residue, uInt *status) {
6942   Int	discard;	      /* number of digits to discard */
6943   uInt	cut;		      /* cut point in Unit */
6944   const Unit *up;	      /* work */
6945   Unit	*target;	      /* .. */
6946   Int	count;		      /* .. */
6947   #if DECDPUN<=4
6948   uInt	temp;		      /* .. */
6949   #endif
6950 
6951   discard=len-set->digits;    /* digits to discard */
6952   if (discard<=0) {	      /* no digits are being discarded */
6953     if (dn->lsu!=lsu) {	      /* copy needed */
6954       /* copy the coefficient array to the result number; no shift needed */
6955       count=len;	      /* avoids D2U */
6956       up=lsu;
6957       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
6958 	*target=*up;
6959       dn->digits=len;	      /* set the new length */
6960       }
6961     /* dn->exponent and residue are unchanged, record any inexactitude */
6962     if (*residue!=0) *status|=(DEC_Inexact | DEC_Rounded);
6963     return;
6964     }
6965 
6966   /* some digits must be discarded ... */
6967   dn->exponent+=discard;      /* maintain numerical value */
6968   *status|=DEC_Rounded;	      /* accumulate Rounded status */
6969   if (*residue>1) *residue=1; /* previous residue now to right, so reduce */
6970 
6971   if (discard>len) {	      /* everything, +1, is being discarded */
6972     /* guard digit is 0 */
6973     /* residue is all the number [NB could be all 0s] */
6974     if (*residue<=0) {	      /* not already positive */
6975       count=len;	      /* avoids D2U */
6976       for (up=lsu; count>0; up++, count-=DECDPUN) if (*up!=0) { /* found non-0 */
6977 	*residue=1;
6978 	break;		      /* no need to check any others */
6979 	}
6980       }
6981     if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
6982     *dn->lsu=0;		      /* coefficient will now be 0 */
6983     dn->digits=1;	      /* .. */
6984     return;
6985     } /* total discard */
6986 
6987   /* partial discard [most common case] */
6988   /* here, at least the first (most significant) discarded digit exists */
6989 
6990   /* spin up the number, noting residue during the spin, until get to */
6991   /* the Unit with the first discarded digit.  When reach it, extract */
6992   /* it and remember its position */
6993   count=0;
6994   for (up=lsu;; up++) {
6995     count+=DECDPUN;
6996     if (count>=discard) break; /* full ones all checked */
6997     if (*up!=0) *residue=1;
6998     } /* up */
6999 
7000   /* here up -> Unit with first discarded digit */
7001   cut=discard-(count-DECDPUN)-1;
7002   if (cut==DECDPUN-1) {	      /* unit-boundary case (fast) */
7003     Unit half=(Unit)powers[DECDPUN]>>1;
7004     /* set residue directly */
7005     if (*up>=half) {
7006       if (*up>half) *residue=7;
7007       else *residue+=5;	      /* add sticky bit */
7008       }
7009      else { /* <half */
7010       if (*up!=0) *residue=3; /* [else is 0, leave as sticky bit] */
7011       }
7012     if (set->digits<=0) {     /* special for Quantize/Subnormal :-( */
7013       *dn->lsu=0;	      /* .. result is 0 */
7014       dn->digits=1;	      /* .. */
7015       }
7016      else {		      /* shift to least */
7017       count=set->digits;      /* now digits to end up with */
7018       dn->digits=count;	      /* set the new length */
7019       up++;		      /* move to next */
7020       /* on unit boundary, so shift-down copy loop is simple */
7021       for (target=dn->lsu; count>0; target++, up++, count-=DECDPUN)
7022 	*target=*up;
7023       }
7024     } /* unit-boundary case */
7025 
7026    else { /* discard digit is in low digit(s), and not top digit */
7027     uInt  discard1;		   /* first discarded digit */
7028     uInt  quot, rem;		   /* for divisions */
7029     if (cut==0) quot=*up;	   /* is at bottom of unit */
7030      else /* cut>0 */ {		   /* it's not at bottom of unit */
7031       #if DECDPUN<=4
7032 	quot=QUOT10(*up, cut);
7033 	rem=*up-quot*powers[cut];
7034       #else
7035 	rem=*up%powers[cut];
7036 	quot=*up/powers[cut];
7037       #endif
7038       if (rem!=0) *residue=1;
7039       }
7040     /* discard digit is now at bottom of quot */
7041     #if DECDPUN<=4
7042       temp=(quot*6554)>>16;	   /* fast /10 */
7043       /* Vowels algorithm here not a win (9 instructions) */
7044       discard1=quot-X10(temp);
7045       quot=temp;
7046     #else
7047       discard1=quot%10;
7048       quot=quot/10;
7049     #endif
7050     /* here, discard1 is the guard digit, and residue is everything */
7051     /* else [use mapping array to accumulate residue safely] */
7052     *residue+=resmap[discard1];
7053     cut++;			   /* update cut */
7054     /* here: up -> Unit of the array with bottom digit */
7055     /*	     cut is the division point for each Unit */
7056     /*	     quot holds the uncut high-order digits for the current unit */
7057     if (set->digits<=0) {	   /* special for Quantize/Subnormal :-( */
7058       *dn->lsu=0;		   /* .. result is 0 */
7059       dn->digits=1;		   /* .. */
7060       }
7061      else {			   /* shift to least needed */
7062       count=set->digits;	   /* now digits to end up with */
7063       dn->digits=count;		   /* set the new length */
7064       /* shift-copy the coefficient array to the result number */
7065       for (target=dn->lsu; ; target++) {
7066 	*target=(Unit)quot;
7067 	count-=(DECDPUN-cut);
7068 	if (count<=0) break;
7069 	up++;
7070 	quot=*up;
7071 	#if DECDPUN<=4
7072 	  quot=QUOT10(quot, cut);
7073 	  rem=*up-quot*powers[cut];
7074 	#else
7075 	  rem=quot%powers[cut];
7076 	  quot=quot/powers[cut];
7077 	#endif
7078 	*target=(Unit)(*target+rem*powers[DECDPUN-cut]);
7079 	count-=cut;
7080 	if (count<=0) break;
7081 	} /* shift-copy loop */
7082       } /* shift to least */
7083     } /* not unit boundary */
7084 
7085   if (*residue!=0) *status|=DEC_Inexact; /* record inexactitude */
7086   return;
7087   } /* decSetCoeff */
7088 
7089 /* ------------------------------------------------------------------ */
7090 /* decApplyRound -- apply pending rounding to a number		      */
7091 /*								      */
7092 /*   dn	   is the number, with space for set->digits digits	      */
7093 /*   set   is the context [for size and rounding mode]		      */
7094 /*   residue indicates pending rounding, being any accumulated	      */
7095 /*	   guard and sticky information.  It may be:		      */
7096 /*	   6-9: rounding digit is >5				      */
7097 /*	   5:	rounding digit is exactly half-way		      */
7098 /*	   1-4: rounding digit is <5 and >0			      */
7099 /*	   0:	the coefficient is exact			      */
7100 /*	  -1:	as 1, but the hidden digits are subtractive, that     */
7101 /*		is, of the opposite sign to dn.	 In this case the     */
7102 /*		coefficient must be non-0.  This case occurs when     */
7103 /*		subtracting a small number (which can be reduced to   */
7104 /*		a sticky bit); see decAddOp.			      */
7105 /*   status is the status accumulator, as usual			      */
7106 /*								      */
7107 /* This routine applies rounding while keeping the length of the      */
7108 /* coefficient constant.  The exponent and status are unchanged	      */
7109 /* except if:							      */
7110 /*								      */
7111 /*   -- the coefficient was increased and is all nines (in which      */
7112 /*	case Overflow could occur, and is handled directly here so    */
7113 /*	the caller does not need to re-test for overflow)	      */
7114 /*								      */
7115 /*   -- the coefficient was decreased and becomes all nines (in which */
7116 /*	case Underflow could occur, and is also handled directly).    */
7117 /*								      */
7118 /* All fields in dn are updated as required.			      */
7119 /*								      */
7120 /* ------------------------------------------------------------------ */
7121 static void decApplyRound(decNumber *dn, decContext *set, Int residue,
7122 			  uInt *status) {
7123   Int  bump;		      /* 1 if coefficient needs to be incremented */
7124 			      /* -1 if coefficient needs to be decremented */
7125 
7126   if (residue==0) return;     /* nothing to apply */
7127 
7128   bump=0;		      /* assume a smooth ride */
7129 
7130   /* now decide whether, and how, to round, depending on mode */
7131   switch (set->round) {
7132     case DEC_ROUND_05UP: {    /* round zero or five up (for reround) */
7133       /* This is the same as DEC_ROUND_DOWN unless there is a */
7134       /* positive residue and the lsd of dn is 0 or 5, in which case */
7135       /* it is bumped; when residue is <0, the number is therefore */
7136       /* bumped down unless the final digit was 1 or 6 (in which */
7137       /* case it is bumped down and then up -- a no-op) */
7138       Int lsd5=*dn->lsu%5;     /* get lsd and quintate */
7139       if (residue<0 && lsd5!=1) bump=-1;
7140        else if (residue>0 && lsd5==0) bump=1;
7141       /* [bump==1 could be applied directly; use common path for clarity] */
7142       break;} /* r-05 */
7143 
7144     case DEC_ROUND_DOWN: {
7145       /* no change, except if negative residue */
7146       if (residue<0) bump=-1;
7147       break;} /* r-d */
7148 
7149     case DEC_ROUND_HALF_DOWN: {
7150       if (residue>5) bump=1;
7151       break;} /* r-h-d */
7152 
7153     case DEC_ROUND_HALF_EVEN: {
7154       if (residue>5) bump=1;		/* >0.5 goes up */
7155        else if (residue==5) {		/* exactly 0.5000... */
7156 	/* 0.5 goes up iff [new] lsd is odd */
7157 	if (*dn->lsu & 0x01) bump=1;
7158 	}
7159       break;} /* r-h-e */
7160 
7161     case DEC_ROUND_HALF_UP: {
7162       if (residue>=5) bump=1;
7163       break;} /* r-h-u */
7164 
7165     case DEC_ROUND_UP: {
7166       if (residue>0) bump=1;
7167       break;} /* r-u */
7168 
7169     case DEC_ROUND_CEILING: {
7170       /* same as _UP for positive numbers, and as _DOWN for negatives */
7171       /* [negative residue cannot occur on 0] */
7172       if (decNumberIsNegative(dn)) {
7173 	if (residue<0) bump=-1;
7174 	}
7175        else {
7176 	if (residue>0) bump=1;
7177 	}
7178       break;} /* r-c */
7179 
7180     case DEC_ROUND_FLOOR: {
7181       /* same as _UP for negative numbers, and as _DOWN for positive */
7182       /* [negative residue cannot occur on 0] */
7183       if (!decNumberIsNegative(dn)) {
7184 	if (residue<0) bump=-1;
7185 	}
7186        else {
7187 	if (residue>0) bump=1;
7188 	}
7189       break;} /* r-f */
7190 
7191     default: {	    /* e.g., DEC_ROUND_MAX */
7192       *status|=DEC_Invalid_context;
7193       #if DECTRACE || (DECCHECK && DECVERB)
7194       printf("Unknown rounding mode: %d\n", set->round);
7195       #endif
7196       break;}
7197     } /* switch */
7198 
7199   /* now bump the number, up or down, if need be */
7200   if (bump==0) return;			     /* no action required */
7201 
7202   /* Simply use decUnitAddSub unless bumping up and the number is */
7203   /* all nines.	 In this special case set to 100... explicitly */
7204   /* and adjust the exponent by one (as otherwise could overflow */
7205   /* the array) */
7206   /* Similarly handle all-nines result if bumping down. */
7207   if (bump>0) {
7208     Unit *up;				     /* work */
7209     uInt count=dn->digits;		     /* digits to be checked */
7210     for (up=dn->lsu; ; up++) {
7211       if (count<=DECDPUN) {
7212 	/* this is the last Unit (the msu) */
7213 	if (*up!=powers[count]-1) break;     /* not still 9s */
7214 	/* here if it, too, is all nines */
7215 	*up=(Unit)powers[count-1];	     /* here 999 -> 100 etc. */
7216 	for (up=up-1; up>=dn->lsu; up--) *up=0; /* others all to 0 */
7217 	dn->exponent++;			     /* and bump exponent */
7218 	/* [which, very rarely, could cause Overflow...] */
7219 	if ((dn->exponent+dn->digits)>set->emax+1) {
7220 	  decSetOverflow(dn, set, status);
7221 	  }
7222 	return;				     /* done */
7223 	}
7224       /* a full unit to check, with more to come */
7225       if (*up!=DECDPUNMAX) break;	     /* not still 9s */
7226       count-=DECDPUN;
7227       } /* up */
7228     } /* bump>0 */
7229    else {				     /* -1 */
7230     /* here checking for a pre-bump of 1000... (leading 1, all */
7231     /* other digits zero) */
7232     Unit *up, *sup;			     /* work */
7233     uInt count=dn->digits;		     /* digits to be checked */
7234     for (up=dn->lsu; ; up++) {
7235       if (count<=DECDPUN) {
7236 	/* this is the last Unit (the msu) */
7237 	if (*up!=powers[count-1]) break;     /* not 100.. */
7238 	/* here if have the 1000... case */
7239 	sup=up;				     /* save msu pointer */
7240 	*up=(Unit)powers[count]-1;	     /* here 100 in msu -> 999 */
7241 	/* others all to all-nines, too */
7242 	for (up=up-1; up>=dn->lsu; up--) *up=(Unit)powers[DECDPUN]-1;
7243 	dn->exponent--;			     /* and bump exponent */
7244 
7245 	/* iff the number was at the subnormal boundary (exponent=etiny) */
7246 	/* then the exponent is now out of range, so it will in fact get */
7247 	/* clamped to etiny and the final 9 dropped. */
7248 	/* printf(">> emin=%d exp=%d sdig=%d\n", set->emin, */
7249 	/*	  dn->exponent, set->digits); */
7250 	if (dn->exponent+1==set->emin-set->digits+1) {
7251 	  if (count==1 && dn->digits==1) *sup=0;  /* here 9 -> 0[.9] */
7252 	   else {
7253 	    *sup=(Unit)powers[count-1]-1;    /* here 999.. in msu -> 99.. */
7254 	    dn->digits--;
7255 	    }
7256 	  dn->exponent++;
7257 	  *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7258 	  }
7259 	return;				     /* done */
7260 	}
7261 
7262       /* a full unit to check, with more to come */
7263       if (*up!=0) break;		     /* not still 0s */
7264       count-=DECDPUN;
7265       } /* up */
7266 
7267     } /* bump<0 */
7268 
7269   /* Actual bump needed.  Do it. */
7270   decUnitAddSub(dn->lsu, D2U(dn->digits), uarrone, 1, 0, dn->lsu, bump);
7271   } /* decApplyRound */
7272 
7273 #if DECSUBSET
7274 /* ------------------------------------------------------------------ */
7275 /* decFinish -- finish processing a number			      */
7276 /*								      */
7277 /*   dn is the number						      */
7278 /*   set is the context						      */
7279 /*   residue is the rounding accumulator (as in decApplyRound)	      */
7280 /*   status is the accumulator					      */
7281 /*								      */
7282 /* This finishes off the current number by:			      */
7283 /*    1. If not extended:					      */
7284 /*	 a. Converting a zero result to clean '0'		      */
7285 /*	 b. Reducing positive exponents to 0, if would fit in digits  */
7286 /*    2. Checking for overflow and subnormals (always)		      */
7287 /* Note this is just Finalize when no subset arithmetic.	      */
7288 /* All fields are updated as required.				      */
7289 /* ------------------------------------------------------------------ */
7290 static void decFinish(decNumber *dn, decContext *set, Int *residue,
7291 		      uInt *status) {
7292   if (!set->extended) {
7293     if ISZERO(dn) {		   /* value is zero */
7294       dn->exponent=0;		   /* clean exponent .. */
7295       dn->bits=0;		   /* .. and sign */
7296       return;			   /* no error possible */
7297       }
7298     if (dn->exponent>=0) {	   /* non-negative exponent */
7299       /* >0; reduce to integer if possible */
7300       if (set->digits >= (dn->exponent+dn->digits)) {
7301 	dn->digits=decShiftToMost(dn->lsu, dn->digits, dn->exponent);
7302 	dn->exponent=0;
7303 	}
7304       }
7305     } /* !extended */
7306 
7307   decFinalize(dn, set, residue, status);
7308   } /* decFinish */
7309 #endif
7310 
7311 /* ------------------------------------------------------------------ */
7312 /* decFinalize -- final check, clamp, and round of a number	      */
7313 /*								      */
7314 /*   dn is the number						      */
7315 /*   set is the context						      */
7316 /*   residue is the rounding accumulator (as in decApplyRound)	      */
7317 /*   status is the status accumulator				      */
7318 /*								      */
7319 /* This finishes off the current number by checking for subnormal     */
7320 /* results, applying any pending rounding, checking for overflow,     */
7321 /* and applying any clamping.					      */
7322 /* Underflow and overflow conditions are raised as appropriate.	      */
7323 /* All fields are updated as required.				      */
7324 /* ------------------------------------------------------------------ */
7325 static void decFinalize(decNumber *dn, decContext *set, Int *residue,
7326 			uInt *status) {
7327   Int shift;				/* shift needed if clamping */
7328   Int tinyexp=set->emin-dn->digits+1;	/* precalculate subnormal boundary */
7329 
7330   /* Must be careful, here, when checking the exponent as the */
7331   /* adjusted exponent could overflow 31 bits [because it may already */
7332   /* be up to twice the expected]. */
7333 
7334   /* First test for subnormal.	This must be done before any final */
7335   /* round as the result could be rounded to Nmin or 0. */
7336   if (dn->exponent<=tinyexp) {		/* prefilter */
7337     Int comp;
7338     decNumber nmin;
7339     /* A very nasty case here is dn == Nmin and residue<0 */
7340     if (dn->exponent<tinyexp) {
7341       /* Go handle subnormals; this will apply round if needed. */
7342       decSetSubnormal(dn, set, residue, status);
7343       return;
7344       }
7345     /* Equals case: only subnormal if dn=Nmin and negative residue */
7346     decNumberZero(&nmin);
7347     nmin.lsu[0]=1;
7348     nmin.exponent=set->emin;
7349     comp=decCompare(dn, &nmin, 1);		  /* (signless compare) */
7350     if (comp==BADINT) {				  /* oops */
7351       *status|=DEC_Insufficient_storage;	  /* abandon... */
7352       return;
7353       }
7354     if (*residue<0 && comp==0) {		  /* neg residue and dn==Nmin */
7355       decApplyRound(dn, set, *residue, status);	  /* might force down */
7356       decSetSubnormal(dn, set, residue, status);
7357       return;
7358       }
7359     }
7360 
7361   /* now apply any pending round (this could raise overflow). */
7362   if (*residue!=0) decApplyRound(dn, set, *residue, status);
7363 
7364   /* Check for overflow [redundant in the 'rare' case] or clamp */
7365   if (dn->exponent<=set->emax-set->digits+1) return;   /* neither needed */
7366 
7367 
7368   /* here when might have an overflow or clamp to do */
7369   if (dn->exponent>set->emax-dn->digits+1) {	       /* too big */
7370     decSetOverflow(dn, set, status);
7371     return;
7372     }
7373   /* here when the result is normal but in clamp range */
7374   if (!set->clamp) return;
7375 
7376   /* here when need to apply the IEEE exponent clamp (fold-down) */
7377   shift=dn->exponent-(set->emax-set->digits+1);
7378 
7379   /* shift coefficient (if non-zero) */
7380   if (!ISZERO(dn)) {
7381     dn->digits=decShiftToMost(dn->lsu, dn->digits, shift);
7382     }
7383   dn->exponent-=shift;	 /* adjust the exponent to match */
7384   *status|=DEC_Clamped;	 /* and record the dirty deed */
7385   return;
7386   } /* decFinalize */
7387 
7388 /* ------------------------------------------------------------------ */
7389 /* decSetOverflow -- set number to proper overflow value	      */
7390 /*								      */
7391 /*   dn is the number (used for sign [only] and result)		      */
7392 /*   set is the context [used for the rounding mode, etc.]	      */
7393 /*   status contains the current status to be updated		      */
7394 /*								      */
7395 /* This sets the sign of a number and sets its value to either	      */
7396 /* Infinity or the maximum finite value, depending on the sign of     */
7397 /* dn and the rounding mode, following IEEE 854 rules.		      */
7398 /* ------------------------------------------------------------------ */
7399 static void decSetOverflow(decNumber *dn, decContext *set, uInt *status) {
7400   Flag needmax=0;		   /* result is maximum finite value */
7401   uByte sign=dn->bits&DECNEG;	   /* clean and save sign bit */
7402 
7403   if (ISZERO(dn)) {		   /* zero does not overflow magnitude */
7404     Int emax=set->emax;			     /* limit value */
7405     if (set->clamp) emax-=set->digits-1;     /* lower if clamping */
7406     if (dn->exponent>emax) {		     /* clamp required */
7407       dn->exponent=emax;
7408       *status|=DEC_Clamped;
7409       }
7410     return;
7411     }
7412 
7413   decNumberZero(dn);
7414   switch (set->round) {
7415     case DEC_ROUND_DOWN: {
7416       needmax=1;		   /* never Infinity */
7417       break;} /* r-d */
7418     case DEC_ROUND_05UP: {
7419       needmax=1;		   /* never Infinity */
7420       break;} /* r-05 */
7421     case DEC_ROUND_CEILING: {
7422       if (sign) needmax=1;	   /* Infinity if non-negative */
7423       break;} /* r-c */
7424     case DEC_ROUND_FLOOR: {
7425       if (!sign) needmax=1;	   /* Infinity if negative */
7426       break;} /* r-f */
7427     default: break;		   /* Infinity in all other cases */
7428     }
7429   if (needmax) {
7430     decSetMaxValue(dn, set);
7431     dn->bits=sign;		   /* set sign */
7432     }
7433    else dn->bits=sign|DECINF;	   /* Value is +/-Infinity */
7434   *status|=DEC_Overflow | DEC_Inexact | DEC_Rounded;
7435   } /* decSetOverflow */
7436 
7437 /* ------------------------------------------------------------------ */
7438 /* decSetMaxValue -- set number to +Nmax (maximum normal value)	      */
7439 /*								      */
7440 /*   dn is the number to set					      */
7441 /*   set is the context [used for digits and emax]		      */
7442 /*								      */
7443 /* This sets the number to the maximum positive value.		      */
7444 /* ------------------------------------------------------------------ */
7445 static void decSetMaxValue(decNumber *dn, decContext *set) {
7446   Unit *up;			   /* work */
7447   Int count=set->digits;	   /* nines to add */
7448   dn->digits=count;
7449   /* fill in all nines to set maximum value */
7450   for (up=dn->lsu; ; up++) {
7451     if (count>DECDPUN) *up=DECDPUNMAX;	/* unit full o'nines */
7452      else {				/* this is the msu */
7453       *up=(Unit)(powers[count]-1);
7454       break;
7455       }
7456     count-=DECDPUN;		   /* filled those digits */
7457     } /* up */
7458   dn->bits=0;			   /* + sign */
7459   dn->exponent=set->emax-set->digits+1;
7460   } /* decSetMaxValue */
7461 
7462 /* ------------------------------------------------------------------ */
7463 /* decSetSubnormal -- process value whose exponent is <Emin	      */
7464 /*								      */
7465 /*   dn is the number (used as input as well as output; it may have   */
7466 /*	   an allowed subnormal value, which may need to be rounded)  */
7467 /*   set is the context [used for the rounding mode]		      */
7468 /*   residue is any pending residue				      */
7469 /*   status contains the current status to be updated		      */
7470 /*								      */
7471 /* If subset mode, set result to zero and set Underflow flags.	      */
7472 /*								      */
7473 /* Value may be zero with a low exponent; this does not set Subnormal */
7474 /* but the exponent will be clamped to Etiny.			      */
7475 /*								      */
7476 /* Otherwise ensure exponent is not out of range, and round as	      */
7477 /* necessary.  Underflow is set if the result is Inexact.	      */
7478 /* ------------------------------------------------------------------ */
7479 static void decSetSubnormal(decNumber *dn, decContext *set, Int *residue,
7480 			    uInt *status) {
7481   decContext workset;	      /* work */
7482   Int	     etiny, adjust;   /* .. */
7483 
7484   #if DECSUBSET
7485   /* simple set to zero and 'hard underflow' for subset */
7486   if (!set->extended) {
7487     decNumberZero(dn);
7488     /* always full overflow */
7489     *status|=DEC_Underflow | DEC_Subnormal | DEC_Inexact | DEC_Rounded;
7490     return;
7491     }
7492   #endif
7493 
7494   /* Full arithmetic -- allow subnormals, rounded to minimum exponent */
7495   /* (Etiny) if needed */
7496   etiny=set->emin-(set->digits-1);	/* smallest allowed exponent */
7497 
7498   if ISZERO(dn) {			/* value is zero */
7499     /* residue can never be non-zero here */
7500     #if DECCHECK
7501       if (*residue!=0) {
7502 	printf("++ Subnormal 0 residue %ld\n", (LI)*residue);
7503 	*status|=DEC_Invalid_operation;
7504 	}
7505     #endif
7506     if (dn->exponent<etiny) {		/* clamp required */
7507       dn->exponent=etiny;
7508       *status|=DEC_Clamped;
7509       }
7510     return;
7511     }
7512 
7513   *status|=DEC_Subnormal;		/* have a non-zero subnormal */
7514   adjust=etiny-dn->exponent;		/* calculate digits to remove */
7515   if (adjust<=0) {			/* not out of range; unrounded */
7516     /* residue can never be non-zero here, except in the Nmin-residue */
7517     /* case (which is a subnormal result), so can take fast-path here */
7518     /* it may already be inexact (from setting the coefficient) */
7519     if (*status&DEC_Inexact) *status|=DEC_Underflow;
7520     return;
7521     }
7522 
7523   /* adjust>0, so need to rescale the result so exponent becomes Etiny */
7524   /* [this code is similar to that in rescale] */
7525   workset=*set;				/* clone rounding, etc. */
7526   workset.digits=dn->digits-adjust;	/* set requested length */
7527   workset.emin-=adjust;			/* and adjust emin to match */
7528   /* [note that the latter can be <1, here, similar to Rescale case] */
7529   decSetCoeff(dn, &workset, dn->lsu, dn->digits, residue, status);
7530   decApplyRound(dn, &workset, *residue, status);
7531 
7532   /* Use 754R/854 default rule: Underflow is set iff Inexact */
7533   /* [independent of whether trapped] */
7534   if (*status&DEC_Inexact) *status|=DEC_Underflow;
7535 
7536   /* if rounded up a 999s case, exponent will be off by one; adjust */
7537   /* back if so [it will fit, because it was shortened earlier] */
7538   if (dn->exponent>etiny) {
7539     dn->digits=decShiftToMost(dn->lsu, dn->digits, 1);
7540     dn->exponent--;			/* (re)adjust the exponent. */
7541     }
7542 
7543   /* if rounded to zero, it is by definition clamped... */
7544   if (ISZERO(dn)) *status|=DEC_Clamped;
7545   } /* decSetSubnormal */
7546 
7547 /* ------------------------------------------------------------------ */
7548 /* decCheckMath - check entry conditions for a math function	      */
7549 /*								      */
7550 /*   This checks the context and the operand			      */
7551 /*								      */
7552 /*   rhs is the operand to check				      */
7553 /*   set is the context to check				      */
7554 /*   status is unchanged if both are good			      */
7555 /*								      */
7556 /* returns non-zero if status is changed, 0 otherwise		      */
7557 /*								      */
7558 /* Restrictions enforced:					      */
7559 /*								      */
7560 /*   digits, emax, and -emin in the context must be less than	      */
7561 /*   DEC_MAX_MATH (999999), and A must be within these bounds if      */
7562 /*   non-zero.	Invalid_operation is set in the status if a	      */
7563 /*   restriction is violated.					      */
7564 /* ------------------------------------------------------------------ */
7565 static uInt decCheckMath(const decNumber *rhs, decContext *set,
7566 			 uInt *status) {
7567   uInt save=*status;			     /* record */
7568   if (set->digits>DEC_MAX_MATH
7569    || set->emax>DEC_MAX_MATH
7570    || -set->emin>DEC_MAX_MATH) *status|=DEC_Invalid_context;
7571    else if ((rhs->digits>DEC_MAX_MATH
7572      || rhs->exponent+rhs->digits>DEC_MAX_MATH+1
7573      || rhs->exponent+rhs->digits<2*(1-DEC_MAX_MATH))
7574      && !ISZERO(rhs)) *status|=DEC_Invalid_operation;
7575   return (*status!=save);
7576   } /* decCheckMath */
7577 
7578 /* ------------------------------------------------------------------ */
7579 /* decGetInt -- get integer from a number			      */
7580 /*								      */
7581 /*   dn is the number [which will not be altered]		      */
7582 /*								      */
7583 /*   returns one of:						      */
7584 /*     BADINT if there is a non-zero fraction			      */
7585 /*     the converted integer					      */
7586 /*     BIGEVEN if the integer is even and magnitude > 2*10**9	      */
7587 /*     BIGODD  if the integer is odd  and magnitude > 2*10**9	      */
7588 /*								      */
7589 /* This checks and gets a whole number from the input decNumber.      */
7590 /* The sign can be determined from dn by the caller when BIGEVEN or   */
7591 /* BIGODD is returned.						      */
7592 /* ------------------------------------------------------------------ */
7593 static Int decGetInt(const decNumber *dn) {
7594   Int  theInt;				/* result accumulator */
7595   const Unit *up;			/* work */
7596   Int  got;				/* digits (real or not) processed */
7597   Int  ilength=dn->digits+dn->exponent; /* integral length */
7598   Flag neg=decNumberIsNegative(dn);	/* 1 if -ve */
7599 
7600   /* The number must be an integer that fits in 10 digits */
7601   /* Assert, here, that 10 is enough for any rescale Etiny */
7602   #if DEC_MAX_EMAX > 999999999
7603     #error GetInt may need updating [for Emax]
7604   #endif
7605   #if DEC_MIN_EMIN < -999999999
7606     #error GetInt may need updating [for Emin]
7607   #endif
7608   if (ISZERO(dn)) return 0;		/* zeros are OK, with any exponent */
7609 
7610   up=dn->lsu;				/* ready for lsu */
7611   theInt=0;				/* ready to accumulate */
7612   if (dn->exponent>=0) {		/* relatively easy */
7613     /* no fractional part [usual]; allow for positive exponent */
7614     got=dn->exponent;
7615     }
7616    else { /* -ve exponent; some fractional part to check and discard */
7617     Int count=-dn->exponent;		/* digits to discard */
7618     /* spin up whole units until reach the Unit with the unit digit */
7619     for (; count>=DECDPUN; up++) {
7620       if (*up!=0) return BADINT;	/* non-zero Unit to discard */
7621       count-=DECDPUN;
7622       }
7623     if (count==0) got=0;		/* [a multiple of DECDPUN] */
7624      else {				/* [not multiple of DECDPUN] */
7625       Int rem;				/* work */
7626       /* slice off fraction digits and check for non-zero */
7627       #if DECDPUN<=4
7628 	theInt=QUOT10(*up, count);
7629 	rem=*up-theInt*powers[count];
7630       #else
7631 	rem=*up%powers[count];		/* slice off discards */
7632 	theInt=*up/powers[count];
7633       #endif
7634       if (rem!=0) return BADINT;	/* non-zero fraction */
7635       /* it looks good */
7636       got=DECDPUN-count;		/* number of digits so far */
7637       up++;				/* ready for next */
7638       }
7639     }
7640   /* now it's known there's no fractional part */
7641 
7642   /* tricky code now, to accumulate up to 9.3 digits */
7643   if (got==0) {theInt=*up; got+=DECDPUN; up++;} /* ensure lsu is there */
7644 
7645   if (ilength<11) {
7646     Int save=theInt;
7647     /* collect any remaining unit(s) */
7648     for (; got<ilength; up++) {
7649       theInt+=*up*powers[got];
7650       got+=DECDPUN;
7651       }
7652     if (ilength==10) {			/* need to check for wrap */
7653       if (theInt/(Int)powers[got-DECDPUN]!=(Int)*(up-1)) ilength=11;
7654 	 /* [that test also disallows the BADINT result case] */
7655        else if (neg && theInt>1999999997) ilength=11;
7656        else if (!neg && theInt>999999999) ilength=11;
7657       if (ilength==11) theInt=save;	/* restore correct low bit */
7658       }
7659     }
7660 
7661   if (ilength>10) {			/* too big */
7662     if (theInt&1) return BIGODD;	/* bottom bit 1 */
7663     return BIGEVEN;			/* bottom bit 0 */
7664     }
7665 
7666   if (neg) theInt=-theInt;		/* apply sign */
7667   return theInt;
7668   } /* decGetInt */
7669 
7670 /* ------------------------------------------------------------------ */
7671 /* decDecap -- decapitate the coefficient of a number		      */
7672 /*								      */
7673 /*   dn	  is the number to be decapitated			      */
7674 /*   drop is the number of digits to be removed from the left of dn;  */
7675 /*     this must be <= dn->digits (if equal, the coefficient is	      */
7676 /*     set to 0)						      */
7677 /*								      */
7678 /* Returns dn; dn->digits will be <= the initial digits less drop     */
7679 /* (after removing drop digits there may be leading zero digits	      */
7680 /* which will also be removed).	 Only dn->lsu and dn->digits change.  */
7681 /* ------------------------------------------------------------------ */
7682 static decNumber *decDecap(decNumber *dn, Int drop) {
7683   Unit *msu;				/* -> target cut point */
7684   Int cut;				/* work */
7685   if (drop>=dn->digits) {		/* losing the whole thing */
7686     #if DECCHECK
7687     if (drop>dn->digits)
7688       printf("decDecap called with drop>digits [%ld>%ld]\n",
7689 	     (LI)drop, (LI)dn->digits);
7690     #endif
7691     dn->lsu[0]=0;
7692     dn->digits=1;
7693     return dn;
7694     }
7695   msu=dn->lsu+D2U(dn->digits-drop)-1;	/* -> likely msu */
7696   cut=MSUDIGITS(dn->digits-drop);	/* digits to be in use in msu */
7697   if (cut!=DECDPUN) *msu%=powers[cut];	/* clear left digits */
7698   /* that may have left leading zero digits, so do a proper count... */
7699   dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1);
7700   return dn;
7701   } /* decDecap */
7702 
7703 /* ------------------------------------------------------------------ */
7704 /* decBiStr -- compare string with pairwise options		      */
7705 /*								      */
7706 /*   targ is the string to compare				      */
7707 /*   str1 is one of the strings to compare against (length may be 0)  */
7708 /*   str2 is the other; it must be the same length as str1	      */
7709 /*								      */
7710 /*   returns 1 if strings compare equal, (that is, it is the same     */
7711 /*   length as str1 and str2, and each character of targ is in either */
7712 /*   str1 or str2 in the corresponding position), or 0 otherwise      */
7713 /*								      */
7714 /* This is used for generic caseless compare, including the awkward   */
7715 /* case of the Turkish dotted and dotless Is.  Use as (for example):  */
7716 /*   if (decBiStr(test, "mike", "MIKE")) ...			      */
7717 /* ------------------------------------------------------------------ */
7718 static Flag decBiStr(const char *targ, const char *str1, const char *str2) {
7719   for (;;targ++, str1++, str2++) {
7720     if (*targ!=*str1 && *targ!=*str2) return 0;
7721     /* *targ has a match in one (or both, if terminator) */
7722     if (*targ=='\0') break;
7723     } /* forever */
7724   return 1;
7725   } /* decBiStr */
7726 
7727 /* ------------------------------------------------------------------ */
7728 /* decNaNs -- handle NaN operand or operands			      */
7729 /*								      */
7730 /*   res     is the result number				      */
7731 /*   lhs     is the first operand				      */
7732 /*   rhs     is the second operand, or NULL if none		      */
7733 /*   context is used to limit payload length			      */
7734 /*   status  contains the current status			      */
7735 /*   returns res in case convenient				      */
7736 /*								      */
7737 /* Called when one or both operands is a NaN, and propagates the      */
7738 /* appropriate result to res.  When an sNaN is found, it is changed   */
7739 /* to a qNaN and Invalid operation is set.			      */
7740 /* ------------------------------------------------------------------ */
7741 static decNumber * decNaNs(decNumber *res, const decNumber *lhs,
7742 			   const decNumber *rhs, decContext *set,
7743 			   uInt *status) {
7744   /* This decision tree ends up with LHS being the source pointer, */
7745   /* and status updated if need be */
7746   if (lhs->bits & DECSNAN)
7747     *status|=DEC_Invalid_operation | DEC_sNaN;
7748    else if (rhs==NULL);
7749    else if (rhs->bits & DECSNAN) {
7750     lhs=rhs;
7751     *status|=DEC_Invalid_operation | DEC_sNaN;
7752     }
7753    else if (lhs->bits & DECNAN);
7754    else lhs=rhs;
7755 
7756   /* propagate the payload */
7757   if (lhs->digits<=set->digits) decNumberCopy(res, lhs); /* easy */
7758    else { /* too long */
7759     const Unit *ul;
7760     Unit *ur, *uresp1;
7761     /* copy safe number of units, then decapitate */
7762     res->bits=lhs->bits;		/* need sign etc. */
7763     uresp1=res->lsu+D2U(set->digits);
7764     for (ur=res->lsu, ul=lhs->lsu; ur<uresp1; ur++, ul++) *ur=*ul;
7765     res->digits=D2U(set->digits)*DECDPUN;
7766     /* maybe still too long */
7767     if (res->digits>set->digits) decDecap(res, res->digits-set->digits);
7768     }
7769 
7770   res->bits&=~DECSNAN;	      /* convert any sNaN to NaN, while */
7771   res->bits|=DECNAN;	      /* .. preserving sign */
7772   res->exponent=0;	      /* clean exponent */
7773 			      /* [coefficient was copied/decapitated] */
7774   return res;
7775   } /* decNaNs */
7776 
7777 /* ------------------------------------------------------------------ */
7778 /* decStatus -- apply non-zero status				      */
7779 /*								      */
7780 /*   dn	    is the number to set if error			      */
7781 /*   status contains the current status (not yet in context)	      */
7782 /*   set    is the context					      */
7783 /*								      */
7784 /* If the status is an error status, the number is set to a NaN,      */
7785 /* unless the error was an overflow, divide-by-zero, or underflow,    */
7786 /* in which case the number will have already been set.		      */
7787 /*								      */
7788 /* The context status is then updated with the new status.  Note that */
7789 /* this may raise a signal, so control may never return from this     */
7790 /* routine (hence resources must be recovered before it is called).   */
7791 /* ------------------------------------------------------------------ */
7792 static void decStatus(decNumber *dn, uInt status, decContext *set) {
7793   if (status & DEC_NaNs) {		/* error status -> NaN */
7794     /* if cause was an sNaN, clear and propagate [NaN is already set up] */
7795     if (status & DEC_sNaN) status&=~DEC_sNaN;
7796      else {
7797       decNumberZero(dn);		/* other error: clean throughout */
7798       dn->bits=DECNAN;			/* and make a quiet NaN */
7799       }
7800     }
7801   decContextSetStatus(set, status);	/* [may not return] */
7802   return;
7803   } /* decStatus */
7804 
7805 /* ------------------------------------------------------------------ */
7806 /* decGetDigits -- count digits in a Units array		      */
7807 /*								      */
7808 /*   uar is the Unit array holding the number (this is often an	      */
7809 /*	    accumulator of some sort)				      */
7810 /*   len is the length of the array in units [>=1]		      */
7811 /*								      */
7812 /*   returns the number of (significant) digits in the array	      */
7813 /*								      */
7814 /* All leading zeros are excluded, except the last if the array has   */
7815 /* only zero Units.						      */
7816 /* ------------------------------------------------------------------ */
7817 /* This may be called twice during some operations. */
7818 static Int decGetDigits(Unit *uar, Int len) {
7819   Unit *up=uar+(len-1);		   /* -> msu */
7820   Int  digits=(len-1)*DECDPUN+1;   /* possible digits excluding msu */
7821   #if DECDPUN>4
7822   uInt const *pow;		   /* work */
7823   #endif
7824 				   /* (at least 1 in final msu) */
7825   #if DECCHECK
7826   if (len<1) printf("decGetDigits called with len<1 [%ld]\n", (LI)len);
7827   #endif
7828 
7829   for (; up>=uar; up--) {
7830     if (*up==0) {		   /* unit is all 0s */
7831       if (digits==1) break;	   /* a zero has one digit */
7832       digits-=DECDPUN;		   /* adjust for 0 unit */
7833       continue;}
7834     /* found the first (most significant) non-zero Unit */
7835     #if DECDPUN>1		   /* not done yet */
7836     if (*up<10) break;		   /* is 1-9 */
7837     digits++;
7838     #if DECDPUN>2		   /* not done yet */
7839     if (*up<100) break;		   /* is 10-99 */
7840     digits++;
7841     #if DECDPUN>3		   /* not done yet */
7842     if (*up<1000) break;	   /* is 100-999 */
7843     digits++;
7844     #if DECDPUN>4		   /* count the rest ... */
7845     for (pow=&powers[4]; *up>=*pow; pow++) digits++;
7846     #endif
7847     #endif
7848     #endif
7849     #endif
7850     break;
7851     } /* up */
7852   return digits;
7853   } /* decGetDigits */
7854 
7855 #if DECTRACE | DECCHECK
7856 /* ------------------------------------------------------------------ */
7857 /* decNumberShow -- display a number [debug aid]		      */
7858 /*   dn is the number to show					      */
7859 /*								      */
7860 /* Shows: sign, exponent, coefficient (msu first), digits	      */
7861 /*    or: sign, special-value					      */
7862 /* ------------------------------------------------------------------ */
7863 /* this is public so other modules can use it */
7864 void decNumberShow(const decNumber *dn) {
7865   const Unit *up;		   /* work */
7866   uInt u, d;			   /* .. */
7867   Int cut;			   /* .. */
7868   char isign='+';		   /* main sign */
7869   if (dn==NULL) {
7870     printf("NULL\n");
7871     return;}
7872   if (decNumberIsNegative(dn)) isign='-';
7873   printf(" >> %c ", isign);
7874   if (dn->bits&DECSPECIAL) {	   /* Is a special value */
7875     if (decNumberIsInfinite(dn)) printf("Infinity");
7876      else {				     /* a NaN */
7877       if (dn->bits&DECSNAN) printf("sNaN");  /* signalling NaN */
7878        else printf("NaN");
7879       }
7880     /* if coefficient and exponent are 0, no more to do */
7881     if (dn->exponent==0 && dn->digits==1 && *dn->lsu==0) {
7882       printf("\n");
7883       return;}
7884     /* drop through to report other information */
7885     printf(" ");
7886     }
7887 
7888   /* now carefully display the coefficient */
7889   up=dn->lsu+D2U(dn->digits)-1;		/* msu */
7890   printf("%ld", (LI)*up);
7891   for (up=up-1; up>=dn->lsu; up--) {
7892     u=*up;
7893     printf(":");
7894     for (cut=DECDPUN-1; cut>=0; cut--) {
7895       d=u/powers[cut];
7896       u-=d*powers[cut];
7897       printf("%ld", (LI)d);
7898       } /* cut */
7899     } /* up */
7900   if (dn->exponent!=0) {
7901     char esign='+';
7902     if (dn->exponent<0) esign='-';
7903     printf(" E%c%ld", esign, (LI)abs(dn->exponent));
7904     }
7905   printf(" [%ld]\n", (LI)dn->digits);
7906   } /* decNumberShow */
7907 #endif
7908 
7909 #if DECTRACE || DECCHECK
7910 /* ------------------------------------------------------------------ */
7911 /* decDumpAr -- display a unit array [debug/check aid]		      */
7912 /*   name is a single-character tag name			      */
7913 /*   ar	  is the array to display				      */
7914 /*   len  is the length of the array in Units			      */
7915 /* ------------------------------------------------------------------ */
7916 static void decDumpAr(char name, const Unit *ar, Int len) {
7917   Int i;
7918   const char *spec;
7919   #if DECDPUN==9
7920     spec="%09d ";
7921   #elif DECDPUN==8
7922     spec="%08d ";
7923   #elif DECDPUN==7
7924     spec="%07d ";
7925   #elif DECDPUN==6
7926     spec="%06d ";
7927   #elif DECDPUN==5
7928     spec="%05d ";
7929   #elif DECDPUN==4
7930     spec="%04d ";
7931   #elif DECDPUN==3
7932     spec="%03d ";
7933   #elif DECDPUN==2
7934     spec="%02d ";
7935   #else
7936     spec="%d ";
7937   #endif
7938   printf("  :%c: ", name);
7939   for (i=len-1; i>=0; i--) {
7940     if (i==len-1) printf("%ld ", (LI)ar[i]);
7941      else printf(spec, ar[i]);
7942     }
7943   printf("\n");
7944   return;}
7945 #endif
7946 
7947 #if DECCHECK
7948 /* ------------------------------------------------------------------ */
7949 /* decCheckOperands -- check operand(s) to a routine		      */
7950 /*   res is the result structure (not checked; it will be set to      */
7951 /*	    quiet NaN if error found (and it is not NULL))	      */
7952 /*   lhs is the first operand (may be DECUNRESU)		      */
7953 /*   rhs is the second (may be DECUNUSED)			      */
7954 /*   set is the context (may be DECUNCONT)			      */
7955 /*   returns 0 if both operands, and the context are clean, or 1      */
7956 /*     otherwise (in which case the context will show an error,	      */
7957 /*     unless NULL).  Note that res is not cleaned; caller should     */
7958 /*     handle this so res=NULL case is safe.			      */
7959 /* The caller is expected to abandon immediately if 1 is returned.    */
7960 /* ------------------------------------------------------------------ */
7961 static Flag decCheckOperands(decNumber *res, const decNumber *lhs,
7962 			     const decNumber *rhs, decContext *set) {
7963   Flag bad=0;
7964   if (set==NULL) {		   /* oops; hopeless */
7965     #if DECTRACE || DECVERB
7966     printf("Reference to context is NULL.\n");
7967     #endif
7968     bad=1;
7969     return 1;}
7970    else if (set!=DECUNCONT
7971      && (set->digits<1 || set->round>=DEC_ROUND_MAX)) {
7972     bad=1;
7973     #if DECTRACE || DECVERB
7974     printf("Bad context [digits=%ld round=%ld].\n",
7975 	   (LI)set->digits, (LI)set->round);
7976     #endif
7977     }
7978    else {
7979     if (res==NULL) {
7980       bad=1;
7981       #if DECTRACE
7982       /* this one not DECVERB as standard tests include NULL */
7983       printf("Reference to result is NULL.\n");
7984       #endif
7985       }
7986     if (!bad && lhs!=DECUNUSED) bad=(decCheckNumber(lhs));
7987     if (!bad && rhs!=DECUNUSED) bad=(decCheckNumber(rhs));
7988     }
7989   if (bad) {
7990     if (set!=DECUNCONT) decContextSetStatus(set, DEC_Invalid_operation);
7991     if (res!=DECUNRESU && res!=NULL) {
7992       decNumberZero(res);
7993       res->bits=DECNAN;	      /* qNaN */
7994       }
7995     }
7996   return bad;
7997   } /* decCheckOperands */
7998 
7999 /* ------------------------------------------------------------------ */
8000 /* decCheckNumber -- check a number				      */
8001 /*   dn is the number to check					      */
8002 /*   returns 0 if the number is clean, or 1 otherwise		      */
8003 /*								      */
8004 /* The number is considered valid if it could be a result from some   */
8005 /* operation in some valid context.				      */
8006 /* ------------------------------------------------------------------ */
8007 static Flag decCheckNumber(const decNumber *dn) {
8008   const Unit *up;	      /* work */
8009   uInt maxuint;		      /* .. */
8010   Int ae, d, digits;	      /* .. */
8011   Int emin, emax;	      /* .. */
8012 
8013   if (dn==NULL) {	      /* hopeless */
8014     #if DECTRACE
8015     /* this one not DECVERB as standard tests include NULL */
8016     printf("Reference to decNumber is NULL.\n");
8017     #endif
8018     return 1;}
8019 
8020   /* check special values */
8021   if (dn->bits & DECSPECIAL) {
8022     if (dn->exponent!=0) {
8023       #if DECTRACE || DECVERB
8024       printf("Exponent %ld (not 0) for a special value [%02x].\n",
8025 	     (LI)dn->exponent, dn->bits);
8026       #endif
8027       return 1;}
8028 
8029     /* 2003.09.08: NaNs may now have coefficients, so next tests Inf only */
8030     if (decNumberIsInfinite(dn)) {
8031       if (dn->digits!=1) {
8032 	#if DECTRACE || DECVERB
8033 	printf("Digits %ld (not 1) for an infinity.\n", (LI)dn->digits);
8034 	#endif
8035 	return 1;}
8036       if (*dn->lsu!=0) {
8037 	#if DECTRACE || DECVERB
8038 	printf("LSU %ld (not 0) for an infinity.\n", (LI)*dn->lsu);
8039 	#endif
8040 	decDumpAr('I', dn->lsu, D2U(dn->digits));
8041 	return 1;}
8042       } /* Inf */
8043     /* 2002.12.26: negative NaNs can now appear through proposed IEEE */
8044     /*		   concrete formats (decimal64, etc.). */
8045     return 0;
8046     }
8047 
8048   /* check the coefficient */
8049   if (dn->digits<1 || dn->digits>DECNUMMAXP) {
8050     #if DECTRACE || DECVERB
8051     printf("Digits %ld in number.\n", (LI)dn->digits);
8052     #endif
8053     return 1;}
8054 
8055   d=dn->digits;
8056 
8057   for (up=dn->lsu; d>0; up++) {
8058     if (d>DECDPUN) maxuint=DECDPUNMAX;
8059      else {		      /* reached the msu */
8060       maxuint=powers[d]-1;
8061       if (dn->digits>1 && *up<powers[d-1]) {
8062 	#if DECTRACE || DECVERB
8063 	printf("Leading 0 in number.\n");
8064 	decNumberShow(dn);
8065 	#endif
8066 	return 1;}
8067       }
8068     if (*up>maxuint) {
8069       #if DECTRACE || DECVERB
8070       printf("Bad Unit [%08lx] in %ld-digit number at offset %ld [maxuint %ld].\n",
8071 	      (LI)*up, (LI)dn->digits, (LI)(up-dn->lsu), (LI)maxuint);
8072       #endif
8073       return 1;}
8074     d-=DECDPUN;
8075     }
8076 
8077   /* check the exponent.  Note that input operands can have exponents */
8078   /* which are out of the set->emin/set->emax and set->digits range */
8079   /* (just as they can have more digits than set->digits). */
8080   ae=dn->exponent+dn->digits-1;	   /* adjusted exponent */
8081   emax=DECNUMMAXE;
8082   emin=DECNUMMINE;
8083   digits=DECNUMMAXP;
8084   if (ae<emin-(digits-1)) {
8085     #if DECTRACE || DECVERB
8086     printf("Adjusted exponent underflow [%ld].\n", (LI)ae);
8087     decNumberShow(dn);
8088     #endif
8089     return 1;}
8090   if (ae>+emax) {
8091     #if DECTRACE || DECVERB
8092     printf("Adjusted exponent overflow [%ld].\n", (LI)ae);
8093     decNumberShow(dn);
8094     #endif
8095     return 1;}
8096 
8097   return 0;		 /* it's OK */
8098   } /* decCheckNumber */
8099 
8100 /* ------------------------------------------------------------------ */
8101 /* decCheckInexact -- check a normal finite inexact result has digits */
8102 /*   dn is the number to check					      */
8103 /*   set is the context (for status and precision)		      */
8104 /*   sets Invalid operation, etc., if some digits are missing	      */
8105 /* [this check is not made for DECSUBSET compilation or when	      */
8106 /* subnormal is not set]					      */
8107 /* ------------------------------------------------------------------ */
8108 static void decCheckInexact(const decNumber *dn, decContext *set) {
8109   #if !DECSUBSET && DECEXTFLAG
8110     if ((set->status & (DEC_Inexact|DEC_Subnormal))==DEC_Inexact
8111      && (set->digits!=dn->digits) && !(dn->bits & DECSPECIAL)) {
8112       #if DECTRACE || DECVERB
8113       printf("Insufficient digits [%ld] on normal Inexact result.\n",
8114 	     (LI)dn->digits);
8115       decNumberShow(dn);
8116       #endif
8117       decContextSetStatus(set, DEC_Invalid_operation);
8118       }
8119   #else
8120     /* next is a noop for quiet compiler */
8121     if (dn!=NULL && dn->digits==0) set->status|=DEC_Invalid_operation;
8122   #endif
8123   return;
8124   } /* decCheckInexact */
8125 #endif
8126 
8127 #if DECALLOC
8128 #undef malloc
8129 #undef free
8130 /* ------------------------------------------------------------------ */
8131 /* decMalloc -- accountable allocation routine			      */
8132 /*   n is the number of bytes to allocate			      */
8133 /*								      */
8134 /* Semantics is the same as the stdlib malloc routine, but bytes      */
8135 /* allocated are accounted for globally, and corruption fences are    */
8136 /* added before and after the 'actual' storage.			      */
8137 /* ------------------------------------------------------------------ */
8138 /* This routine allocates storage with an extra twelve bytes; 8 are   */
8139 /* at the start and hold:					      */
8140 /*   0-3 the original length requested				      */
8141 /*   4-7 buffer corruption detection fence (DECFENCE, x4)	      */
8142 /* The 4 bytes at the end also hold a corruption fence (DECFENCE, x4) */
8143 /* ------------------------------------------------------------------ */
8144 static void *decMalloc(size_t n) {
8145   uInt	size=n+12;		   /* true size */
8146   void	*alloc;			   /* -> allocated storage */
8147   uInt	*j;			   /* work */
8148   uByte *b, *b0;		   /* .. */
8149 
8150   alloc=malloc(size);		   /* -> allocated storage */
8151   if (alloc==NULL) return NULL;	   /* out of strorage */
8152   b0=(uByte *)alloc;		   /* as bytes */
8153   decAllocBytes+=n;		   /* account for storage */
8154   j=(uInt *)alloc;		   /* -> first four bytes */
8155   *j=n;				   /* save n */
8156   /* printf(" alloc ++ dAB: %ld (%d)\n", decAllocBytes, n); */
8157   for (b=b0+4; b<b0+8; b++) *b=DECFENCE;
8158   for (b=b0+n+8; b<b0+n+12; b++) *b=DECFENCE;
8159   return b0+8;			   /* -> play area */
8160   } /* decMalloc */
8161 
8162 /* ------------------------------------------------------------------ */
8163 /* decFree -- accountable free routine				      */
8164 /*   alloc is the storage to free				      */
8165 /*								      */
8166 /* Semantics is the same as the stdlib malloc routine, except that    */
8167 /* the global storage accounting is updated and the fences are	      */
8168 /* checked to ensure that no routine has written 'out of bounds'.     */
8169 /* ------------------------------------------------------------------ */
8170 /* This routine first checks that the fences have not been corrupted. */
8171 /* It then frees the storage using the 'truw' storage address (that   */
8172 /* is, offset by 8).						      */
8173 /* ------------------------------------------------------------------ */
8174 static void decFree(void *alloc) {
8175   uInt	*j, n;			   /* pointer, original length */
8176   uByte *b, *b0;		   /* work */
8177 
8178   if (alloc==NULL) return;	   /* allowed; it's a nop */
8179   b0=(uByte *)alloc;		   /* as bytes */
8180   b0-=8;			   /* -> true start of storage */
8181   j=(uInt *)b0;			   /* -> first four bytes */
8182   n=*j;				   /* lift */
8183   for (b=b0+4; b<b0+8; b++) if (*b!=DECFENCE)
8184     printf("=== Corrupt byte [%02x] at offset %d from %ld ===\n", *b,
8185 	   b-b0-8, (Int)b0);
8186   for (b=b0+n+8; b<b0+n+12; b++) if (*b!=DECFENCE)
8187     printf("=== Corrupt byte [%02x] at offset +%d from %ld, n=%ld ===\n", *b,
8188 	   b-b0-8, (Int)b0, n);
8189   free(b0);			   /* drop the storage */
8190   decAllocBytes-=n;		   /* account for storage */
8191   /* printf(" free -- dAB: %d (%d)\n", decAllocBytes, -n); */
8192   } /* decFree */
8193 #define malloc(a) decMalloc(a)
8194 #define free(a) decFree(a)
8195 #endif
8196