]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bc/src/num.c
contrib/bc: merge version 5.1.0 from vendor branch
[FreeBSD/FreeBSD.git] / contrib / bc / src / num.c
1 /*
2  * *****************************************************************************
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  *
6  * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * * Redistributions of source code must retain the above copyright notice, this
12  *   list of conditions and the following disclaimer.
13  *
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  *   this list of conditions and the following disclaimer in the documentation
16  *   and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * *****************************************************************************
31  *
32  * Code for the number type.
33  *
34  */
35
36 #include <assert.h>
37 #include <ctype.h>
38 #include <stdbool.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <setjmp.h>
42 #include <limits.h>
43
44 #include <num.h>
45 #include <rand.h>
46 #include <vm.h>
47
48 // Before you try to understand this code, see the development manual
49 // (manuals/development.md#numbers).
50
51 static void bc_num_m(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale);
52
53 /**
54  * Multiply two numbers and throw a math error if they overflow.
55  * @param a  The first operand.
56  * @param b  The second operand.
57  * @return   The product of the two operands.
58  */
59 static inline size_t bc_num_mulOverflow(size_t a, size_t b) {
60         size_t res = a * b;
61         if (BC_ERR(BC_VM_MUL_OVERFLOW(a, b, res))) bc_err(BC_ERR_MATH_OVERFLOW);
62         return res;
63 }
64
65 /**
66  * Conditionally negate @a n based on @a neg. Algorithm taken from
67  * https://graphics.stanford.edu/~seander/bithacks.html#ConditionalNegate .
68  * @param n    The value to turn into a signed value and negate.
69  * @param neg  The condition to negate or not.
70  */
71 static inline ssize_t bc_num_neg(size_t n, bool neg) {
72         return (((ssize_t) n) ^ -((ssize_t) neg)) + neg;
73 }
74
75 /**
76  * Compare a BcNum against zero.
77  * @param n  The number to compare.
78  * @return   -1 if the number is less than 0, 1 if greater, and 0 if equal.
79  */
80 ssize_t bc_num_cmpZero(const BcNum *n) {
81         return bc_num_neg((n)->len != 0, BC_NUM_NEG(n));
82 }
83
84 /**
85  * Return the number of integer limbs in a BcNum. This is the opposite of rdx.
86  * @param n  The number to return the amount of integer limbs for.
87  * @return   The amount of integer limbs in @a n.
88  */
89 static inline size_t bc_num_int(const BcNum *n) {
90         return n->len ? n->len - BC_NUM_RDX_VAL(n) : 0;
91 }
92
93 /**
94  * Expand a number's allocation capacity to at least req limbs.
95  * @param n    The number to expand.
96  * @param req  The number limbs to expand the allocation capacity to.
97  */
98 static void bc_num_expand(BcNum *restrict n, size_t req) {
99
100         assert(n != NULL);
101
102         req = req >= BC_NUM_DEF_SIZE ? req : BC_NUM_DEF_SIZE;
103
104         if (req > n->cap) {
105
106                 BC_SIG_LOCK;
107
108                 n->num = bc_vm_realloc(n->num, BC_NUM_SIZE(req));
109                 n->cap = req;
110
111                 BC_SIG_UNLOCK;
112         }
113 }
114
115 /**
116  * Set a number to 0 with the specified scale.
117  * @param n      The number to set to zero.
118  * @param scale  The scale to set the number to.
119  */
120 static void bc_num_setToZero(BcNum *restrict n, size_t scale) {
121         assert(n != NULL);
122         n->scale = scale;
123         n->len = n->rdx = 0;
124 }
125
126 void bc_num_zero(BcNum *restrict n) {
127         bc_num_setToZero(n, 0);
128 }
129
130 void bc_num_one(BcNum *restrict n) {
131         bc_num_zero(n);
132         n->len = 1;
133         n->num[0] = 1;
134 }
135
136 /**
137  * "Cleans" a number, which means reducing the length if the most significant
138  * limbs are zero.
139  * @param n  The number to clean.
140  */
141 static void bc_num_clean(BcNum *restrict n) {
142
143         // Reduce the length.
144         while (BC_NUM_NONZERO(n) && !n->num[n->len - 1]) n->len -= 1;
145
146         // Special cases.
147         if (BC_NUM_ZERO(n)) n->rdx = 0;
148         else {
149
150                 // len must be at least as much as rdx.
151                 size_t rdx = BC_NUM_RDX_VAL(n);
152                 if (n->len < rdx) n->len = rdx;
153         }
154 }
155
156 /**
157  * Returns the log base 10 of @a i. I could have done this with floating-point
158  * math, and in fact, I originally did. However, that was the only
159  * floating-point code in the entire codebase, and I decided I didn't want any.
160  * This is fast enough. Also, it might handle larger numbers better.
161  * @param i  The number to return the log base 10 of.
162  * @return   The log base 10 of @a i.
163  */
164 static size_t bc_num_log10(size_t i) {
165         size_t len;
166         for (len = 1; i; i /= BC_BASE, ++len);
167         assert(len - 1 <= BC_BASE_DIGS + 1);
168         return len - 1;
169 }
170
171 /**
172  * Returns the number of decimal digits in a limb that are zero starting at the
173  * most significant digits. This basically returns how much of the limb is used.
174  * @param n  The number.
175  * @return   The number of decimal digits that are 0 starting at the most
176  *           significant digits.
177  */
178 static inline size_t bc_num_zeroDigits(const BcDig *n) {
179         assert(*n >= 0);
180         assert(((size_t) *n) < BC_BASE_POW);
181         return BC_BASE_DIGS - bc_num_log10((size_t) *n);
182 }
183
184 /**
185  * Return the total number of integer digits in a number. This is the opposite
186  * of scale, like bc_num_int() is the opposite of rdx.
187  * @param n  The number.
188  * @return   The number of integer digits in @a n.
189  */
190 static size_t bc_num_intDigits(const BcNum *n) {
191         size_t digits = bc_num_int(n) * BC_BASE_DIGS;
192         if (digits > 0) digits -= bc_num_zeroDigits(n->num + n->len - 1);
193         return digits;
194 }
195
196 /**
197  * Returns the number of limbs of a number that are non-zero starting at the
198  * most significant limbs. This expects that there are *no* integer limbs in the
199  * number because it is specifically to figure out how many zero limbs after the
200  * decimal place to ignore. If there are zero limbs after non-zero limbs, they
201  * are counted as non-zero limbs.
202  * @param n  The number.
203  * @return   The number of non-zero limbs after the decimal point.
204  */
205 static size_t bc_num_nonZeroLen(const BcNum *restrict n) {
206         size_t i, len = n->len;
207         assert(len == BC_NUM_RDX_VAL(n));
208         for (i = len - 1; i < len && !n->num[i]; --i);
209         assert(i + 1 > 0);
210         return i + 1;
211 }
212
213 /**
214  * Performs a one-limb add with a carry.
215  * @param a      The first limb.
216  * @param b      The second limb.
217  * @param carry  An in/out parameter; the carry in from the previous add and the
218  *               carry out from this add.
219  * @return       The resulting limb sum.
220  */
221 static BcDig bc_num_addDigits(BcDig a, BcDig b, bool *carry) {
222
223         assert(((BcBigDig) BC_BASE_POW) * 2 == ((BcDig) BC_BASE_POW) * 2);
224         assert(a < BC_BASE_POW);
225         assert(b < BC_BASE_POW);
226
227         a += b + *carry;
228         *carry = (a >= BC_BASE_POW);
229         if (*carry) a -= BC_BASE_POW;
230
231         assert(a >= 0);
232         assert(a < BC_BASE_POW);
233
234         return a;
235 }
236
237 /**
238  * Performs a one-limb subtract with a carry.
239  * @param a      The first limb.
240  * @param b      The second limb.
241  * @param carry  An in/out parameter; the carry in from the previous subtract
242  *               and the carry out from this subtract.
243  * @return       The resulting limb difference.
244  */
245 static BcDig bc_num_subDigits(BcDig a, BcDig b, bool *carry) {
246
247         assert(a < BC_BASE_POW);
248         assert(b < BC_BASE_POW);
249
250         b += *carry;
251         *carry = (a < b);
252         if (*carry) a += BC_BASE_POW;
253
254         assert(a - b >= 0);
255         assert(a - b < BC_BASE_POW);
256
257         return a - b;
258 }
259
260 /**
261  * Add two BcDig arrays and store the result in the first array.
262  * @param a    The first operand and out array.
263  * @param b    The second operand.
264  * @param len  The length of @a b.
265  */
266 static void bc_num_addArrays(BcDig *restrict a, const BcDig *restrict b,
267                              size_t len)
268 {
269         size_t i;
270         bool carry = false;
271
272         for (i = 0; i < len; ++i) a[i] = bc_num_addDigits(a[i], b[i], &carry);
273
274         // Take care of the extra limbs in the bigger array.
275         for (; carry; ++i) a[i] = bc_num_addDigits(a[i], 0, &carry);
276 }
277
278 /**
279  * Subtract two BcDig arrays and store the result in the first array.
280  * @param a    The first operand and out array.
281  * @param b    The second operand.
282  * @param len  The length of @a b.
283  */
284 static void bc_num_subArrays(BcDig *restrict a, const BcDig *restrict b,
285                              size_t len)
286 {
287         size_t i;
288         bool carry = false;
289
290         for (i = 0; i < len; ++i) a[i] = bc_num_subDigits(a[i], b[i], &carry);
291
292         // Take care of the extra limbs in the bigger array.
293         for (; carry; ++i) a[i] = bc_num_subDigits(a[i], 0, &carry);
294 }
295
296 /**
297  * Multiply a BcNum array by a one-limb number. This is a faster version of
298  * multiplication for when we can use it.
299  * @param a  The BcNum to multiply by the one-limb number.
300  * @param b  The one limb of the one-limb number.
301  * @param c  The return parameter.
302  */
303 static void bc_num_mulArray(const BcNum *restrict a, BcBigDig b,
304                             BcNum *restrict c)
305 {
306         size_t i;
307         BcBigDig carry = 0;
308
309         assert(b <= BC_BASE_POW);
310
311         // Make sure the return parameter is big enough.
312         if (a->len + 1 > c->cap) bc_num_expand(c, a->len + 1);
313
314         // We want the entire return parameter to be zero for cleaning later.
315         memset(c->num, 0, BC_NUM_SIZE(c->cap));
316
317         // Actual multiplication loop.
318         for (i = 0; i < a->len; ++i) {
319                 BcBigDig in = ((BcBigDig) a->num[i]) * b + carry;
320                 c->num[i] = in % BC_BASE_POW;
321                 carry = in / BC_BASE_POW;
322         }
323
324         assert(carry < BC_BASE_POW);
325
326         // Finishing touches.
327         c->num[i] = (BcDig) carry;
328         c->len = a->len;
329         c->len += (carry != 0);
330
331         bc_num_clean(c);
332
333         // Postconditions.
334         assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c));
335         assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len);
336         assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len);
337 }
338
339 /**
340  * Divide a BcNum array by a one-limb number. This is a faster version of divide
341  * for when we can use it.
342  * @param a    The BcNum to multiply by the one-limb number.
343  * @param b    The one limb of the one-limb number.
344  * @param c    The return parameter for the quotient.
345  * @param rem  The return parameter for the remainder.
346  */
347 static void bc_num_divArray(const BcNum *restrict a, BcBigDig b,
348                             BcNum *restrict c, BcBigDig *rem)
349 {
350         size_t i;
351         BcBigDig carry = 0;
352
353         assert(c->cap >= a->len);
354
355         // Actual division loop.
356         for (i = a->len - 1; i < a->len; --i) {
357                 BcBigDig in = ((BcBigDig) a->num[i]) + carry * BC_BASE_POW;
358                 assert(in / b < BC_BASE_POW);
359                 c->num[i] = (BcDig) (in / b);
360                 carry = in % b;
361         }
362
363         // Finishing touches.
364         c->len = a->len;
365         bc_num_clean(c);
366         *rem = carry;
367
368         // Postconditions.
369         assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c));
370         assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len);
371         assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len);
372 }
373
374 /**
375  * Compare two BcDig arrays and return >0 if @a b is greater, <0 if @a b is
376  * less, and 0 if equal. Both @a a and @a b must have the same length.
377  * @param a    The first array.
378  * @param b    The second array.
379  * @param len  The minimum length of the arrays.
380  */
381 static ssize_t bc_num_compare(const BcDig *restrict a, const BcDig *restrict b,
382                               size_t len)
383 {
384         size_t i;
385         BcDig c = 0;
386         for (i = len - 1; i < len && !(c = a[i] - b[i]); --i);
387         return bc_num_neg(i + 1, c < 0);
388 }
389
390 ssize_t bc_num_cmp(const BcNum *a, const BcNum *b) {
391
392         size_t i, min, a_int, b_int, diff, ardx, brdx;
393         BcDig *max_num, *min_num;
394         bool a_max, neg = false;
395         ssize_t cmp;
396
397         assert(a != NULL && b != NULL);
398
399         // Same num? Equal.
400         if (a == b) return 0;
401
402         // Easy cases.
403         if (BC_NUM_ZERO(a)) return bc_num_neg(b->len != 0, !BC_NUM_NEG(b));
404         if (BC_NUM_ZERO(b)) return bc_num_cmpZero(a);
405         if (BC_NUM_NEG(a)) {
406                 if (BC_NUM_NEG(b)) neg = true;
407                 else return -1;
408         }
409         else if (BC_NUM_NEG(b)) return 1;
410
411         // Get the number of int limbs in each number and get the difference.
412         a_int = bc_num_int(a);
413         b_int = bc_num_int(b);
414         a_int -= b_int;
415
416         // If there's a difference, then just return the comparison.
417         if (a_int) return neg ? -((ssize_t) a_int) : (ssize_t) a_int;
418
419         // Get the rdx's and figure out the max.
420         ardx = BC_NUM_RDX_VAL(a);
421         brdx = BC_NUM_RDX_VAL(b);
422         a_max = (ardx > brdx);
423
424         // Set variables based on the above.
425         if (a_max) {
426                 min = brdx;
427                 diff = ardx - brdx;
428                 max_num = a->num + diff;
429                 min_num = b->num;
430         }
431         else {
432                 min = ardx;
433                 diff = brdx - ardx;
434                 max_num = b->num + diff;
435                 min_num = a->num;
436         }
437
438         // Do a full limb-by-limb comparison.
439         cmp = bc_num_compare(max_num, min_num, b_int + min);
440
441         // If we found a difference, return it based on state.
442         if (cmp) return bc_num_neg((size_t) cmp, !a_max == !neg);
443
444         // If there was no difference, then the final step is to check which number
445         // has greater or lesser limbs beyond the other's.
446         for (max_num -= diff, i = diff - 1; i < diff; --i) {
447                 if (max_num[i]) return bc_num_neg(1, !a_max == !neg);
448         }
449
450         return 0;
451 }
452
453 void bc_num_truncate(BcNum *restrict n, size_t places) {
454
455         size_t nrdx, places_rdx;
456
457         if (!places) return;
458
459         // Grab these needed values; places_rdx is the rdx equivalent to places like
460         // rdx is to scale.
461         nrdx = BC_NUM_RDX_VAL(n);
462         places_rdx = nrdx ? nrdx - BC_NUM_RDX(n->scale - places) : 0;
463
464         // We cannot truncate more places than we have.
465         assert(places <= n->scale && (BC_NUM_ZERO(n) || places_rdx <= n->len));
466
467         n->scale -= places;
468         BC_NUM_RDX_SET(n, nrdx - places_rdx);
469
470         // Only when the number is nonzero do we need to do the hard stuff.
471         if (BC_NUM_NONZERO(n)) {
472
473                 size_t pow;
474
475                 // This calculates how many decimal digits are in the least significant
476                 // limb.
477                 pow = n->scale % BC_BASE_DIGS;
478                 pow = pow ? BC_BASE_DIGS - pow : 0;
479                 pow = bc_num_pow10[pow];
480
481                 n->len -= places_rdx;
482
483                 // We have to move limbs to maintain invariants. The limbs must begin at
484                 // the beginning of the BcNum array.
485                 memmove(n->num, n->num + places_rdx, BC_NUM_SIZE(n->len));
486
487                 // Clear the lower part of the last digit.
488                 if (BC_NUM_NONZERO(n)) n->num[0] -= n->num[0] % (BcDig) pow;
489
490                 bc_num_clean(n);
491         }
492 }
493
494 void bc_num_extend(BcNum *restrict n, size_t places) {
495
496         size_t nrdx, places_rdx;
497
498         if (!places) return;
499
500         // Easy case with zero; set the scale.
501         if (BC_NUM_ZERO(n)) {
502                 n->scale += places;
503                 return;
504         }
505
506         // Grab these needed values; places_rdx is the rdx equivalent to places like
507         // rdx is to scale.
508         nrdx = BC_NUM_RDX_VAL(n);
509         places_rdx = BC_NUM_RDX(places + n->scale) - nrdx;
510
511         // This is the hard case. We need to expand the number, move the limbs, and
512         // set the limbs that were just cleared.
513         if (places_rdx) {
514                 bc_num_expand(n, bc_vm_growSize(n->len, places_rdx));
515                 memmove(n->num + places_rdx, n->num, BC_NUM_SIZE(n->len));
516                 memset(n->num, 0, BC_NUM_SIZE(places_rdx));
517         }
518
519         // Finally, set scale and rdx.
520         BC_NUM_RDX_SET(n, nrdx + places_rdx);
521         n->scale += places;
522         n->len += places_rdx;
523
524         assert(BC_NUM_RDX_VAL(n) == BC_NUM_RDX(n->scale));
525 }
526
527 /**
528  * Retires (finishes) a multiplication or division operation.
529  */
530 static void bc_num_retireMul(BcNum *restrict n, size_t scale,
531                              bool neg1, bool neg2)
532 {
533         // Make sure scale is correct.
534         if (n->scale < scale) bc_num_extend(n, scale - n->scale);
535         else bc_num_truncate(n, n->scale - scale);
536
537         bc_num_clean(n);
538
539         // We need to ensure rdx is correct.
540         if (BC_NUM_NONZERO(n)) n->rdx = BC_NUM_NEG_VAL(n, !neg1 != !neg2);
541 }
542
543 /**
544  * Splits a number into two BcNum's. This is used in Karatsuba.
545  * @param n    The number to split.
546  * @param idx  The index to split at.
547  * @param a    An out parameter; the low part of @a n.
548  * @param b    An out parameter; the high part of @a n.
549  */
550 static void bc_num_split(const BcNum *restrict n, size_t idx,
551                          BcNum *restrict a, BcNum *restrict b)
552 {
553         // We want a and b to be clear.
554         assert(BC_NUM_ZERO(a));
555         assert(BC_NUM_ZERO(b));
556
557         // The usual case.
558         if (idx < n->len) {
559
560                 // Set the fields first.
561                 b->len = n->len - idx;
562                 a->len = idx;
563                 a->scale = b->scale = 0;
564                 BC_NUM_RDX_SET(a, 0);
565                 BC_NUM_RDX_SET(b, 0);
566
567                 assert(a->cap >= a->len);
568                 assert(b->cap >= b->len);
569
570                 // Copy the arrays. This is not necessary for safety, but it is faster,
571                 // for some reason.
572                 memcpy(b->num, n->num + idx, BC_NUM_SIZE(b->len));
573                 memcpy(a->num, n->num, BC_NUM_SIZE(idx));
574
575                 bc_num_clean(b);
576         }
577         // If the index is weird, just skip the split.
578         else bc_num_copy(a, n);
579
580         bc_num_clean(a);
581 }
582
583 /**
584  * Copies a number into another, but shifts the rdx so that the result number
585  * only sees the integer part of the source number.
586  * @param n  The number to copy.
587  * @param r  The result number with a shifted rdx, len, and num.
588  */
589 static void bc_num_shiftRdx(const BcNum *restrict n, BcNum *restrict r) {
590
591         size_t rdx = BC_NUM_RDX_VAL(n);
592
593         r->len = n->len - rdx;
594         r->cap = n->cap - rdx;
595         r->num = n->num + rdx;
596
597         BC_NUM_RDX_SET_NEG(r, 0, BC_NUM_NEG(n));
598         r->scale = 0;
599 }
600
601 /**
602  * Shifts a number so that all of the least significant limbs of the number are
603  * skipped. This must be undone by bc_num_unshiftZero().
604  * @param n  The number to shift.
605  */
606 static size_t bc_num_shiftZero(BcNum *restrict n) {
607
608         size_t i;
609
610         // If we don't have an integer, that is a problem, but it's also a bug
611         // because the caller should have set everything up right.
612         assert(!BC_NUM_RDX_VAL(n) || BC_NUM_ZERO(n));
613
614         for (i = 0; i < n->len && !n->num[i]; ++i);
615
616         n->len -= i;
617         n->num += i;
618
619         return i;
620 }
621
622 /**
623  * Undo the damage done by bc_num_unshiftZero(). This must be called like all
624  * cleanup functions: after a label used by setjmp() and longjmp().
625  * @param n           The number to unshift.
626  * @param places_rdx  The amount the number was originally shift.
627  */
628 static void bc_num_unshiftZero(BcNum *restrict n, size_t places_rdx) {
629         n->len += places_rdx;
630         n->num -= places_rdx;
631 }
632
633 /**
634  * Shifts the digits right within a number by no more than BC_BASE_DIGS - 1.
635  * This is the final step on shifting numbers with the shift operators. It
636  * depends on the caller to shift the limbs properly because all it does is
637  * ensure that the rdx point is realigned to be between limbs.
638  * @param n    The number to shift digits in.
639  * @param dig  The number of places to shift right.
640  */
641 static void bc_num_shift(BcNum *restrict n, BcBigDig dig) {
642
643         size_t i, len = n->len;
644         BcBigDig carry = 0, pow;
645         BcDig *ptr = n->num;
646
647         assert(dig < BC_BASE_DIGS);
648
649         // Figure out the parameters for division.
650         pow = bc_num_pow10[dig];
651         dig = bc_num_pow10[BC_BASE_DIGS - dig];
652
653         // Run a series of divisions and mods with carries across the entire number
654         // array. This effectively shifts everything over.
655         for (i = len - 1; i < len; --i) {
656                 BcBigDig in, temp;
657                 in = ((BcBigDig) ptr[i]);
658                 temp = carry * dig;
659                 carry = in % pow;
660                 ptr[i] = ((BcDig) (in / pow)) + (BcDig) temp;
661         }
662
663         assert(!carry);
664 }
665
666 /**
667  * Shift a number left by a certain number of places. This is the workhorse of
668  * the left shift operator.
669  * @param n       The number to shift left.
670  * @param places  The amount of places to shift @a n left by.
671  */
672 static void bc_num_shiftLeft(BcNum *restrict n, size_t places) {
673
674         BcBigDig dig;
675         size_t places_rdx;
676         bool shift;
677
678         if (!places) return;
679
680         // Make sure to grow the number if necessary.
681         if (places > n->scale) {
682                 size_t size = bc_vm_growSize(BC_NUM_RDX(places - n->scale), n->len);
683                 if (size > SIZE_MAX - 1) bc_err(BC_ERR_MATH_OVERFLOW);
684         }
685
686         // If zero, we can just set the scale and bail.
687         if (BC_NUM_ZERO(n)) {
688                 if (n->scale >= places) n->scale -= places;
689                 else n->scale = 0;
690                 return;
691         }
692
693         // When I changed bc to have multiple digits per limb, this was the hardest
694         // code to change. This and shift right. Make sure you understand this
695         // before attempting anything.
696
697         // This is how many limbs we will shift.
698         dig = (BcBigDig) (places % BC_BASE_DIGS);
699         shift = (dig != 0);
700
701         // Convert places to a rdx value.
702         places_rdx = BC_NUM_RDX(places);
703
704         // If the number is not an integer, we need special care. The reason an
705         // integer doesn't is because left shift would only extend the integer,
706         // whereas a non-integer might have its fractional part eliminated or only
707         // partially eliminated.
708         if (n->scale) {
709
710                 size_t nrdx = BC_NUM_RDX_VAL(n);
711
712                 // If the number's rdx is bigger, that's the hard case.
713                 if (nrdx >= places_rdx) {
714
715                         size_t mod = n->scale % BC_BASE_DIGS, revdig;
716
717                         // We want mod to be in the range [1, BC_BASE_DIGS], not
718                         // [0, BC_BASE_DIGS).
719                         mod = mod ? mod : BC_BASE_DIGS;
720
721                         // We need to reverse dig to get the actual number of digits.
722                         revdig = dig ? BC_BASE_DIGS - dig : 0;
723
724                         // If the two overflow BC_BASE_DIGS, we need to move an extra place.
725                         if (mod + revdig > BC_BASE_DIGS) places_rdx = 1;
726                         else places_rdx = 0;
727                 }
728                 else places_rdx -= nrdx;
729         }
730
731         // If this is non-zero, we need an extra place, so expand, move, and set.
732         if (places_rdx) {
733                 bc_num_expand(n, bc_vm_growSize(n->len, places_rdx));
734                 memmove(n->num + places_rdx, n->num, BC_NUM_SIZE(n->len));
735                 memset(n->num, 0, BC_NUM_SIZE(places_rdx));
736                 n->len += places_rdx;
737         }
738
739         // Set the scale appropriately.
740         if (places > n->scale) {
741                 n->scale = 0;
742                 BC_NUM_RDX_SET(n, 0);
743         }
744         else {
745                 n->scale -= places;
746                 BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale));
747         }
748
749         // Finally, shift within limbs.
750         if (shift) bc_num_shift(n, BC_BASE_DIGS - dig);
751
752         bc_num_clean(n);
753 }
754
755 void bc_num_shiftRight(BcNum *restrict n, size_t places) {
756
757         BcBigDig dig;
758         size_t places_rdx, scale, scale_mod, int_len, expand;
759         bool shift;
760
761         if (!places) return;
762
763         // If zero, we can just set the scale and bail.
764         if (BC_NUM_ZERO(n)) {
765                 n->scale += places;
766                 bc_num_expand(n, BC_NUM_RDX(n->scale));
767                 return;
768         }
769
770         // Amount within a limb we have to shift by.
771         dig = (BcBigDig) (places % BC_BASE_DIGS);
772         shift = (dig != 0);
773
774         scale = n->scale;
775
776         // Figure out how the scale is affected.
777         scale_mod = scale % BC_BASE_DIGS;
778         scale_mod = scale_mod ? scale_mod : BC_BASE_DIGS;
779
780         // We need to know the int length and rdx for places.
781         int_len = bc_num_int(n);
782         places_rdx = BC_NUM_RDX(places);
783
784         // If we are going to shift past a limb boundary or not, set accordingly.
785         if (scale_mod + dig > BC_BASE_DIGS) {
786                 expand = places_rdx - 1;
787                 places_rdx = 1;
788         }
789         else {
790                 expand = places_rdx;
791                 places_rdx = 0;
792         }
793
794         // Clamp expanding.
795         if (expand > int_len) expand -= int_len;
796         else expand = 0;
797
798         // Extend, expand, and zero.
799         bc_num_extend(n, places_rdx * BC_BASE_DIGS);
800         bc_num_expand(n, bc_vm_growSize(expand, n->len));
801         memset(n->num + n->len, 0, BC_NUM_SIZE(expand));
802
803         // Set the fields.
804         n->len += expand;
805         n->scale = 0;
806         BC_NUM_RDX_SET(n, 0);
807
808         // Finally, shift within limbs.
809         if (shift) bc_num_shift(n, dig);
810
811         n->scale = scale + places;
812         BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale));
813
814         bc_num_clean(n);
815
816         assert(BC_NUM_RDX_VAL(n) <= n->len && n->len <= n->cap);
817         assert(BC_NUM_RDX_VAL(n) == BC_NUM_RDX(n->scale));
818 }
819
820 /**
821  * Invert @a into @a b at the current scale.
822  * @param a      The number to invert.
823  * @param b      The return parameter. This must be preallocated.
824  * @param scale  The current scale.
825  */
826 static inline void bc_num_inv(BcNum *a, BcNum *b, size_t scale) {
827         assert(BC_NUM_NONZERO(a));
828         bc_num_div(&vm.one, a, b, scale);
829 }
830
831 /**
832  * Tests if a number is a integer with scale or not. Returns true if the number
833  * is not an integer. If it is, its integer shifted form is copied into the
834  * result parameter for use where only integers are allowed.
835  * @param n  The integer to test and shift.
836  * @param r  The number to store the shifted result into. This number should
837  *           *not* be allocated.
838  * @return   True if the number is a non-integer, false otherwise.
839  */
840 static bool bc_num_nonInt(const BcNum *restrict n, BcNum *restrict r) {
841
842         bool zero;
843         size_t i, rdx = BC_NUM_RDX_VAL(n);
844
845         if (!rdx) {
846                 memcpy(r, n, sizeof(BcNum));
847                 return false;
848         }
849
850         zero = true;
851
852         for (i = 0; zero && i < rdx; ++i) zero = (n->num[i] == 0);
853
854         if (BC_ERR(!zero)) return true;
855
856         bc_num_shiftRdx(n, r);
857
858         return false;
859 }
860
861 #if BC_ENABLE_EXTRA_MATH
862
863 /**
864  * Execute common code for an operater that needs an integer for the second
865  * operand and return the integer operand as a BcBigDig.
866  * @param a  The first operand.
867  * @param b  The second operand.
868  * @param c  The result operand.
869  * @return   The second operand as a hardware integer.
870  */
871 static BcBigDig bc_num_intop(const BcNum *a, const BcNum *b, BcNum *restrict c)
872 {
873         BcNum temp;
874
875         if (BC_ERR(bc_num_nonInt(b, &temp))) bc_err(BC_ERR_MATH_NON_INTEGER);
876
877         bc_num_copy(c, a);
878
879         return bc_num_bigdig(&temp);
880 }
881 #endif // BC_ENABLE_EXTRA_MATH
882
883 /**
884  * This is the actual implementation of add *and* subtract. Since this function
885  * doesn't need to use scale (per the bc spec), I am hijacking it to say whether
886  * it's doing an add or a subtract. And then I convert substraction to addition
887  * of negative second operand. This is a BcNumBinOp function.
888  * @param a    The first operand.
889  * @param b    The second operand.
890  * @param c    The return parameter.
891  * @param sub  Non-zero for a subtract, zero for an add.
892  */
893 static void bc_num_as(BcNum *a, BcNum *b, BcNum *restrict c, size_t sub) {
894
895         BcDig *ptr_c, *ptr_l, *ptr_r;
896         size_t i, min_rdx, max_rdx, diff, a_int, b_int, min_len, max_len, max_int;
897         size_t len_l, len_r, ardx, brdx;
898         bool b_neg, do_sub, do_rev_sub, carry, c_neg;
899
900         if (BC_NUM_ZERO(b)) {
901                 bc_num_copy(c, a);
902                 return;
903         }
904
905         if (BC_NUM_ZERO(a)) {
906                 bc_num_copy(c, b);
907                 c->rdx = BC_NUM_NEG_VAL(c, BC_NUM_NEG(b) != sub);
908                 return;
909         }
910
911         // Invert sign of b if it is to be subtracted. This operation must
912         // precede the tests for any of the operands being zero.
913         b_neg = (BC_NUM_NEG(b) != sub);
914
915         // Figure out if we will actually add the numbers if their signs are equal
916         // or subtract.
917         do_sub = (BC_NUM_NEG(a) != b_neg);
918
919         a_int = bc_num_int(a);
920         b_int = bc_num_int(b);
921         max_int = BC_MAX(a_int, b_int);
922
923         // Figure out which number will have its last limbs copied (for addition) or
924         // subtracted (for subtraction).
925         ardx = BC_NUM_RDX_VAL(a);
926         brdx = BC_NUM_RDX_VAL(b);
927         min_rdx = BC_MIN(ardx, brdx);
928         max_rdx = BC_MAX(ardx, brdx);
929         diff = max_rdx - min_rdx;
930
931         max_len = max_int + max_rdx;
932
933         if (do_sub) {
934
935                 // Check whether b has to be subtracted from a or a from b.
936                 if (a_int != b_int) do_rev_sub = (a_int < b_int);
937                 else if (ardx > brdx)
938                         do_rev_sub = (bc_num_compare(a->num + diff, b->num, b->len) < 0);
939                 else
940                         do_rev_sub = (bc_num_compare(a->num, b->num + diff, a->len) <= 0);
941         }
942         else {
943
944                 // The result array of the addition might come out one element
945                 // longer than the bigger of the operand arrays.
946                 max_len += 1;
947                 do_rev_sub = (a_int < b_int);
948         }
949
950         assert(max_len <= c->cap);
951
952         // Cache values for simple code later.
953         if (do_rev_sub) {
954                 ptr_l = b->num;
955                 ptr_r = a->num;
956                 len_l = b->len;
957                 len_r = a->len;
958         }
959         else {
960                 ptr_l = a->num;
961                 ptr_r = b->num;
962                 len_l = a->len;
963                 len_r = b->len;
964         }
965
966         ptr_c = c->num;
967         carry = false;
968
969         // This is true if the numbers have a different number of limbs after the
970         // decimal point.
971         if (diff) {
972
973                 // If the rdx values of the operands do not match, the result will
974                 // have low end elements that are the positive or negative trailing
975                 // elements of the operand with higher rdx value.
976                 if ((ardx > brdx) != do_rev_sub) {
977
978                         // !do_rev_sub && ardx > brdx || do_rev_sub && brdx > ardx
979                         // The left operand has BcDig values that need to be copied,
980                         // either from a or from b (in case of a reversed subtraction).
981                         memcpy(ptr_c, ptr_l, BC_NUM_SIZE(diff));
982                         ptr_l += diff;
983                         len_l -= diff;
984                 }
985                 else {
986
987                         // The right operand has BcDig values that need to be copied
988                         // or subtracted from zero (in case of a subtraction).
989                         if (do_sub) {
990
991                                 // do_sub (do_rev_sub && ardx > brdx ||
992                                 // !do_rev_sub && brdx > ardx)
993                                 for (i = 0; i < diff; i++)
994                                         ptr_c[i] = bc_num_subDigits(0, ptr_r[i], &carry);
995                         }
996                         else {
997
998                                 // !do_sub && brdx > ardx
999                                 memcpy(ptr_c, ptr_r, BC_NUM_SIZE(diff));
1000                         }
1001
1002                         // Future code needs to ignore the limbs we just did.
1003                         ptr_r += diff;
1004                         len_r -= diff;
1005                 }
1006
1007                 // The return value pointer needs to ignore what we just did.
1008                 ptr_c += diff;
1009         }
1010
1011         // This is the length that can be directly added/subtracted.
1012         min_len = BC_MIN(len_l, len_r);
1013
1014         // After dealing with possible low array elements that depend on only one
1015         // operand above, the actual add or subtract can be performed as if the rdx
1016         // of both operands was the same.
1017         //
1018         // Inlining takes care of eliminating constant zero arguments to
1019         // addDigit/subDigit (checked in disassembly of resulting bc binary
1020         // compiled with gcc and clang).
1021         if (do_sub) {
1022
1023                 // Actual subtraction.
1024                 for (i = 0; i < min_len; ++i)
1025                         ptr_c[i] = bc_num_subDigits(ptr_l[i], ptr_r[i], &carry);
1026
1027                 // Finishing the limbs beyond the direct subtraction.
1028                 for (; i < len_l; ++i) ptr_c[i] = bc_num_subDigits(ptr_l[i], 0, &carry);
1029         }
1030         else {
1031
1032                 // Actual addition.
1033                 for (i = 0; i < min_len; ++i)
1034                         ptr_c[i] = bc_num_addDigits(ptr_l[i], ptr_r[i], &carry);
1035
1036                 // Finishing the limbs beyond the direct addition.
1037                 for (; i < len_l; ++i) ptr_c[i] = bc_num_addDigits(ptr_l[i], 0, &carry);
1038
1039                 // Addition can create an extra limb. We take care of that here.
1040                 ptr_c[i] = bc_num_addDigits(0, 0, &carry);
1041         }
1042
1043         assert(carry == false);
1044
1045         // The result has the same sign as a, unless the operation was a
1046         // reverse subtraction (b - a).
1047         c_neg = BC_NUM_NEG(a) != (do_sub && do_rev_sub);
1048         BC_NUM_RDX_SET_NEG(c, max_rdx, c_neg);
1049         c->len = max_len;
1050         c->scale = BC_MAX(a->scale, b->scale);
1051
1052         bc_num_clean(c);
1053 }
1054
1055 /**
1056  * The simple multiplication that karatsuba dishes out to when the length of the
1057  * numbers gets low enough. This doesn't use scale because it treats the
1058  * operands as though they are integers.
1059  * @param a  The first operand.
1060  * @param b  The second operand.
1061  * @param c  The return parameter.
1062  */
1063 static void bc_num_m_simp(const BcNum *a, const BcNum *b, BcNum *restrict c) {
1064
1065         size_t i, alen = a->len, blen = b->len, clen;
1066         BcDig *ptr_a = a->num, *ptr_b = b->num, *ptr_c;
1067         BcBigDig sum = 0, carry = 0;
1068
1069         assert(sizeof(sum) >= sizeof(BcDig) * 2);
1070         assert(!BC_NUM_RDX_VAL(a) && !BC_NUM_RDX_VAL(b));
1071
1072         // Make sure c is big enough.
1073         clen = bc_vm_growSize(alen, blen);
1074         bc_num_expand(c, bc_vm_growSize(clen, 1));
1075
1076         // If we don't memset, then we might have uninitialized data use later.
1077         ptr_c = c->num;
1078         memset(ptr_c, 0, BC_NUM_SIZE(c->cap));
1079
1080         // This is the actual multiplication loop. It uses the lattice form of long
1081         // multiplication (see the explanation on the web page at
1082         // https://knilt.arcc.albany.edu/What_is_Lattice_Multiplication or the
1083         // explanation at Wikipedia).
1084         for (i = 0; i < clen; ++i) {
1085
1086                 ssize_t sidx = (ssize_t) (i - blen + 1);
1087                 size_t j, k;
1088
1089                 // These are the start indices.
1090                 j = (size_t) BC_MAX(0, sidx);
1091                 k = BC_MIN(i, blen - 1);
1092
1093                 // On every iteration of this loop, a multiplication happens, then the
1094                 // sum is automatically calculated.
1095                 for (; j < alen && k < blen; ++j, --k) {
1096
1097                         sum += ((BcBigDig) ptr_a[j]) * ((BcBigDig) ptr_b[k]);
1098
1099                         if (sum >= ((BcBigDig) BC_BASE_POW) * BC_BASE_POW) {
1100                                 carry += sum / BC_BASE_POW;
1101                                 sum %= BC_BASE_POW;
1102                         }
1103                 }
1104
1105                 // Calculate the carry.
1106                 if (sum >= BC_BASE_POW) {
1107                         carry += sum / BC_BASE_POW;
1108                         sum %= BC_BASE_POW;
1109                 }
1110
1111                 // Store and set up for next iteration.
1112                 ptr_c[i] = (BcDig) sum;
1113                 assert(ptr_c[i] < BC_BASE_POW);
1114                 sum = carry;
1115                 carry = 0;
1116         }
1117
1118         // This should always be true because there should be no carry on the last
1119         // digit; multiplication never goes above the sum of both lengths.
1120         assert(!sum);
1121
1122         c->len = clen;
1123 }
1124
1125 /**
1126  * Does a shifted add or subtract for Karatsuba below. This calls either
1127  * bc_num_addArrays() or bc_num_subArrays().
1128  * @param n      An in/out parameter; the first operand and return parameter.
1129  * @param a      The second operand.
1130  * @param shift  The amount to shift @a n by when adding/subtracting.
1131  * @param op     The function to call, either bc_num_addArrays() or
1132  *               bc_num_subArrays().
1133  */
1134 static void bc_num_shiftAddSub(BcNum *restrict n, const BcNum *restrict a,
1135                                size_t shift, BcNumShiftAddOp op)
1136 {
1137         assert(n->len >= shift + a->len);
1138         assert(!BC_NUM_RDX_VAL(n) && !BC_NUM_RDX_VAL(a));
1139         op(n->num + shift, a->num, a->len);
1140 }
1141
1142 /**
1143  * Implements the Karatsuba algorithm.
1144  */
1145 static void bc_num_k(const BcNum *a, const BcNum *b, BcNum *restrict c) {
1146
1147         size_t max, max2, total;
1148         BcNum l1, h1, l2, h2, m2, m1, z0, z1, z2, temp;
1149         BcDig *digs, *dig_ptr;
1150         BcNumShiftAddOp op;
1151         bool aone = BC_NUM_ONE(a);
1152
1153         assert(BC_NUM_ZERO(c));
1154
1155         if (BC_NUM_ZERO(a) || BC_NUM_ZERO(b)) return;
1156
1157         if (aone || BC_NUM_ONE(b)) {
1158                 bc_num_copy(c, aone ? b : a);
1159                 if ((aone && BC_NUM_NEG(a)) || BC_NUM_NEG(b)) BC_NUM_NEG_TGL(c);
1160                 return;
1161         }
1162
1163         // Shell out to the simple algorithm with certain conditions.
1164         if (a->len < BC_NUM_KARATSUBA_LEN || b->len < BC_NUM_KARATSUBA_LEN) {
1165                 bc_num_m_simp(a, b, c);
1166                 return;
1167         }
1168
1169         // We need to calculate the max size of the numbers that can result from the
1170         // operations.
1171         max = BC_MAX(a->len, b->len);
1172         max = BC_MAX(max, BC_NUM_DEF_SIZE);
1173         max2 = (max + 1) / 2;
1174
1175         // Calculate the space needed for all of the temporary allocations. We do
1176         // this to just allocate once.
1177         total = bc_vm_arraySize(BC_NUM_KARATSUBA_ALLOCS, max);
1178
1179         BC_SIG_LOCK;
1180
1181         // Allocate space for all of the temporaries.
1182         digs = dig_ptr = bc_vm_malloc(BC_NUM_SIZE(total));
1183
1184         // Set up the temporaries.
1185         bc_num_setup(&l1, dig_ptr, max);
1186         dig_ptr += max;
1187         bc_num_setup(&h1, dig_ptr, max);
1188         dig_ptr += max;
1189         bc_num_setup(&l2, dig_ptr, max);
1190         dig_ptr += max;
1191         bc_num_setup(&h2, dig_ptr, max);
1192         dig_ptr += max;
1193         bc_num_setup(&m1, dig_ptr, max);
1194         dig_ptr += max;
1195         bc_num_setup(&m2, dig_ptr, max);
1196
1197         // Some temporaries need the ability to grow, so we allocate them
1198         // separately.
1199         max = bc_vm_growSize(max, 1);
1200         bc_num_init(&z0, max);
1201         bc_num_init(&z1, max);
1202         bc_num_init(&z2, max);
1203         max = bc_vm_growSize(max, max) + 1;
1204         bc_num_init(&temp, max);
1205
1206         BC_SETJMP_LOCKED(err);
1207
1208         BC_SIG_UNLOCK;
1209
1210         // First, set up c.
1211         bc_num_expand(c, max);
1212         c->len = max;
1213         memset(c->num, 0, BC_NUM_SIZE(c->len));
1214
1215         // Split the parameters.
1216         bc_num_split(a, max2, &l1, &h1);
1217         bc_num_split(b, max2, &l2, &h2);
1218
1219         // Do the subtraction.
1220         bc_num_sub(&h1, &l1, &m1, 0);
1221         bc_num_sub(&l2, &h2, &m2, 0);
1222
1223         // The if statements below are there for efficiency reasons. The best way to
1224         // understand them is to understand the Karatsuba algorithm because now that
1225         // the ollocations and splits are done, the algorithm is pretty
1226         // straightforward.
1227
1228         if (BC_NUM_NONZERO(&h1) && BC_NUM_NONZERO(&h2)) {
1229
1230                 assert(BC_NUM_RDX_VALID_NP(h1));
1231                 assert(BC_NUM_RDX_VALID_NP(h2));
1232
1233                 bc_num_m(&h1, &h2, &z2, 0);
1234                 bc_num_clean(&z2);
1235
1236                 bc_num_shiftAddSub(c, &z2, max2 * 2, bc_num_addArrays);
1237                 bc_num_shiftAddSub(c, &z2, max2, bc_num_addArrays);
1238         }
1239
1240         if (BC_NUM_NONZERO(&l1) && BC_NUM_NONZERO(&l2)) {
1241
1242                 assert(BC_NUM_RDX_VALID_NP(l1));
1243                 assert(BC_NUM_RDX_VALID_NP(l2));
1244
1245                 bc_num_m(&l1, &l2, &z0, 0);
1246                 bc_num_clean(&z0);
1247
1248                 bc_num_shiftAddSub(c, &z0, max2, bc_num_addArrays);
1249                 bc_num_shiftAddSub(c, &z0, 0, bc_num_addArrays);
1250         }
1251
1252         if (BC_NUM_NONZERO(&m1) && BC_NUM_NONZERO(&m2)) {
1253
1254                 assert(BC_NUM_RDX_VALID_NP(m1));
1255                 assert(BC_NUM_RDX_VALID_NP(m1));
1256
1257                 bc_num_m(&m1, &m2, &z1, 0);
1258                 bc_num_clean(&z1);
1259
1260                 op = (BC_NUM_NEG_NP(m1) != BC_NUM_NEG_NP(m2)) ?
1261                      bc_num_subArrays : bc_num_addArrays;
1262                 bc_num_shiftAddSub(c, &z1, max2, op);
1263         }
1264
1265 err:
1266         BC_SIG_MAYLOCK;
1267         free(digs);
1268         bc_num_free(&temp);
1269         bc_num_free(&z2);
1270         bc_num_free(&z1);
1271         bc_num_free(&z0);
1272         BC_LONGJMP_CONT;
1273 }
1274
1275 /**
1276  * Does checks for Karatsuba. It also changes things to ensure that the
1277  * Karatsuba and simple multiplication can treat the numbers as integers. This
1278  * is a BcNumBinOp function.
1279  * @param a      The first operand.
1280  * @param b      The second operand.
1281  * @param c      The return parameter.
1282  * @param scale  The current scale.
1283  */
1284 static void bc_num_m(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1285
1286         BcNum cpa, cpb;
1287         size_t ascale, bscale, ardx, brdx, azero = 0, bzero = 0, zero, len, rscale;
1288
1289         assert(BC_NUM_RDX_VALID(a));
1290         assert(BC_NUM_RDX_VALID(b));
1291
1292         bc_num_zero(c);
1293
1294         ascale = a->scale;
1295         bscale = b->scale;
1296
1297         // This sets the final scale according to the bc spec.
1298         scale = BC_MAX(scale, ascale);
1299         scale = BC_MAX(scale, bscale);
1300         rscale = ascale + bscale;
1301         scale = BC_MIN(rscale, scale);
1302
1303         // If this condition is true, we can use bc_num_mulArray(), which would be
1304         // much faster.
1305         if ((a->len == 1 || b->len == 1) && !a->rdx && !b->rdx) {
1306
1307                 BcNum *operand;
1308                 BcBigDig dig;
1309
1310                 // Set the correct operands.
1311                 if (a->len == 1) {
1312                         dig = (BcBigDig) a->num[0];
1313                         operand = b;
1314                 }
1315                 else {
1316                         dig = (BcBigDig) b->num[0];
1317                         operand = a;
1318                 }
1319
1320                 bc_num_mulArray(operand, dig, c);
1321
1322                 // Need to make sure the sign is correct.
1323                 if (BC_NUM_NONZERO(c))
1324                         c->rdx = BC_NUM_NEG_VAL(c, BC_NUM_NEG(a) != BC_NUM_NEG(b));
1325
1326                 return;
1327         }
1328
1329         assert(BC_NUM_RDX_VALID(a));
1330         assert(BC_NUM_RDX_VALID(b));
1331
1332         BC_SIG_LOCK;
1333
1334         // We need copies because of all of the mutation needed to make Karatsuba
1335         // think the numbers are integers.
1336         bc_num_init(&cpa, a->len + BC_NUM_RDX_VAL(a));
1337         bc_num_init(&cpb, b->len + BC_NUM_RDX_VAL(b));
1338
1339         BC_SETJMP_LOCKED(err);
1340
1341         BC_SIG_UNLOCK;
1342
1343         bc_num_copy(&cpa, a);
1344         bc_num_copy(&cpb, b);
1345
1346         assert(BC_NUM_RDX_VALID_NP(cpa));
1347         assert(BC_NUM_RDX_VALID_NP(cpb));
1348
1349         BC_NUM_NEG_CLR_NP(cpa);
1350         BC_NUM_NEG_CLR_NP(cpb);
1351
1352         assert(BC_NUM_RDX_VALID_NP(cpa));
1353         assert(BC_NUM_RDX_VALID_NP(cpb));
1354
1355         // These are what makes them appear like integers.
1356         ardx = BC_NUM_RDX_VAL_NP(cpa) * BC_BASE_DIGS;
1357         bc_num_shiftLeft(&cpa, ardx);
1358
1359         brdx = BC_NUM_RDX_VAL_NP(cpb) * BC_BASE_DIGS;
1360         bc_num_shiftLeft(&cpb, brdx);
1361
1362         // We need to reset the jump here because azero and bzero are used in the
1363         // cleanup, and local variables are not guaranteed to be the same after a
1364         // jump.
1365         BC_SIG_LOCK;
1366
1367         BC_UNSETJMP;
1368
1369         // We want to ignore zero limbs.
1370         azero = bc_num_shiftZero(&cpa);
1371         bzero = bc_num_shiftZero(&cpb);
1372
1373         BC_SETJMP_LOCKED(err);
1374
1375         BC_SIG_UNLOCK;
1376
1377         bc_num_clean(&cpa);
1378         bc_num_clean(&cpb);
1379
1380         bc_num_k(&cpa, &cpb, c);
1381
1382         // The return parameter needs to have its scale set. This is the start. It
1383         // also needs to be shifted by the same amount as a and b have limbs after
1384         // the decimal point.
1385         zero = bc_vm_growSize(azero, bzero);
1386         len = bc_vm_growSize(c->len, zero);
1387
1388         bc_num_expand(c, len);
1389
1390         // Shift c based on the limbs after the decimal point in a and b.
1391         bc_num_shiftLeft(c, (len - c->len) * BC_BASE_DIGS);
1392         bc_num_shiftRight(c, ardx + brdx);
1393
1394         bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b));
1395
1396 err:
1397         BC_SIG_MAYLOCK;
1398         bc_num_unshiftZero(&cpb, bzero);
1399         bc_num_free(&cpb);
1400         bc_num_unshiftZero(&cpa, azero);
1401         bc_num_free(&cpa);
1402         BC_LONGJMP_CONT;
1403 }
1404
1405 /**
1406  * Returns true if the BcDig array has non-zero limbs, false otherwise.
1407  * @param a    The array to test.
1408  * @param len  The length of the array.
1409  * @return     True if @a has any non-zero limbs, false otherwise.
1410  */
1411 static bool bc_num_nonZeroDig(BcDig *restrict a, size_t len) {
1412         size_t i;
1413         bool nonzero = false;
1414         for (i = len - 1; !nonzero && i < len; --i) nonzero = (a[i] != 0);
1415         return nonzero;
1416 }
1417
1418 /**
1419  * Compares a BcDig array against a BcNum. This is especially suited for
1420  * division. Returns >0 if @a a is greater than @a b, <0 if it is less, and =0
1421  * if they are equal.
1422  * @param a    The array.
1423  * @param b    The number.
1424  * @param len  The length to assume the arrays are. This is always less than the
1425  *             actual length because of how this is implemented.
1426  */
1427 static ssize_t bc_num_divCmp(const BcDig *a, const BcNum *b, size_t len) {
1428
1429         ssize_t cmp;
1430
1431         if (b->len > len && a[len]) cmp = bc_num_compare(a, b->num, len + 1);
1432         else if (b->len <= len) {
1433                 if (a[len]) cmp = 1;
1434                 else cmp = bc_num_compare(a, b->num, len);
1435         }
1436         else cmp = -1;
1437
1438         return cmp;
1439 }
1440
1441 /**
1442  * Extends the two operands of a division by BC_BASE_DIGS minus the number of
1443  * digits in the divisor estimate. In other words, it is shifting the numbers in
1444  * order to force the divisor estimate to fill the limb.
1445  * @param a        The first operand.
1446  * @param b        The second operand.
1447  * @param divisor  The divisor estimate.
1448  */
1449 static void bc_num_divExtend(BcNum *restrict a, BcNum *restrict b,
1450                              BcBigDig divisor)
1451 {
1452         size_t pow;
1453
1454         assert(divisor < BC_BASE_POW);
1455
1456         pow = BC_BASE_DIGS - bc_num_log10((size_t) divisor);
1457
1458         bc_num_shiftLeft(a, pow);
1459         bc_num_shiftLeft(b, pow);
1460 }
1461
1462 /**
1463  * Actually does division. This is a rewrite of my original code by Stefan Esser
1464  * from FreeBSD.
1465  * @param a      The first operand.
1466  * @param b      The second operand.
1467  * @param c      The return parameter.
1468  * @param scale  The current scale.
1469  */
1470 static void bc_num_d_long(BcNum *restrict a, BcNum *restrict b,
1471                           BcNum *restrict c, size_t scale)
1472 {
1473         BcBigDig divisor;
1474         size_t len, end, i, rdx;
1475         BcNum cpb;
1476         bool nonzero = false;
1477
1478         assert(b->len < a->len);
1479
1480         len = b->len;
1481         end = a->len - len;
1482
1483         assert(len >= 1);
1484
1485         // This is a final time to make sure c is big enough and that its array is
1486         // properly zeroed.
1487         bc_num_expand(c, a->len);
1488         memset(c->num, 0, c->cap * sizeof(BcDig));
1489
1490         // Setup.
1491         BC_NUM_RDX_SET(c, BC_NUM_RDX_VAL(a));
1492         c->scale = a->scale;
1493         c->len = a->len;
1494
1495         // This is pulling the most significant limb of b in order to establish a
1496         // good "estimate" for the actual divisor.
1497         divisor = (BcBigDig) b->num[len - 1];
1498
1499         // The entire bit of code in this if statement is to tighten the estimate of
1500         // the divisor. The condition asks if b has any other non-zero limbs.
1501         if (len > 1 && bc_num_nonZeroDig(b->num, len - 1)) {
1502
1503                 // This takes a little bit of understanding. The "10*BC_BASE_DIGS/6+1"
1504                 // results in either 16 for 64-bit 9-digit limbs or 7 for 32-bit 4-digit
1505                 // limbs. Then it shifts a 1 by that many, which in both cases, puts the
1506                 // result above *half* of the max value a limb can store. Basically,
1507                 // this quickly calculates if the divisor is greater than half the max
1508                 // of a limb.
1509                 nonzero = (divisor > 1 << ((10 * BC_BASE_DIGS) / 6 + 1));
1510
1511                 // If the divisor is *not* greater than half the limb...
1512                 if (!nonzero) {
1513
1514                         // Extend the parameters by the number of missing digits in the
1515                         // divisor.
1516                         bc_num_divExtend(a, b, divisor);
1517
1518                         // Check bc_num_d(). In there, we grow a again and again. We do it
1519                         // again here; we *always* want to be sure it is big enough.
1520                         len = BC_MAX(a->len, b->len);
1521                         bc_num_expand(a, len + 1);
1522
1523                         // Make a have a zero most significant limb to match the len.
1524                         if (len + 1 > a->len) a->len = len + 1;
1525
1526                         // Grab the new divisor estimate, new because the shift has made it
1527                         // different.
1528                         len = b->len;
1529                         end = a->len - len;
1530                         divisor = (BcBigDig) b->num[len - 1];
1531
1532                         nonzero = bc_num_nonZeroDig(b->num, len - 1);
1533                 }
1534         }
1535
1536         // If b has other nonzero limbs, we want the divisor to be one higher, so
1537         // that it is an upper bound.
1538         divisor += nonzero;
1539
1540         // Make sure c can fit the new length.
1541         bc_num_expand(c, a->len);
1542         memset(c->num, 0, BC_NUM_SIZE(c->cap));
1543
1544         assert(c->scale >= scale);
1545         rdx = BC_NUM_RDX_VAL(c) - BC_NUM_RDX(scale);
1546
1547         BC_SIG_LOCK;
1548
1549         bc_num_init(&cpb, len + 1);
1550
1551         BC_SETJMP_LOCKED(err);
1552
1553         BC_SIG_UNLOCK;
1554
1555         // This is the actual division loop.
1556         for (i = end - 1; i < end && i >= rdx && BC_NUM_NONZERO(a); --i) {
1557
1558                 ssize_t cmp;
1559                 BcDig *n;
1560                 BcBigDig result;
1561
1562                 n = a->num + i;
1563                 assert(n >= a->num);
1564                 result = 0;
1565
1566                 cmp = bc_num_divCmp(n, b, len);
1567
1568                 // This is true if n is greater than b, which means that division can
1569                 // proceed, so this inner loop is the part that implements one instance
1570                 // of the division.
1571                 while (cmp >= 0) {
1572
1573                         BcBigDig n1, dividend, quotient;
1574
1575                         // These should be named obviously enough. Just imagine that it's a
1576                         // division of one limb. Because that's what it is.
1577                         n1 = (BcBigDig) n[len];
1578                         dividend = n1 * BC_BASE_POW + (BcBigDig) n[len - 1];
1579                         quotient = (dividend / divisor);
1580
1581                         // If this is true, then we can just subtract. Remember: setting
1582                         // quotient to 1 is not bad because we already know that n is
1583                         // greater than b.
1584                         if (quotient <= 1) {
1585                                 quotient = 1;
1586                                 bc_num_subArrays(n, b->num, len);
1587                         }
1588                         else {
1589
1590                                 assert(quotient <= BC_BASE_POW);
1591
1592                                 // We need to multiply and subtract for a quotient above 1.
1593                                 bc_num_mulArray(b, (BcBigDig) quotient, &cpb);
1594                                 bc_num_subArrays(n, cpb.num, cpb.len);
1595                         }
1596
1597                         // The result is the *real* quotient, by the way, but it might take
1598                         // multiple trips around this loop to get it.
1599                         result += quotient;
1600                         assert(result <= BC_BASE_POW);
1601
1602                         // And here's why it might take multiple trips: n might *still* be
1603                         // greater than b. So we have to loop again. That's what this is
1604                         // setting up for: the condition of the while loop.
1605                         if (nonzero) cmp = bc_num_divCmp(n, b, len);
1606                         else cmp = -1;
1607                 }
1608
1609                 assert(result < BC_BASE_POW);
1610
1611                 // Store the actual limb quotient.
1612                 c->num[i] = (BcDig) result;
1613         }
1614
1615 err:
1616         BC_SIG_MAYLOCK;
1617         bc_num_free(&cpb);
1618         BC_LONGJMP_CONT;
1619 }
1620
1621 /**
1622  * Implements division. This is a BcNumBinOp function.
1623  * @param a      The first operand.
1624  * @param b      The second operand.
1625  * @param c      The return parameter.
1626  * @param scale  The current scale.
1627  */
1628 static void bc_num_d(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1629
1630         size_t len, cpardx;
1631         BcNum cpa, cpb;
1632
1633         if (BC_NUM_ZERO(b)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO);
1634
1635         if (BC_NUM_ZERO(a)) {
1636                 bc_num_setToZero(c, scale);
1637                 return;
1638         }
1639
1640         if (BC_NUM_ONE(b)) {
1641                 bc_num_copy(c, a);
1642                 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b));
1643                 return;
1644         }
1645
1646         // If this is true, we can use bc_num_divArray(), which would be faster.
1647         if (!BC_NUM_RDX_VAL(a) && !BC_NUM_RDX_VAL(b) && b->len == 1 && !scale) {
1648                 BcBigDig rem;
1649                 bc_num_divArray(a, (BcBigDig) b->num[0], c, &rem);
1650                 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b));
1651                 return;
1652         }
1653
1654         len = bc_num_divReq(a, b, scale);
1655
1656         BC_SIG_LOCK;
1657
1658         // Initialize copies of the parameters. We want the length of the first
1659         // operand copy to be as big as the result because of the way the division
1660         // is implemented.
1661         bc_num_init(&cpa, len);
1662         bc_num_copy(&cpa, a);
1663         bc_num_createCopy(&cpb, b);
1664
1665         BC_SETJMP_LOCKED(err);
1666
1667         BC_SIG_UNLOCK;
1668
1669         len = b->len;
1670
1671         // Like the above comment, we want the copy of the first parameter to be
1672         // larger than the second parameter.
1673         if (len > cpa.len) {
1674                 bc_num_expand(&cpa, bc_vm_growSize(len, 2));
1675                 bc_num_extend(&cpa, (len - cpa.len) * BC_BASE_DIGS);
1676         }
1677
1678         cpardx = BC_NUM_RDX_VAL_NP(cpa);
1679         cpa.scale = cpardx * BC_BASE_DIGS;
1680
1681         // This is just setting up the scale in preparation for the division.
1682         bc_num_extend(&cpa, b->scale);
1683         cpardx = BC_NUM_RDX_VAL_NP(cpa) - BC_NUM_RDX(b->scale);
1684         BC_NUM_RDX_SET_NP(cpa, cpardx);
1685         cpa.scale = cpardx * BC_BASE_DIGS;
1686
1687         // Once again, just setting things up, this time to match scale.
1688         if (scale > cpa.scale) {
1689                 bc_num_extend(&cpa, scale);
1690                 cpardx = BC_NUM_RDX_VAL_NP(cpa);
1691                 cpa.scale = cpardx * BC_BASE_DIGS;
1692         }
1693
1694         // Grow if necessary.
1695         if (cpa.cap == cpa.len) bc_num_expand(&cpa, bc_vm_growSize(cpa.len, 1));
1696
1697         // We want an extra zero in front to make things simpler.
1698         cpa.num[cpa.len++] = 0;
1699
1700         // Still setting things up. Why all of these things are needed is not
1701         // something that can be easily explained, but it has to do with making the
1702         // actual algorithm easier to understand because it can assume a lot of
1703         // things. Thus, you should view all of this setup code as establishing
1704         // assumptions for bc_num_d_long(), where the actual division happens.
1705         if (cpardx == cpa.len) cpa.len = bc_num_nonZeroLen(&cpa);
1706         if (BC_NUM_RDX_VAL_NP(cpb) == cpb.len) cpb.len = bc_num_nonZeroLen(&cpb);
1707         cpb.scale = 0;
1708         BC_NUM_RDX_SET_NP(cpb, 0);
1709
1710         bc_num_d_long(&cpa, &cpb, c, scale);
1711
1712         bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b));
1713
1714 err:
1715         BC_SIG_MAYLOCK;
1716         bc_num_free(&cpb);
1717         bc_num_free(&cpa);
1718         BC_LONGJMP_CONT;
1719 }
1720
1721 /**
1722  * Implements divmod. This is the actual modulus function; since modulus
1723  * requires a division anyway, this returns the quotient and modulus. Either can
1724  * be thrown out as desired.
1725  * @param a      The first operand.
1726  * @param b      The second operand.
1727  * @param c      The return parameter for the quotient.
1728  * @param d      The return parameter for the modulus.
1729  * @param scale  The current scale.
1730  * @param ts     The scale that the operation should be done to. Yes, it's not
1731  *               necessarily the same as scale, per the bc spec.
1732  */
1733 static void bc_num_r(BcNum *a, BcNum *b, BcNum *restrict c,
1734                      BcNum *restrict d, size_t scale, size_t ts)
1735 {
1736         BcNum temp;
1737         bool neg;
1738
1739         if (BC_NUM_ZERO(b)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO);
1740
1741         if (BC_NUM_ZERO(a)) {
1742                 bc_num_setToZero(c, ts);
1743                 bc_num_setToZero(d, ts);
1744                 return;
1745         }
1746
1747         BC_SIG_LOCK;
1748
1749         bc_num_init(&temp, d->cap);
1750
1751         BC_SETJMP_LOCKED(err);
1752
1753         BC_SIG_UNLOCK;
1754
1755         // Division.
1756         bc_num_d(a, b, c, scale);
1757
1758         // We want an extra digit so we can safely truncate.
1759         if (scale) scale = ts + 1;
1760
1761         assert(BC_NUM_RDX_VALID(c));
1762         assert(BC_NUM_RDX_VALID(b));
1763
1764         // Implement the rest of the (a - (a / b) * b) formula.
1765         bc_num_m(c, b, &temp, scale);
1766         bc_num_sub(a, &temp, d, scale);
1767
1768         // Extend if necessary.
1769         if (ts > d->scale && BC_NUM_NONZERO(d)) bc_num_extend(d, ts - d->scale);
1770
1771         neg = BC_NUM_NEG(d);
1772         bc_num_retireMul(d, ts, BC_NUM_NEG(a), BC_NUM_NEG(b));
1773         d->rdx = BC_NUM_NEG_VAL(d, BC_NUM_NONZERO(d) ? neg : false);
1774
1775 err:
1776         BC_SIG_MAYLOCK;
1777         bc_num_free(&temp);
1778         BC_LONGJMP_CONT;
1779 }
1780
1781 /**
1782  * Implements modulus/remainder. (Yes, I know they are different, but not in the
1783  * context of bc.) This is a BcNumBinOp function.
1784  * @param a      The first operand.
1785  * @param b      The second operand.
1786  * @param c      The return parameter.
1787  * @param scale  The current scale.
1788  */
1789 static void bc_num_rem(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1790
1791         BcNum c1;
1792         size_t ts;
1793
1794         ts = bc_vm_growSize(scale, b->scale);
1795         ts = BC_MAX(ts, a->scale);
1796
1797         BC_SIG_LOCK;
1798
1799         // Need a temp for the quotient.
1800         bc_num_init(&c1, bc_num_mulReq(a, b, ts));
1801
1802         BC_SETJMP_LOCKED(err);
1803
1804         BC_SIG_UNLOCK;
1805
1806         bc_num_r(a, b, &c1, c, scale, ts);
1807
1808 err:
1809         BC_SIG_MAYLOCK;
1810         bc_num_free(&c1);
1811         BC_LONGJMP_CONT;
1812 }
1813
1814 /**
1815  * Implements power (exponentiation). This is a BcNumBinOp function.
1816  * @param a      The first operand.
1817  * @param b      The second operand.
1818  * @param c      The return parameter.
1819  * @param scale  The current scale.
1820  */
1821 static void bc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1822
1823         BcNum copy, btemp;
1824         BcBigDig exp;
1825         size_t powrdx, resrdx;
1826         bool neg;
1827
1828         if (BC_ERR(bc_num_nonInt(b, &btemp))) bc_err(BC_ERR_MATH_NON_INTEGER);
1829
1830         if (BC_NUM_ZERO(&btemp)) {
1831                 bc_num_one(c);
1832                 return;
1833         }
1834
1835         if (BC_NUM_ZERO(a)) {
1836                 if (BC_NUM_NEG_NP(btemp)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO);
1837                 bc_num_setToZero(c, scale);
1838                 return;
1839         }
1840
1841         if (BC_NUM_ONE(&btemp)) {
1842                 if (!BC_NUM_NEG_NP(btemp)) bc_num_copy(c, a);
1843                 else bc_num_inv(a, c, scale);
1844                 return;
1845         }
1846
1847         neg = BC_NUM_NEG_NP(btemp);
1848         BC_NUM_NEG_CLR_NP(btemp);
1849
1850         exp = bc_num_bigdig(&btemp);
1851
1852         BC_SIG_LOCK;
1853
1854         bc_num_createCopy(&copy, a);
1855
1856         BC_SETJMP_LOCKED(err);
1857
1858         BC_SIG_UNLOCK;
1859
1860         // If this is true, then we do not have to do a division, and we need to
1861         // set scale accordingly.
1862         if (!neg) {
1863                 size_t max = BC_MAX(scale, a->scale), scalepow;
1864                 scalepow = bc_num_mulOverflow(a->scale, exp);
1865                 scale = BC_MIN(scalepow, max);
1866         }
1867
1868         // This is only implementing the first exponentiation by squaring, until it
1869         // reaches the first time where the square is actually used.
1870         for (powrdx = a->scale; !(exp & 1); exp >>= 1) {
1871                 powrdx <<= 1;
1872                 assert(BC_NUM_RDX_VALID_NP(copy));
1873                 bc_num_mul(&copy, &copy, &copy, powrdx);
1874         }
1875
1876         // Make c a copy of copy for the purpose of saving the squares that should
1877         // be saved.
1878         bc_num_copy(c, &copy);
1879         resrdx = powrdx;
1880
1881         // Now finish the exponentiation by squaring, this time saving the squares
1882         // as necessary.
1883         while (exp >>= 1) {
1884
1885                 powrdx <<= 1;
1886                 assert(BC_NUM_RDX_VALID_NP(copy));
1887                 bc_num_mul(&copy, &copy, &copy, powrdx);
1888
1889                 // If this is true, we want to save that particular square. This does
1890                 // that by multiplying c with copy.
1891                 if (exp & 1) {
1892                         resrdx += powrdx;
1893                         assert(BC_NUM_RDX_VALID(c));
1894                         assert(BC_NUM_RDX_VALID_NP(copy));
1895                         bc_num_mul(c, &copy, c, resrdx);
1896                 }
1897         }
1898
1899         // Invert if necessary.
1900         if (neg) bc_num_inv(c, c, scale);
1901
1902         // Truncate if necessary.
1903         if (c->scale > scale) bc_num_truncate(c, c->scale - scale);
1904
1905         bc_num_clean(c);
1906
1907 err:
1908         BC_SIG_MAYLOCK;
1909         bc_num_free(&copy);
1910         BC_LONGJMP_CONT;
1911 }
1912
1913 #if BC_ENABLE_EXTRA_MATH
1914 /**
1915  * Implements the places operator. This is a BcNumBinOp function.
1916  * @param a      The first operand.
1917  * @param b      The second operand.
1918  * @param c      The return parameter.
1919  * @param scale  The current scale.
1920  */
1921 static void bc_num_place(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1922
1923         BcBigDig val;
1924
1925         BC_UNUSED(scale);
1926
1927         val = bc_num_intop(a, b, c);
1928
1929         // Just truncate or extend as appropriate.
1930         if (val < c->scale) bc_num_truncate(c, c->scale - val);
1931         else if (val > c->scale) bc_num_extend(c, val - c->scale);
1932 }
1933
1934 /**
1935  * Implements the left shift operator. This is a BcNumBinOp function.
1936  */
1937 static void bc_num_left(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1938
1939         BcBigDig val;
1940
1941         BC_UNUSED(scale);
1942
1943         val = bc_num_intop(a, b, c);
1944
1945         bc_num_shiftLeft(c, (size_t) val);
1946 }
1947
1948 /**
1949  * Implements the right shift operator. This is a BcNumBinOp function.
1950  */
1951 static void bc_num_right(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) {
1952
1953         BcBigDig val;
1954
1955         BC_UNUSED(scale);
1956
1957         val = bc_num_intop(a, b, c);
1958
1959         if (BC_NUM_ZERO(c)) return;
1960
1961         bc_num_shiftRight(c, (size_t) val);
1962 }
1963 #endif // BC_ENABLE_EXTRA_MATH
1964
1965 /**
1966  * Prepares for, and calls, a binary operator function. This is probably the
1967  * most important function in the entire file because it establishes assumptions
1968  * that make the rest of the code so easy. Those assumptions include:
1969  *
1970  * - a is not the same pointer as c.
1971  * - b is not the same pointer as c.
1972  * - there is enough room in c for the result.
1973  *
1974  * Without these, this whole function would basically have to be duplicated for
1975  * *all* binary operators.
1976  *
1977  * @param a      The first operand.
1978  * @param b      The second operand.
1979  * @param c      The return parameter.
1980  * @param scale  The current scale.
1981  * @param req    The number of limbs needed to fit the result.
1982  */
1983 static void bc_num_binary(BcNum *a, BcNum *b, BcNum *c, size_t scale,
1984                           BcNumBinOp op, size_t req)
1985 {
1986         BcNum *ptr_a, *ptr_b, num2;
1987         bool init = false;
1988
1989         assert(a != NULL && b != NULL && c != NULL && op != NULL);
1990
1991         assert(BC_NUM_RDX_VALID(a));
1992         assert(BC_NUM_RDX_VALID(b));
1993
1994         BC_SIG_LOCK;
1995
1996         // Reallocate if c == a.
1997         if (c == a) {
1998
1999                 ptr_a = &num2;
2000
2001                 memcpy(ptr_a, c, sizeof(BcNum));
2002                 init = true;
2003         }
2004         else {
2005                 ptr_a = a;
2006         }
2007
2008         // Also reallocate if c == b.
2009         if (c == b) {
2010
2011                 ptr_b = &num2;
2012
2013                 if (c != a) {
2014                         memcpy(ptr_b, c, sizeof(BcNum));
2015                         init = true;
2016                 }
2017         }
2018         else {
2019                 ptr_b = b;
2020         }
2021
2022         // Actually reallocate. If we don't reallocate, we want to expand at the
2023         // very least.
2024         if (init) {
2025
2026                 bc_num_init(c, req);
2027
2028                 // Must prepare for cleanup. We want this here so that locals that got
2029                 // set stay set since a longjmp() is not guaranteed to preserve locals.
2030                 BC_SETJMP_LOCKED(err);
2031                 BC_SIG_UNLOCK;
2032         }
2033         else {
2034                 BC_SIG_UNLOCK;
2035                 bc_num_expand(c, req);
2036         }
2037
2038         // It is okay for a and b to be the same. If a binary operator function does
2039         // need them to be different, the binary operator function is responsible
2040         // for that.
2041
2042         // Call the actual binary operator function.
2043         op(ptr_a, ptr_b, c, scale);
2044
2045         assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c));
2046         assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len);
2047         assert(BC_NUM_RDX_VALID(c));
2048         assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len);
2049
2050 err:
2051         // Cleanup only needed if we initialized c to a new number.
2052         if (init) {
2053                 BC_SIG_MAYLOCK;
2054                 bc_num_free(&num2);
2055                 BC_LONGJMP_CONT;
2056         }
2057 }
2058
2059 #if !defined(NDEBUG) || BC_ENABLE_LIBRARY
2060
2061 /**
2062  * Tests a number string for validity. This function has a history; I originally
2063  * wrote it because I did not trust my parser. Over time, however, I came to
2064  * trust it, so I was able to relegate this function to debug builds only, and I
2065  * used it in assert()'s. But then I created the library, and well, I can't
2066  * trust users, so I reused this for yelling at users.
2067  * @param val  The string to check to see if it's a valid number string.
2068  * @return     True if the string is a valid number string, false otherwise.
2069  */
2070 bool bc_num_strValid(const char *restrict val) {
2071
2072         bool radix = false;
2073         size_t i, len = strlen(val);
2074
2075         // Notice that I don't check if there is a negative sign. That is not part
2076         // of a valid number, except in the library. The library-specific code takes
2077         // care of that part.
2078
2079         // Nothing in the string is okay.
2080         if (!len) return true;
2081
2082         // Loop through the characters.
2083         for (i = 0; i < len; ++i) {
2084
2085                 BcDig c = val[i];
2086
2087                 // If we have found a radix point...
2088                 if (c == '.') {
2089
2090                         // We don't allow two radices.
2091                         if (radix) return false;
2092
2093                         radix = true;
2094                         continue;
2095                 }
2096
2097                 // We only allow digits and uppercase letters.
2098                 if (!(isdigit(c) || isupper(c))) return false;
2099         }
2100
2101         return true;
2102 }
2103 #endif // !defined(NDEBUG) || BC_ENABLE_LIBRARY
2104
2105 /**
2106  * Parses one character and returns the digit that corresponds to that
2107  * character according to the base.
2108  * @param c     The character to parse.
2109  * @param base  The base.
2110  * @return      The character as a digit.
2111  */
2112 static BcBigDig bc_num_parseChar(char c, size_t base) {
2113
2114         assert(isupper(c) || isdigit(c));
2115
2116         // If a letter...
2117         if (isupper(c)) {
2118
2119                 // This returns the digit that directly corresponds with the letter.
2120                 c = BC_NUM_NUM_LETTER(c);
2121
2122                 // If the digit is greater than the base, we clamp.
2123                 c = ((size_t) c) >= base ? (char) base - 1 : c;
2124         }
2125         // Straight convert the digit to a number.
2126         else c -= '0';
2127
2128         return (BcBigDig) (uchar) c;
2129 }
2130
2131 /**
2132  * Parses a string as a decimal number. This is separate because it's going to
2133  * be the most used, and it can be heavily optimized for decimal only.
2134  * @param n    The number to parse into and return. Must be preallocated.
2135  * @param val  The string to parse.
2136  */
2137 static void bc_num_parseDecimal(BcNum *restrict n, const char *restrict val) {
2138
2139         size_t len, i, temp, mod;
2140         const char *ptr;
2141         bool zero = true, rdx;
2142
2143         // Eat leading zeroes.
2144         for (i = 0; val[i] == '0'; ++i);
2145
2146         val += i;
2147         assert(!val[0] || isalnum(val[0]) || val[0] == '.');
2148
2149         // All 0's. We can just return, since this procedure expects a virgin
2150         // (already 0) BcNum.
2151         if (!val[0]) return;
2152
2153         // The length of the string is the length of the number, except it might be
2154         // one bigger because of a decimal point.
2155         len = strlen(val);
2156
2157         // Find the location of the decimal point.
2158         ptr = strchr(val, '.');
2159         rdx = (ptr != NULL);
2160
2161         // We eat leading zeroes again. These leading zeroes are different because
2162         // they will come after the decimal point if they exist, and since that's
2163         // the case, they must be preserved.
2164         for (i = 0; i < len && (zero = (val[i] == '0' || val[i] == '.')); ++i);
2165
2166         // Set the scale of the number based on the location of the decimal point.
2167         // The casts to uintptr_t is to ensure that bc does not hit undefined
2168         // behavior when doing math on the values.
2169         n->scale = (size_t) (rdx * (((uintptr_t) (val + len)) -
2170                                     (((uintptr_t) ptr) + 1)));
2171
2172         // Set rdx.
2173         BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale));
2174
2175         // Calculate length. First, the length of the integer, then the number of
2176         // digits in the last limb, then the length.
2177         i = len - (ptr == val ? 0 : i) - rdx;
2178         temp = BC_NUM_ROUND_POW(i);
2179         mod = n->scale % BC_BASE_DIGS;
2180         i = mod ? BC_BASE_DIGS - mod : 0;
2181         n->len = ((temp + i) / BC_BASE_DIGS);
2182
2183         // Expand and zero.
2184         bc_num_expand(n, n->len);
2185         memset(n->num, 0, BC_NUM_SIZE(n->len));
2186
2187         if (zero) {
2188                 // I think I can set rdx directly to zero here because n should be a
2189                 // new number with sign set to false.
2190                 n->len = n->rdx = 0;
2191         }
2192         else {
2193
2194                 // There is actually stuff to parse if we make it here. Yay...
2195                 BcBigDig exp, pow;
2196
2197                 assert(i <= BC_NUM_BIGDIG_MAX);
2198
2199                 // The exponent and power.
2200                 exp = (BcBigDig) i;
2201                 pow = bc_num_pow10[exp];
2202
2203                 // Parse loop. We parse backwards because numbers are stored little
2204                 // endian.
2205                 for (i = len - 1; i < len; --i, ++exp) {
2206
2207                         char c = val[i];
2208
2209                         // Skip the decimal point.
2210                         if (c == '.') exp -= 1;
2211                         else {
2212
2213                                 // The index of the limb.
2214                                 size_t idx = exp / BC_BASE_DIGS;
2215
2216                                 // Clamp for the base.
2217                                 if (isupper(c)) c = '9';
2218
2219                                 // Add the digit to the limb.
2220                                 n->num[idx] += (((BcBigDig) c) - '0') * pow;
2221
2222                                 // Adjust the power and exponent.
2223                                 if ((exp + 1) % BC_BASE_DIGS == 0) pow = 1;
2224                                 else pow *= BC_BASE;
2225                         }
2226                 }
2227         }
2228 }
2229
2230 /**
2231  * Parse a number in any base (besides decimal).
2232  * @param n     The number to parse into and return. Must be preallocated.
2233  * @param val   The string to parse.
2234  * @param base  The base to parse as.
2235  */
2236 static void bc_num_parseBase(BcNum *restrict n, const char *restrict val,
2237                              BcBigDig base)
2238 {
2239         BcNum temp, mult1, mult2, result1, result2, *m1, *m2, *ptr;
2240         char c = 0;
2241         bool zero = true;
2242         BcBigDig v;
2243         size_t i, digs, len = strlen(val);
2244
2245         // If zero, just return because the number should be virgin (already 0).
2246         for (i = 0; zero && i < len; ++i) zero = (val[i] == '.' || val[i] == '0');
2247         if (zero) return;
2248
2249         BC_SIG_LOCK;
2250
2251         bc_num_init(&temp, BC_NUM_BIGDIG_LOG10);
2252         bc_num_init(&mult1, BC_NUM_BIGDIG_LOG10);
2253
2254         BC_SETJMP_LOCKED(int_err);
2255
2256         BC_SIG_UNLOCK;
2257
2258         // We split parsing into parsing the integer and parsing the fractional
2259         // part.
2260
2261         // Parse the integer part. This is the easy part because we just multiply
2262         // the number by the base, then add the digit.
2263         for (i = 0; i < len && (c = val[i]) && c != '.'; ++i) {
2264
2265                 // Convert the character to a digit.
2266                 v = bc_num_parseChar(c, base);
2267
2268                 // Multiply the number.
2269                 bc_num_mulArray(n, base, &mult1);
2270
2271                 // Convert the digit to a number and add.
2272                 bc_num_bigdig2num(&temp, v);
2273                 bc_num_add(&mult1, &temp, n, 0);
2274         }
2275
2276         // If this condition is true, then we are done. We still need to do cleanup
2277         // though.
2278         if (i == len && !val[i]) goto int_err;
2279
2280         // If we get here, we *must* be at the radix point.
2281         assert(val[i] == '.');
2282
2283         BC_SIG_LOCK;
2284
2285         // Unset the jump to reset in for these new initializations.
2286         BC_UNSETJMP;
2287
2288         bc_num_init(&mult2, BC_NUM_BIGDIG_LOG10);
2289         bc_num_init(&result1, BC_NUM_DEF_SIZE);
2290         bc_num_init(&result2, BC_NUM_DEF_SIZE);
2291         bc_num_one(&mult1);
2292
2293         BC_SETJMP_LOCKED(err);
2294
2295         BC_SIG_UNLOCK;
2296
2297         // Pointers for easy switching.
2298         m1 = &mult1;
2299         m2 = &mult2;
2300
2301         // Parse the fractional part. This is the hard part.
2302         for (i += 1, digs = 0; i < len && (c = val[i]); ++i, ++digs) {
2303
2304                 size_t rdx;
2305
2306                 // Convert the character to a digit.
2307                 v = bc_num_parseChar(c, base);
2308
2309                 // We keep growing result2 according to the base because the more digits
2310                 // after the radix, the more significant the digits close to the radix
2311                 // should be.
2312                 bc_num_mulArray(&result1, base, &result2);
2313
2314                 // Convert the digit to a number.
2315                 bc_num_bigdig2num(&temp, v);
2316
2317                 // Add the digit into the fraction part.
2318                 bc_num_add(&result2, &temp, &result1, 0);
2319
2320                 // Keep growing m1 and m2 for use after the loop.
2321                 bc_num_mulArray(m1, base, m2);
2322
2323                 rdx = BC_NUM_RDX_VAL(m2);
2324
2325                 if (m2->len < rdx) m2->len = rdx;
2326
2327                 // Switch.
2328                 ptr = m1;
2329                 m1 = m2;
2330                 m2 = ptr;
2331         }
2332
2333         // This one cannot be a divide by 0 because mult starts out at 1, then is
2334         // multiplied by base, and base cannot be 0, so mult cannot be 0. And this
2335         // is the reason we keep growing m1 and m2; this division is what converts
2336         // the parsed fractional part from an integer to a fractional part.
2337         bc_num_div(&result1, m1, &result2, digs * 2);
2338
2339         // Pretruncate.
2340         bc_num_truncate(&result2, digs);
2341
2342         // The final add of the integer part to the fractional part.
2343         bc_num_add(n, &result2, n, digs);
2344
2345         // Basic cleanup.
2346         if (BC_NUM_NONZERO(n)) {
2347                 if (n->scale < digs) bc_num_extend(n, digs - n->scale);
2348         }
2349         else bc_num_zero(n);
2350
2351 err:
2352         BC_SIG_MAYLOCK;
2353         bc_num_free(&result2);
2354         bc_num_free(&result1);
2355         bc_num_free(&mult2);
2356 int_err:
2357         BC_SIG_MAYLOCK;
2358         bc_num_free(&mult1);
2359         bc_num_free(&temp);
2360         BC_LONGJMP_CONT;
2361 }
2362
2363 /**
2364  * Prints a backslash+newline combo if the number of characters needs it. This
2365  * is really a convenience function.
2366  */
2367 static inline void bc_num_printNewline(void) {
2368 #if !BC_ENABLE_LIBRARY
2369         if (vm.nchars >= vm.line_len - 1 && vm.line_len) {
2370                 bc_vm_putchar('\\', bc_flush_none);
2371                 bc_vm_putchar('\n', bc_flush_err);
2372         }
2373 #endif // !BC_ENABLE_LIBRARY
2374 }
2375
2376 /**
2377  * Prints a character after a backslash+newline, if needed.
2378  * @param c       The character to print.
2379  * @param bslash  Whether to print a backslash+newline.
2380  */
2381 static void bc_num_putchar(int c, bool bslash) {
2382         if (c != '\n' && bslash) bc_num_printNewline();
2383         bc_vm_putchar(c, bc_flush_save);
2384 }
2385
2386 #if !BC_ENABLE_LIBRARY
2387
2388 /**
2389  * Prints a character for a number's digit. This is for printing for dc's P
2390  * command. This function does not need to worry about radix points. This is a
2391  * BcNumDigitOp.
2392  * @param n       The "digit" to print.
2393  * @param len     The "length" of the digit, or number of characters that will
2394  *                need to be printed for the digit.
2395  * @param rdx     True if a decimal (radix) point should be printed.
2396  * @param bslash  True if a backslash+newline should be printed if the character
2397  *                limit for the line is reached, false otherwise.
2398  */
2399 static void bc_num_printChar(size_t n, size_t len, bool rdx, bool bslash) {
2400         BC_UNUSED(rdx);
2401         BC_UNUSED(len);
2402         BC_UNUSED(bslash);
2403         assert(len == 1);
2404         bc_vm_putchar((uchar) n, bc_flush_save);
2405 }
2406
2407 #endif // !BC_ENABLE_LIBRARY
2408
2409 /**
2410  * Prints a series of characters for large bases. This is for printing in bases
2411  * above hexadecimal. This is a BcNumDigitOp.
2412  * @param n       The "digit" to print.
2413  * @param len     The "length" of the digit, or number of characters that will
2414  *                need to be printed for the digit.
2415  * @param rdx     True if a decimal (radix) point should be printed.
2416  * @param bslash  True if a backslash+newline should be printed if the character
2417  *                limit for the line is reached, false otherwise.
2418  */
2419 static void bc_num_printDigits(size_t n, size_t len, bool rdx, bool bslash) {
2420
2421         size_t exp, pow;
2422
2423         // If needed, print the radix; otherwise, print a space to separate digits.
2424         bc_num_putchar(rdx ? '.' : ' ', true);
2425
2426         // Calculate the exponent and power.
2427         for (exp = 0, pow = 1; exp < len - 1; ++exp, pow *= BC_BASE);
2428
2429         // Print each character individually.
2430         for (exp = 0; exp < len; pow /= BC_BASE, ++exp) {
2431
2432                 // The individual subdigit.
2433                 size_t dig = n / pow;
2434
2435                 // Take the subdigit away.
2436                 n -= dig * pow;
2437
2438                 // Print the subdigit.
2439                 bc_num_putchar(((uchar) dig) + '0', bslash || exp != len - 1);
2440         }
2441 }
2442
2443 /**
2444  * Prints a character for a number's digit. This is for printing in bases for
2445  * hexadecimal and below because they always print only one character at a time.
2446  * This is a BcNumDigitOp.
2447  * @param n       The "digit" to print.
2448  * @param len     The "length" of the digit, or number of characters that will
2449  *                need to be printed for the digit.
2450  * @param rdx     True if a decimal (radix) point should be printed.
2451  * @param bslash  True if a backslash+newline should be printed if the character
2452  *                limit for the line is reached, false otherwise.
2453  */
2454 static void bc_num_printHex(size_t n, size_t len, bool rdx, bool bslash) {
2455
2456         BC_UNUSED(len);
2457         BC_UNUSED(bslash);
2458
2459         assert(len == 1);
2460
2461         if (rdx) bc_num_putchar('.', true);
2462
2463         bc_num_putchar(bc_num_hex_digits[n], bslash);
2464 }
2465
2466 /**
2467  * Prints a decimal number. This is specially written for optimization since
2468  * this will be used the most and because bc's numbers are already in decimal.
2469  * @param n        The number to print.
2470  * @param newline  Whether to print backslash+newlines on long enough lines.
2471  */
2472 static void bc_num_printDecimal(const BcNum *restrict n, bool newline) {
2473
2474         size_t i, j, rdx = BC_NUM_RDX_VAL(n);
2475         bool zero = true;
2476         size_t buffer[BC_BASE_DIGS];
2477
2478         // Print loop.
2479         for (i = n->len - 1; i < n->len; --i) {
2480
2481                 BcDig n9 = n->num[i];
2482                 size_t temp;
2483                 bool irdx = (i == rdx - 1);
2484
2485                 // Calculate the number of digits in the limb.
2486                 zero = (zero & !irdx);
2487                 temp = n->scale % BC_BASE_DIGS;
2488                 temp = i || !temp ? 0 : BC_BASE_DIGS - temp;
2489
2490                 memset(buffer, 0, BC_BASE_DIGS * sizeof(size_t));
2491
2492                 // Fill the buffer with individual digits.
2493                 for (j = 0; n9 && j < BC_BASE_DIGS; ++j) {
2494                         buffer[j] = ((size_t) n9) % BC_BASE;
2495                         n9 /= BC_BASE;
2496                 }
2497
2498                 // Print the digits in the buffer.
2499                 for (j = BC_BASE_DIGS - 1; j < BC_BASE_DIGS && j >= temp; --j) {
2500
2501                         // Figure out whether to print the decimal point.
2502                         bool print_rdx = (irdx & (j == BC_BASE_DIGS - 1));
2503
2504                         // The zero variable helps us skip leading zero digits in the limb.
2505                         zero = (zero && buffer[j] == 0);
2506
2507                         if (!zero) {
2508
2509                                 // While the first three arguments should be self-explanatory,
2510                                 // the last needs explaining. I don't want to print a newline
2511                                 // when the last digit to be printed could take the place of the
2512                                 // backslash rather than being pushed, as a single character, to
2513                                 // the next line. That's what that last argument does for bc.
2514                                 bc_num_printHex(buffer[j], 1, print_rdx,
2515                                                 !newline || (j > temp || i != 0));
2516                         }
2517                 }
2518         }
2519 }
2520
2521 #if BC_ENABLE_EXTRA_MATH
2522
2523 /**
2524  * Prints a number in scientific or engineering format. When doing this, we are
2525  * always printing in decimal.
2526  * @param n        The number to print.
2527  * @param eng      True if we are in engineering mode.
2528  * @param newline  Whether to print backslash+newlines on long enough lines.
2529  */
2530 static void bc_num_printExponent(const BcNum *restrict n,
2531                                  bool eng, bool newline)
2532 {
2533         size_t places, mod, nrdx = BC_NUM_RDX_VAL(n);
2534         bool neg = (n->len <= nrdx);
2535         BcNum temp, exp;
2536         BcDig digs[BC_NUM_BIGDIG_LOG10];
2537
2538         BC_SIG_LOCK;
2539
2540         bc_num_createCopy(&temp, n);
2541
2542         BC_SETJMP_LOCKED(exit);
2543
2544         BC_SIG_UNLOCK;
2545
2546         // We need to calculate the exponents, and they change based on whether the
2547         // number is all fractional or not, obviously.
2548         if (neg) {
2549
2550                 // Figure out how many limbs after the decimal point is zero.
2551                 size_t i, idx = bc_num_nonZeroLen(n) - 1;
2552
2553                 places = 1;
2554
2555                 // Figure out how much in the last limb is zero.
2556                 for (i = BC_BASE_DIGS - 1; i < BC_BASE_DIGS; --i) {
2557                         if (bc_num_pow10[i] > (BcBigDig) n->num[idx]) places += 1;
2558                         else break;
2559                 }
2560
2561                 // Calculate the combination of zero limbs and zero digits in the last
2562                 // limb.
2563                 places += (nrdx - (idx + 1)) * BC_BASE_DIGS;
2564                 mod = places % 3;
2565
2566                 // Calculate places if we are in engineering mode.
2567                 if (eng && mod != 0) places += 3 - mod;
2568
2569                 // Shift the temp to the right place.
2570                 bc_num_shiftLeft(&temp, places);
2571         }
2572         else {
2573
2574                 // This is the number of digits that we are supposed to put behind the
2575                 // decimal point.
2576                 places = bc_num_intDigits(n) - 1;
2577
2578                 // Calculate the true number based on whether engineering mode is
2579                 // activated.
2580                 mod = places % 3;
2581                 if (eng && mod != 0) places -= 3 - (3 - mod);
2582
2583                 // Shift the temp to the right place.
2584                 bc_num_shiftRight(&temp, places);
2585         }
2586
2587         // Print the shifted number.
2588         bc_num_printDecimal(&temp, newline);
2589
2590         // Print the e.
2591         bc_num_putchar('e', !newline);
2592
2593         // Need to explicitly print a zero exponent.
2594         if (!places) {
2595                 bc_num_printHex(0, 1, false, !newline);
2596                 goto exit;
2597         }
2598
2599         // Need to print sign for the exponent.
2600         if (neg) bc_num_putchar('-', true);
2601
2602         // Create a temporary for the exponent...
2603         bc_num_setup(&exp, digs, BC_NUM_BIGDIG_LOG10);
2604         bc_num_bigdig2num(&exp, (BcBigDig) places);
2605
2606         /// ..and print it.
2607         bc_num_printDecimal(&exp, newline);
2608
2609 exit:
2610         BC_SIG_MAYLOCK;
2611         bc_num_free(&temp);
2612         BC_LONGJMP_CONT;
2613 }
2614 #endif // BC_ENABLE_EXTRA_MATH
2615
2616 /**
2617  * Converts a number from limbs with base BC_BASE_POW to base @a pow, where
2618  * @a pow is obase^N.
2619  * @param n    The number to convert.
2620  * @param rem  BC_BASE_POW - @a pow.
2621  * @param pow  The power of obase we will convert the number to.
2622  * @param idx  The index of the number to start converting at. Doing the
2623  *             conversion is O(n^2); we have to sweep through starting at the
2624  *             least significant limb
2625  */
2626 static void bc_num_printFixup(BcNum *restrict n, BcBigDig rem,
2627                               BcBigDig pow, size_t idx)
2628 {
2629         size_t i, len = n->len - idx;
2630         BcBigDig acc;
2631         BcDig *a = n->num + idx;
2632
2633         // Ignore if there's just one limb left. This is the part that requires the
2634         // extra loop after the one calling this function in bc_num_printPrepare().
2635         if (len < 2) return;
2636
2637         // Loop through the remaining limbs and convert. We start at the second limb
2638         // because we pull the value from the previous one as well.
2639         for (i = len - 1; i > 0; --i) {
2640
2641                 // Get the limb and add it to the previous, along with multiplying by
2642                 // the remainder because that's the proper overflow. "acc" means
2643                 // "accumulator," by the way.
2644                 acc = ((BcBigDig) a[i]) * rem + ((BcBigDig) a[i - 1]);
2645
2646                 // Store a value in base pow in the previous limb.
2647                 a[i - 1] = (BcDig) (acc % pow);
2648
2649                 // Divide by the base and accumulate the remaining value in the limb.
2650                 acc /= pow;
2651                 acc += (BcBigDig) a[i];
2652
2653                 // If the accumulator is greater than the base...
2654                 if (acc >= BC_BASE_POW) {
2655
2656                         // Do we need to grow?
2657                         if (i == len - 1) {
2658
2659                                 // Grow.
2660                                 len = bc_vm_growSize(len, 1);
2661                                 bc_num_expand(n, bc_vm_growSize(len, idx));
2662
2663                                 // Update the pointer because it may have moved.
2664                                 a = n->num + idx;
2665
2666                                 // Zero out the last limb.
2667                                 a[len - 1] = 0;
2668                         }
2669
2670                         // Overflow into the next limb since we are over the base.
2671                         a[i + 1] += acc / BC_BASE_POW;
2672                         acc %= BC_BASE_POW;
2673                 }
2674
2675                 assert(acc < BC_BASE_POW);
2676
2677                 // Set the limb.
2678                 a[i] = (BcDig) acc;
2679         }
2680
2681         // We may have grown the number, so adjust the length.
2682         n->len = len + idx;
2683 }
2684
2685 /**
2686  * Prepares a number for printing in a base that is not a divisor of
2687  * BC_BASE_POW. This basically converts the number from having limbs of base
2688  * BC_BASE_POW to limbs of pow, where pow is obase^N.
2689  * @param n    The number to prepare for printing.
2690  * @param rem  The remainder of BC_BASE_POW when divided by a power of the base.
2691  * @param pow  The power of the base.
2692  */
2693 static void bc_num_printPrepare(BcNum *restrict n, BcBigDig rem, BcBigDig pow) {
2694
2695         size_t i;
2696
2697         // Loop from the least significant limb to the most significant limb and
2698         // convert limbs in each pass.
2699         for (i = 0; i < n->len; ++i) bc_num_printFixup(n, rem, pow, i);
2700
2701         // bc_num_printFixup() does not do everything it is supposed to, so we do
2702         // the last bit of cleanup here. That cleanup is to ensure that each limb
2703         // is less than pow and to expand the number to fit new limbs as necessary.
2704         for (i = 0; i < n->len; ++i) {
2705
2706                 assert(pow == ((BcBigDig) ((BcDig) pow)));
2707
2708                 // If the limb needs fixing...
2709                 if (n->num[i] >= (BcDig) pow) {
2710
2711                         // Do we need to grow?
2712                         if (i + 1 == n->len) {
2713
2714                                 // Grow the number.
2715                                 n->len = bc_vm_growSize(n->len, 1);
2716                                 bc_num_expand(n, n->len);
2717
2718                                 // Without this, we might use uninitialized data.
2719                                 n->num[i + 1] = 0;
2720                         }
2721
2722                         assert(pow < BC_BASE_POW);
2723
2724                         // Overflow into the next limb.
2725                         n->num[i + 1] += n->num[i] / ((BcDig) pow);
2726                         n->num[i] %= (BcDig) pow;
2727                 }
2728         }
2729 }
2730
2731 static void bc_num_printNum(BcNum *restrict n, BcBigDig base, size_t len,
2732                             BcNumDigitOp print, bool newline)
2733 {
2734         BcVec stack;
2735         BcNum intp, fracp1, fracp2, digit, flen1, flen2, *n1, *n2, *temp;
2736         BcBigDig dig = 0, *ptr, acc, exp;
2737         size_t i, j, nrdx, idigits;
2738         bool radix;
2739         BcDig digit_digs[BC_NUM_BIGDIG_LOG10 + 1];
2740
2741         assert(base > 1);
2742
2743         // Easy case. Even with scale, we just print this.
2744         if (BC_NUM_ZERO(n)) {
2745                 print(0, len, false, !newline);
2746                 return;
2747         }
2748
2749         // This function uses an algorithm that Stefan Esser <se@freebsd.org> came
2750         // up with to print the integer part of a number. What it does is convert
2751         // intp into a number of the specified base, but it does it directly,
2752         // instead of just doing a series of divisions and printing the remainders
2753         // in reverse order.
2754         //
2755         // Let me explain in a bit more detail:
2756         //
2757         // The algorithm takes the current least significant limb (after intp has
2758         // been converted to an integer) and the next to least significant limb, and
2759         // it converts the least significant limb into one of the specified base,
2760         // putting any overflow into the next to least significant limb. It iterates
2761         // through the whole number, from least significant to most significant,
2762         // doing this conversion. At the end of that iteration, the least
2763         // significant limb is converted, but the others are not, so it iterates
2764         // again, starting at the next to least significant limb. It keeps doing
2765         // that conversion, skipping one more limb than the last time, until all
2766         // limbs have been converted. Then it prints them in reverse order.
2767         //
2768         // That is the gist of the algorithm. It leaves out several things, such as
2769         // the fact that limbs are not always converted into the specified base, but
2770         // into something close, basically a power of the specified base. In
2771         // Stefan's words, "You could consider BcDigs to be of base 10^BC_BASE_DIGS
2772         // in the normal case and obase^N for the largest value of N that satisfies
2773         // obase^N <= 10^BC_BASE_DIGS. [This means that] the result is not in base
2774         // "obase", but in base "obase^N", which happens to be printable as a number
2775         // of base "obase" without consideration for neighbouring BcDigs." This fact
2776         // is what necessitates the existence of the loop later in this function.
2777         //
2778         // The conversion happens in bc_num_printPrepare() where the outer loop
2779         // happens and bc_num_printFixup() where the inner loop, or actual
2780         // conversion, happens. In other words, bc_num_printPrepare() is where the
2781         // loop that starts at the least significant limb and goes to the most
2782         // significant limb. Then, on every iteration of its loop, it calls
2783         // bc_num_printFixup(), which has the inner loop of actually converting
2784         // the limbs it passes into limbs of base obase^N rather than base
2785         // BC_BASE_POW.
2786
2787         nrdx = BC_NUM_RDX_VAL(n);
2788
2789         BC_SIG_LOCK;
2790
2791         // The stack is what allows us to reverse the digits for printing.
2792         bc_vec_init(&stack, sizeof(BcBigDig), BC_DTOR_NONE);
2793         bc_num_init(&fracp1, nrdx);
2794
2795         // intp will be the "integer part" of the number, so copy it.
2796         bc_num_createCopy(&intp, n);
2797
2798         BC_SETJMP_LOCKED(err);
2799
2800         BC_SIG_UNLOCK;
2801
2802         // Make intp an integer.
2803         bc_num_truncate(&intp, intp.scale);
2804
2805         // Get the fractional part out.
2806         bc_num_sub(n, &intp, &fracp1, 0);
2807
2808         // If the base is not the same as the last base used for printing, we need
2809         // to update the cached exponent and power. Yes, we cache the values of the
2810         // exponent and power. That is to prevent us from calculating them every
2811         // time because printing will probably happen multiple times on the same
2812         // base.
2813         if (base != vm.last_base) {
2814
2815                 vm.last_pow = 1;
2816                 vm.last_exp = 0;
2817
2818                 // Calculate the exponent and power.
2819                 while (vm.last_pow * base <= BC_BASE_POW) {
2820                         vm.last_pow *= base;
2821                         vm.last_exp += 1;
2822                 }
2823
2824                 // Also, the remainder and base itself.
2825                 vm.last_rem = BC_BASE_POW - vm.last_pow;
2826                 vm.last_base = base;
2827         }
2828
2829         exp = vm.last_exp;
2830
2831         // If vm.last_rem is 0, then the base we are printing in is a divisor of
2832         // BC_BASE_POW, which is the easy case because it means that BC_BASE_POW is
2833         // a power of obase, and no conversion is needed. If it *is* 0, then we have
2834         // the hard case, and we have to prepare the number for the base.
2835         if (vm.last_rem != 0) bc_num_printPrepare(&intp, vm.last_rem, vm.last_pow);
2836
2837         // After the conversion comes the surprisingly easy part. From here on out,
2838         // this is basically naive code that I wrote, adjusted for the larger bases.
2839
2840         // Fill the stack of digits for the integer part.
2841         for (i = 0; i < intp.len; ++i) {
2842
2843                 // Get the limb.
2844                 acc = (BcBigDig) intp.num[i];
2845
2846                 // Turn the limb into digits of base obase.
2847                 for (j = 0; j < exp && (i < intp.len - 1 || acc != 0); ++j)
2848                 {
2849                         // This condition is true if we are not at the last digit.
2850                         if (j != exp - 1) {
2851                                 dig = acc % base;
2852                                 acc /= base;
2853                         }
2854                         else {
2855                                 dig = acc;
2856                                 acc = 0;
2857                         }
2858
2859                         assert(dig < base);
2860
2861                         // Push the digit onto the stack.
2862                         bc_vec_push(&stack, &dig);
2863                 }
2864
2865                 assert(acc == 0);
2866         }
2867
2868         // Go through the stack backwards and print each digit.
2869         for (i = 0; i < stack.len; ++i) {
2870
2871                 ptr = bc_vec_item_rev(&stack, i);
2872
2873                 assert(ptr != NULL);
2874
2875                 // While the first three arguments should be self-explanatory, the last
2876                 // needs explaining. I don't want to print a newline when the last digit
2877                 // to be printed could take the place of the backslash rather than being
2878                 // pushed, as a single character, to the next line. That's what that
2879                 // last argument does for bc.
2880                 print(*ptr, len, false, !newline ||
2881                       (n->scale != 0 || i == stack.len - 1));
2882         }
2883
2884         // We are done if there is no fractional part.
2885         if (!n->scale) goto err;
2886
2887         BC_SIG_LOCK;
2888
2889         // Reset the jump because some locals are changing.
2890         BC_UNSETJMP;
2891
2892         bc_num_init(&fracp2, nrdx);
2893         bc_num_setup(&digit, digit_digs, sizeof(digit_digs) / sizeof(BcDig));
2894         bc_num_init(&flen1, BC_NUM_BIGDIG_LOG10);
2895         bc_num_init(&flen2, BC_NUM_BIGDIG_LOG10);
2896
2897         BC_SETJMP_LOCKED(frac_err);
2898
2899         BC_SIG_UNLOCK;
2900
2901         bc_num_one(&flen1);
2902
2903         radix = true;
2904
2905         // Pointers for easy switching.
2906         n1 = &flen1;
2907         n2 = &flen2;
2908
2909         fracp2.scale = n->scale;
2910         BC_NUM_RDX_SET_NP(fracp2, BC_NUM_RDX(fracp2.scale));
2911
2912         // As long as we have not reached the scale of the number, keep printing.
2913         while ((idigits = bc_num_intDigits(n1)) <= n->scale) {
2914
2915                 // These numbers will keep growing.
2916                 bc_num_expand(&fracp2, fracp1.len + 1);
2917                 bc_num_mulArray(&fracp1, base, &fracp2);
2918
2919                 nrdx = BC_NUM_RDX_VAL_NP(fracp2);
2920
2921                 // Ensure an invariant.
2922                 if (fracp2.len < nrdx) fracp2.len = nrdx;
2923
2924                 // fracp is guaranteed to be non-negative and small enough.
2925                 dig = bc_num_bigdig2(&fracp2);
2926
2927                 // Convert the digit to a number and subtract it from the number.
2928                 bc_num_bigdig2num(&digit, dig);
2929                 bc_num_sub(&fracp2, &digit, &fracp1, 0);
2930
2931                 // While the first three arguments should be self-explanatory, the last
2932                 // needs explaining. I don't want to print a newline when the last digit
2933                 // to be printed could take the place of the backslash rather than being
2934                 // pushed, as a single character, to the next line. That's what that
2935                 // last argument does for bc.
2936                 print(dig, len, radix, !newline || idigits != n->scale);
2937
2938                 // Update the multipliers.
2939                 bc_num_mulArray(n1, base, n2);
2940
2941                 radix = false;
2942
2943                 // Switch.
2944                 temp = n1;
2945                 n1 = n2;
2946                 n2 = temp;
2947         }
2948
2949 frac_err:
2950         BC_SIG_MAYLOCK;
2951         bc_num_free(&flen2);
2952         bc_num_free(&flen1);
2953         bc_num_free(&fracp2);
2954 err:
2955         BC_SIG_MAYLOCK;
2956         bc_num_free(&fracp1);
2957         bc_num_free(&intp);
2958         bc_vec_free(&stack);
2959         BC_LONGJMP_CONT;
2960 }
2961
2962 /**
2963  * Prints a number in the specified base, or rather, figures out which function
2964  * to call to print the number in the specified base and calls it.
2965  * @param n        The number to print.
2966  * @param base     The base to print in.
2967  * @param newline  Whether to print backslash+newlines on long enough lines.
2968  */
2969 static void bc_num_printBase(BcNum *restrict n, BcBigDig base, bool newline) {
2970
2971         size_t width;
2972         BcNumDigitOp print;
2973         bool neg = BC_NUM_NEG(n);
2974
2975         // Clear the sign because it makes the actual printing easier when we have
2976         // to do math.
2977         BC_NUM_NEG_CLR(n);
2978
2979         // Bases at hexadecimal and below are printed as one character, larger bases
2980         // are printed as a series of digits separated by spaces.
2981         if (base <= BC_NUM_MAX_POSIX_IBASE) {
2982                 width = 1;
2983                 print = bc_num_printHex;
2984         }
2985         else {
2986                 assert(base <= BC_BASE_POW);
2987                 width = bc_num_log10(base - 1);
2988                 print = bc_num_printDigits;
2989         }
2990
2991         // Print.
2992         bc_num_printNum(n, base, width, print, newline);
2993
2994         // Reset the sign.
2995         n->rdx = BC_NUM_NEG_VAL(n, neg);
2996 }
2997
2998 #if !BC_ENABLE_LIBRARY
2999
3000 void bc_num_stream(BcNum *restrict n) {
3001         bc_num_printNum(n, BC_NUM_STREAM_BASE, 1, bc_num_printChar, false);
3002 }
3003
3004 #endif // !BC_ENABLE_LIBRARY
3005
3006 void bc_num_setup(BcNum *restrict n, BcDig *restrict num, size_t cap) {
3007         assert(n != NULL);
3008         n->num = num;
3009         n->cap = cap;
3010         bc_num_zero(n);
3011 }
3012
3013 void bc_num_init(BcNum *restrict n, size_t req) {
3014
3015         BcDig *num;
3016
3017         BC_SIG_ASSERT_LOCKED;
3018
3019         assert(n != NULL);
3020
3021         // BC_NUM_DEF_SIZE is set to be about the smallest allocation size that
3022         // malloc() returns in practice, so just use it.
3023         req = req >= BC_NUM_DEF_SIZE ? req : BC_NUM_DEF_SIZE;
3024
3025         // If we can't use a temp, allocate.
3026         if (req != BC_NUM_DEF_SIZE || (num = bc_vm_takeTemp()) == NULL)
3027                 num = bc_vm_malloc(BC_NUM_SIZE(req));
3028
3029         bc_num_setup(n, num, req);
3030 }
3031
3032 void bc_num_clear(BcNum *restrict n) {
3033         n->num = NULL;
3034         n->cap = 0;
3035 }
3036
3037 void bc_num_free(void *num) {
3038
3039         BcNum *n = (BcNum*) num;
3040
3041         BC_SIG_ASSERT_LOCKED;
3042
3043         assert(n != NULL);
3044
3045         if (n->cap == BC_NUM_DEF_SIZE) bc_vm_addTemp(n->num);
3046         else free(n->num);
3047 }
3048
3049 void bc_num_copy(BcNum *d, const BcNum *s) {
3050
3051         assert(d != NULL && s != NULL);
3052
3053         if (d == s) return;
3054
3055         bc_num_expand(d, s->len);
3056         d->len = s->len;
3057
3058         // I can just copy directly here because the sign *and* rdx will be
3059         // properly preserved.
3060         d->rdx = s->rdx;
3061         d->scale = s->scale;
3062         memcpy(d->num, s->num, BC_NUM_SIZE(d->len));
3063 }
3064
3065 void bc_num_createCopy(BcNum *d, const BcNum *s) {
3066         BC_SIG_ASSERT_LOCKED;
3067         bc_num_init(d, s->len);
3068         bc_num_copy(d, s);
3069 }
3070
3071 void bc_num_createFromBigdig(BcNum *restrict n, BcBigDig val) {
3072         BC_SIG_ASSERT_LOCKED;
3073         bc_num_init(n, BC_NUM_BIGDIG_LOG10);
3074         bc_num_bigdig2num(n, val);
3075 }
3076
3077 size_t bc_num_scale(const BcNum *restrict n) {
3078         return n->scale;
3079 }
3080
3081 size_t bc_num_len(const BcNum *restrict n) {
3082
3083         size_t len = n->len;
3084
3085         // Always return at least 1.
3086         if (BC_NUM_ZERO(n)) return n->scale ? n->scale : 1;
3087
3088         // If this is true, there is no integer portion of the number.
3089         if (BC_NUM_RDX_VAL(n) == len) {
3090
3091                 // We have to take into account the fact that some of the digits right
3092                 // after the decimal could be zero. If that is the case, we need to
3093                 // ignore them until we hit the first non-zero digit.
3094
3095                 size_t zero, scale;
3096
3097                 // The number of limbs with non-zero digits.
3098                 len = bc_num_nonZeroLen(n);
3099
3100                 // Get the number of digits in the last limb.
3101                 scale = n->scale % BC_BASE_DIGS;
3102                 scale = scale ? scale : BC_BASE_DIGS;
3103
3104                 // Get the number of zero digits.
3105                 zero = bc_num_zeroDigits(n->num + len - 1);
3106
3107                 // Calculate the true length.
3108                 len = len * BC_BASE_DIGS - zero - (BC_BASE_DIGS - scale);
3109         }
3110         // Otherwise, count the number of int digits and return that plus the scale.
3111         else len = bc_num_intDigits(n) + n->scale;
3112
3113         return len;
3114 }
3115
3116 void bc_num_parse(BcNum *restrict n, const char *restrict val, BcBigDig base) {
3117
3118         assert(n != NULL && val != NULL && base);
3119         assert(base >= BC_NUM_MIN_BASE && base <= vm.maxes[BC_PROG_GLOBALS_IBASE]);
3120         assert(bc_num_strValid(val));
3121
3122         // A one character number is *always* parsed as though the base was the
3123         // maximum allowed ibase, per the bc spec.
3124         if (!val[1]) {
3125                 BcBigDig dig = bc_num_parseChar(val[0], BC_NUM_MAX_LBASE);
3126                 bc_num_bigdig2num(n, dig);
3127         }
3128         else if (base == BC_BASE) bc_num_parseDecimal(n, val);
3129         else bc_num_parseBase(n, val, base);
3130
3131         assert(BC_NUM_RDX_VALID(n));
3132 }
3133
3134 void bc_num_print(BcNum *restrict n, BcBigDig base, bool newline) {
3135
3136         assert(n != NULL);
3137         assert(BC_ENABLE_EXTRA_MATH || base >= BC_NUM_MIN_BASE);
3138
3139         // We may need a newline, just to start.
3140         bc_num_printNewline();
3141
3142         if (BC_NUM_NONZERO(n)) {
3143
3144                 // Print the sign.
3145                 if (BC_NUM_NEG(n)) bc_num_putchar('-', true);
3146
3147                 // Print the leading zero if necessary.
3148                 if (BC_Z && BC_NUM_RDX_VAL(n) == n->len)
3149                         bc_num_printHex(0, 1, false, !newline);
3150         }
3151
3152         // Short-circuit 0.
3153         if (BC_NUM_ZERO(n)) bc_num_printHex(0, 1, false, !newline);
3154         else if (base == BC_BASE) bc_num_printDecimal(n, newline);
3155 #if BC_ENABLE_EXTRA_MATH
3156         else if (base == 0 || base == 1)
3157                 bc_num_printExponent(n, base != 0, newline);
3158 #endif // BC_ENABLE_EXTRA_MATH
3159         else bc_num_printBase(n, base, newline);
3160
3161         if (newline) bc_num_putchar('\n', false);
3162 }
3163
3164 BcBigDig bc_num_bigdig2(const BcNum *restrict n) {
3165
3166         // This function returns no errors because it's guaranteed to succeed if
3167         // its preconditions are met. Those preconditions include both n needs to
3168         // be non-NULL, n being non-negative, and n being less than vm.max. If all
3169         // of that is true, then we can just convert without worrying about negative
3170         // errors or overflow.
3171
3172         BcBigDig r = 0;
3173         size_t nrdx = BC_NUM_RDX_VAL(n);
3174
3175         assert(n != NULL);
3176         assert(!BC_NUM_NEG(n));
3177         assert(bc_num_cmp(n, &vm.max) < 0);
3178         assert(n->len - nrdx <= 3);
3179
3180         // There is a small speed win from unrolling the loop here, and since it
3181         // only adds 53 bytes, I decided that it was worth it.
3182         switch (n->len - nrdx) {
3183
3184                 case 3:
3185                 {
3186                         r = (BcBigDig) n->num[nrdx + 2];
3187                 }
3188                 // Fallthrough.
3189                 BC_FALLTHROUGH
3190
3191                 case 2:
3192                 {
3193                         r = r * BC_BASE_POW + (BcBigDig) n->num[nrdx + 1];
3194                 }
3195                 // Fallthrough.
3196                 BC_FALLTHROUGH
3197
3198                 case 1:
3199                 {
3200                         r = r * BC_BASE_POW + (BcBigDig) n->num[nrdx];
3201                 }
3202         }
3203
3204         return r;
3205 }
3206
3207 BcBigDig bc_num_bigdig(const BcNum *restrict n) {
3208
3209         assert(n != NULL);
3210
3211         // This error checking is extremely important, and if you do not have a
3212         // guarantee that converting a number will always succeed in a particular
3213         // case, you *must* call this function to get these error checks. This
3214         // includes all instances of numbers inputted by the user or calculated by
3215         // the user. Otherwise, you can call the faster bc_num_bigdig2().
3216         if (BC_ERR(BC_NUM_NEG(n))) bc_err(BC_ERR_MATH_NEGATIVE);
3217         if (BC_ERR(bc_num_cmp(n, &vm.max) >= 0)) bc_err(BC_ERR_MATH_OVERFLOW);
3218
3219         return bc_num_bigdig2(n);
3220 }
3221
3222 void bc_num_bigdig2num(BcNum *restrict n, BcBigDig val) {
3223
3224         BcDig *ptr;
3225         size_t i;
3226
3227         assert(n != NULL);
3228
3229         bc_num_zero(n);
3230
3231         // Already 0.
3232         if (!val) return;
3233
3234         // Expand first. This is the only way this function can fail, and it's a
3235         // fatal error.
3236         bc_num_expand(n, BC_NUM_BIGDIG_LOG10);
3237
3238         // The conversion is easy because numbers are laid out in little-endian
3239         // order.
3240         for (ptr = n->num, i = 0; val; ++i, val /= BC_BASE_POW)
3241                 ptr[i] = val % BC_BASE_POW;
3242
3243         n->len = i;
3244 }
3245
3246 #if BC_ENABLE_EXTRA_MATH
3247
3248 void bc_num_rng(const BcNum *restrict n, BcRNG *rng) {
3249
3250         BcNum temp, temp2, intn, frac;
3251         BcRand state1, state2, inc1, inc2;
3252         size_t nrdx = BC_NUM_RDX_VAL(n);
3253
3254         // This function holds the secret of how I interpret a seed number for the
3255         // PRNG. Well, it's actually in the development manual
3256         // (manuals/development.md#pseudo-random-number-generator), so look there
3257         // before you try to understand this.
3258
3259         BC_SIG_LOCK;
3260
3261         bc_num_init(&temp, n->len);
3262         bc_num_init(&temp2, n->len);
3263         bc_num_init(&frac, nrdx);
3264         bc_num_init(&intn, bc_num_int(n));
3265
3266         BC_SETJMP_LOCKED(err);
3267
3268         BC_SIG_UNLOCK;
3269
3270         assert(BC_NUM_RDX_VALID_NP(vm.max));
3271
3272         memcpy(frac.num, n->num, BC_NUM_SIZE(nrdx));
3273         frac.len = nrdx;
3274         BC_NUM_RDX_SET_NP(frac, nrdx);
3275         frac.scale = n->scale;
3276
3277         assert(BC_NUM_RDX_VALID_NP(frac));
3278         assert(BC_NUM_RDX_VALID_NP(vm.max2));
3279
3280         // Multiply the fraction and truncate so that it's an integer. The
3281         // truncation is what clamps it, by the way.
3282         bc_num_mul(&frac, &vm.max2, &temp, 0);
3283         bc_num_truncate(&temp, temp.scale);
3284         bc_num_copy(&frac, &temp);
3285
3286         // Get the integer.
3287         memcpy(intn.num, n->num + nrdx, BC_NUM_SIZE(bc_num_int(n)));
3288         intn.len = bc_num_int(n);
3289
3290         // This assert is here because it has to be true. It is also here to justify
3291         // some optimizations.
3292         assert(BC_NUM_NONZERO(&vm.max));
3293
3294         // If there *was* a fractional part...
3295         if (BC_NUM_NONZERO(&frac)) {
3296
3297                 // This divmod splits frac into the two state parts.
3298                 bc_num_divmod(&frac, &vm.max, &temp, &temp2, 0);
3299
3300                 // frac is guaranteed to be smaller than vm.max * vm.max (pow).
3301                 // This means that when dividing frac by vm.max, as above, the
3302                 // quotient and remainder are both guaranteed to be less than vm.max,
3303                 // which means we can use bc_num_bigdig2() here and not worry about
3304                 // overflow.
3305                 state1 = (BcRand) bc_num_bigdig2(&temp2);
3306                 state2 = (BcRand) bc_num_bigdig2(&temp);
3307         }
3308         else state1 = state2 = 0;
3309
3310         // If there *was* an integer part...
3311         if (BC_NUM_NONZERO(&intn)) {
3312
3313                 // This divmod splits intn into the two inc parts.
3314                 bc_num_divmod(&intn, &vm.max, &temp, &temp2, 0);
3315
3316                 // Because temp2 is the mod of vm.max, from above, it is guaranteed
3317                 // to be small enough to use bc_num_bigdig2().
3318                 inc1 = (BcRand) bc_num_bigdig2(&temp2);
3319
3320                 // Clamp the second inc part.
3321                 if (bc_num_cmp(&temp, &vm.max) >= 0) {
3322                         bc_num_copy(&temp2, &temp);
3323                         bc_num_mod(&temp2, &vm.max, &temp, 0);
3324                 }
3325
3326                 // The if statement above ensures that temp is less than vm.max, which
3327                 // means that we can use bc_num_bigdig2() here.
3328                 inc2 = (BcRand) bc_num_bigdig2(&temp);
3329         }
3330         else inc1 = inc2 = 0;
3331
3332         bc_rand_seed(rng, state1, state2, inc1, inc2);
3333
3334 err:
3335         BC_SIG_MAYLOCK;
3336         bc_num_free(&intn);
3337         bc_num_free(&frac);
3338         bc_num_free(&temp2);
3339         bc_num_free(&temp);
3340         BC_LONGJMP_CONT;
3341 }
3342
3343 void bc_num_createFromRNG(BcNum *restrict n, BcRNG *rng) {
3344
3345         BcRand s1, s2, i1, i2;
3346         BcNum conv, temp1, temp2, temp3;
3347         BcDig temp1_num[BC_RAND_NUM_SIZE], temp2_num[BC_RAND_NUM_SIZE];
3348         BcDig conv_num[BC_NUM_BIGDIG_LOG10];
3349
3350         BC_SIG_LOCK;
3351
3352         bc_num_init(&temp3, 2 * BC_RAND_NUM_SIZE);
3353
3354         BC_SETJMP_LOCKED(err);
3355
3356         BC_SIG_UNLOCK;
3357
3358         bc_num_setup(&temp1, temp1_num, sizeof(temp1_num) / sizeof(BcDig));
3359         bc_num_setup(&temp2, temp2_num, sizeof(temp2_num) / sizeof(BcDig));
3360         bc_num_setup(&conv, conv_num, sizeof(conv_num) / sizeof(BcDig));
3361
3362         // This assert is here because it has to be true. It is also here to justify
3363         // the assumption that vm.max is not zero.
3364         assert(BC_NUM_NONZERO(&vm.max));
3365
3366         // Because this is true, we can just ignore math errors that would happen
3367         // otherwise.
3368         assert(BC_NUM_NONZERO(&vm.max2));
3369
3370         bc_rand_getRands(rng, &s1, &s2, &i1, &i2);
3371
3372         // Put the second piece of state into a number.
3373         bc_num_bigdig2num(&conv, (BcBigDig) s2);
3374
3375         assert(BC_NUM_RDX_VALID_NP(conv));
3376
3377         // Multiply by max to make room for the first piece of state.
3378         bc_num_mul(&conv, &vm.max, &temp1, 0);
3379
3380         // Add in the first piece of state.
3381         bc_num_bigdig2num(&conv, (BcBigDig) s1);
3382         bc_num_add(&conv, &temp1, &temp2, 0);
3383
3384         // Divide to make it an entirely fractional part.
3385         bc_num_div(&temp2, &vm.max2, &temp3, BC_RAND_STATE_BITS);
3386
3387         // Now start on the increment parts. It's the same process without the
3388         // divide, so put the second piece of increment into a number.
3389         bc_num_bigdig2num(&conv, (BcBigDig) i2);
3390
3391         assert(BC_NUM_RDX_VALID_NP(conv));
3392
3393         // Multiply by max to make room for the first piece of increment.
3394         bc_num_mul(&conv, &vm.max, &temp1, 0);
3395
3396         // Add in the first piece of increment.
3397         bc_num_bigdig2num(&conv, (BcBigDig) i1);
3398         bc_num_add(&conv, &temp1, &temp2, 0);
3399
3400         // Now add the two together.
3401         bc_num_add(&temp2, &temp3, n, 0);
3402
3403         assert(BC_NUM_RDX_VALID(n));
3404
3405 err:
3406         BC_SIG_MAYLOCK;
3407         bc_num_free(&temp3);
3408         BC_LONGJMP_CONT;
3409 }
3410
3411 void bc_num_irand(BcNum *restrict a, BcNum *restrict b, BcRNG *restrict rng) {
3412
3413         BcNum atemp;
3414         size_t i, len;
3415
3416         assert(a != b);
3417
3418         if (BC_ERR(BC_NUM_NEG(a))) bc_err(BC_ERR_MATH_NEGATIVE);
3419
3420         // If either of these are true, then the numbers are integers.
3421         if (BC_NUM_ZERO(a) || BC_NUM_ONE(a)) return;
3422
3423         if (BC_ERR(bc_num_nonInt(a, &atemp))) bc_err(BC_ERR_MATH_NON_INTEGER);
3424
3425         assert(atemp.len);
3426
3427         len = atemp.len - 1;
3428
3429         // Just generate a random number for each limb.
3430         for (i = 0; i < len; ++i)
3431                 b->num[i] = (BcDig) bc_rand_bounded(rng, BC_BASE_POW);
3432
3433         // Do the last digit explicitly because the bound must be right. But only
3434         // do it if the limb does not equal 1. If it does, we have already hit the
3435         // limit.
3436         if (atemp.num[i] != 1) {
3437                 b->num[i] = (BcDig) bc_rand_bounded(rng, (BcRand) atemp.num[i]);
3438                 b->len = atemp.len;
3439         }
3440         // We want 1 less len in the case where we skip the last limb.
3441         else b->len = len;
3442
3443         bc_num_clean(b);
3444
3445         assert(BC_NUM_RDX_VALID(b));
3446 }
3447 #endif // BC_ENABLE_EXTRA_MATH
3448
3449 size_t bc_num_addReq(const BcNum *a, const BcNum *b, size_t scale) {
3450
3451         size_t aint, bint, ardx, brdx;
3452
3453         // Addition and subtraction require the max of the length of the two numbers
3454         // plus 1.
3455
3456         BC_UNUSED(scale);
3457
3458         ardx = BC_NUM_RDX_VAL(a);
3459         aint = bc_num_int(a);
3460         assert(aint <= a->len && ardx <= a->len);
3461
3462         brdx = BC_NUM_RDX_VAL(b);
3463         bint = bc_num_int(b);
3464         assert(bint <= b->len && brdx <= b->len);
3465
3466         ardx = BC_MAX(ardx, brdx);
3467         aint = BC_MAX(aint, bint);
3468
3469         return bc_vm_growSize(bc_vm_growSize(ardx, aint), 1);
3470 }
3471
3472 size_t bc_num_mulReq(const BcNum *a, const BcNum *b, size_t scale) {
3473
3474         size_t max, rdx;
3475
3476         // Multiplication requires the sum of the lengths of the numbers.
3477
3478         rdx = bc_vm_growSize(BC_NUM_RDX_VAL(a), BC_NUM_RDX_VAL(b));
3479
3480         max = BC_NUM_RDX(scale);
3481
3482         max = bc_vm_growSize(BC_MAX(max, rdx), 1);
3483         rdx = bc_vm_growSize(bc_vm_growSize(bc_num_int(a), bc_num_int(b)), max);
3484
3485         return rdx;
3486 }
3487
3488 size_t bc_num_divReq(const BcNum *a, const BcNum *b, size_t scale) {
3489
3490         size_t max, rdx;
3491
3492         // Division requires the length of the dividend plus the scale.
3493
3494         rdx = bc_vm_growSize(BC_NUM_RDX_VAL(a), BC_NUM_RDX_VAL(b));
3495
3496         max = BC_NUM_RDX(scale);
3497
3498         max = bc_vm_growSize(BC_MAX(max, rdx), 1);
3499         rdx = bc_vm_growSize(bc_num_int(a), max);
3500
3501         return rdx;
3502 }
3503
3504 size_t bc_num_powReq(const BcNum *a, const BcNum *b, size_t scale) {
3505         BC_UNUSED(scale);
3506         return bc_vm_growSize(bc_vm_growSize(a->len, b->len), 1);
3507 }
3508
3509 #if BC_ENABLE_EXTRA_MATH
3510 size_t bc_num_placesReq(const BcNum *a, const BcNum *b, size_t scale) {
3511         BC_UNUSED(scale);
3512         return a->len + b->len - BC_NUM_RDX_VAL(a) - BC_NUM_RDX_VAL(b);
3513 }
3514 #endif // BC_ENABLE_EXTRA_MATH
3515
3516 void bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3517         assert(BC_NUM_RDX_VALID(a));
3518         assert(BC_NUM_RDX_VALID(b));
3519         bc_num_binary(a, b, c, false, bc_num_as, bc_num_addReq(a, b, scale));
3520 }
3521
3522 void bc_num_sub(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3523         assert(BC_NUM_RDX_VALID(a));
3524         assert(BC_NUM_RDX_VALID(b));
3525         bc_num_binary(a, b, c, true, bc_num_as, bc_num_addReq(a, b, scale));
3526 }
3527
3528 void bc_num_mul(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3529         assert(BC_NUM_RDX_VALID(a));
3530         assert(BC_NUM_RDX_VALID(b));
3531         bc_num_binary(a, b, c, scale, bc_num_m, bc_num_mulReq(a, b, scale));
3532 }
3533
3534 void bc_num_div(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3535         assert(BC_NUM_RDX_VALID(a));
3536         assert(BC_NUM_RDX_VALID(b));
3537         bc_num_binary(a, b, c, scale, bc_num_d, bc_num_divReq(a, b, scale));
3538 }
3539
3540 void bc_num_mod(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3541         assert(BC_NUM_RDX_VALID(a));
3542         assert(BC_NUM_RDX_VALID(b));
3543         bc_num_binary(a, b, c, scale, bc_num_rem, bc_num_divReq(a, b, scale));
3544 }
3545
3546 void bc_num_pow(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3547         assert(BC_NUM_RDX_VALID(a));
3548         assert(BC_NUM_RDX_VALID(b));
3549         bc_num_binary(a, b, c, scale, bc_num_p, bc_num_powReq(a, b, scale));
3550 }
3551
3552 #if BC_ENABLE_EXTRA_MATH
3553 void bc_num_places(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3554         assert(BC_NUM_RDX_VALID(a));
3555         assert(BC_NUM_RDX_VALID(b));
3556         bc_num_binary(a, b, c, scale, bc_num_place, bc_num_placesReq(a, b, scale));
3557 }
3558
3559 void bc_num_lshift(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3560         assert(BC_NUM_RDX_VALID(a));
3561         assert(BC_NUM_RDX_VALID(b));
3562         bc_num_binary(a, b, c, scale, bc_num_left, bc_num_placesReq(a, b, scale));
3563 }
3564
3565 void bc_num_rshift(BcNum *a, BcNum *b, BcNum *c, size_t scale) {
3566         assert(BC_NUM_RDX_VALID(a));
3567         assert(BC_NUM_RDX_VALID(b));
3568         bc_num_binary(a, b, c, scale, bc_num_right, bc_num_placesReq(a, b, scale));
3569 }
3570 #endif // BC_ENABLE_EXTRA_MATH
3571
3572 void bc_num_sqrt(BcNum *restrict a, BcNum *restrict b, size_t scale) {
3573
3574         BcNum num1, num2, half, f, fprime, *x0, *x1, *temp;
3575         size_t pow, len, rdx, req, resscale;
3576         BcDig half_digs[1];
3577
3578         assert(a != NULL && b != NULL && a != b);
3579
3580         if (BC_ERR(BC_NUM_NEG(a))) bc_err(BC_ERR_MATH_NEGATIVE);
3581
3582         // We want to calculate to a's scale if it is bigger so that the result will
3583         // truncate properly.
3584         if (a->scale > scale) scale = a->scale;
3585
3586         // Set parameters for the result.
3587         len = bc_vm_growSize(bc_num_intDigits(a), 1);
3588         rdx = BC_NUM_RDX(scale);
3589
3590         // Square root needs half of the length of the parameter.
3591         req = bc_vm_growSize(BC_MAX(rdx, BC_NUM_RDX_VAL(a)), len >> 1);
3592
3593         BC_SIG_LOCK;
3594
3595         // Unlike the binary operators, this function is the only single parameter
3596         // function and is expected to initialize the result. This means that it
3597         // expects that b is *NOT* preallocated. We allocate it here.
3598         bc_num_init(b, bc_vm_growSize(req, 1));
3599
3600         BC_SIG_UNLOCK;
3601
3602         assert(a != NULL && b != NULL && a != b);
3603         assert(a->num != NULL && b->num != NULL);
3604
3605         // Easy case.
3606         if (BC_NUM_ZERO(a)) {
3607                 bc_num_setToZero(b, scale);
3608                 return;
3609         }
3610
3611         // Another easy case.
3612         if (BC_NUM_ONE(a)) {
3613                 bc_num_one(b);
3614                 bc_num_extend(b, scale);
3615                 return;
3616         }
3617
3618         // Set the parameters again.
3619         rdx = BC_NUM_RDX(scale);
3620         rdx = BC_MAX(rdx, BC_NUM_RDX_VAL(a));
3621         len = bc_vm_growSize(a->len, rdx);
3622
3623         BC_SIG_LOCK;
3624
3625         bc_num_init(&num1, len);
3626         bc_num_init(&num2, len);
3627         bc_num_setup(&half, half_digs, sizeof(half_digs) / sizeof(BcDig));
3628
3629         // There is a division by two in the formula. We setup a number that's 1/2
3630         // so that we can use multiplication instead of heavy division.
3631         bc_num_one(&half);
3632         half.num[0] = BC_BASE_POW / 2;
3633         half.len = 1;
3634         BC_NUM_RDX_SET_NP(half, 1);
3635         half.scale = 1;
3636
3637         bc_num_init(&f, len);
3638         bc_num_init(&fprime, len);
3639
3640         BC_SETJMP_LOCKED(err);
3641
3642         BC_SIG_UNLOCK;
3643
3644         // Pointers for easy switching.
3645         x0 = &num1;
3646         x1 = &num2;
3647
3648         // Start with 1.
3649         bc_num_one(x0);
3650
3651         // The power of the operand is needed for the estimate.
3652         pow = bc_num_intDigits(a);
3653
3654         // The code in this if statement calculates the initial estimate. First, if
3655         // a is less than 0, then 0 is a good estimate. Otherwise, we want something
3656         // in the same ballpark. That ballpark is pow.
3657         if (pow) {
3658
3659                 // An odd number is served by starting with 2^((pow-1)/2), and an even
3660                 // number is served by starting with 6^((pow-2)/2). Why? Because math.
3661                 if (pow & 1) x0->num[0] = 2;
3662                 else x0->num[0] = 6;
3663
3664                 pow -= 2 - (pow & 1);
3665                 bc_num_shiftLeft(x0, pow / 2);
3666         }
3667
3668         // I can set the rdx here directly because neg should be false.
3669         x0->scale = x0->rdx = 0;
3670         resscale = (scale + BC_BASE_DIGS) + 2;
3671
3672         // This is the calculation loop. This compare goes to 0 eventually as the
3673         // difference between the two numbers gets smaller than resscale.
3674         while (bc_num_cmp(x1, x0)) {
3675
3676                 assert(BC_NUM_NONZERO(x0));
3677
3678                 // This loop directly corresponds to the iteration in Newton's method.
3679                 // If you know the formula, this loop makes sense. Go study the formula.
3680
3681                 bc_num_div(a, x0, &f, resscale);
3682                 bc_num_add(x0, &f, &fprime, resscale);
3683
3684                 assert(BC_NUM_RDX_VALID_NP(fprime));
3685                 assert(BC_NUM_RDX_VALID_NP(half));
3686
3687                 bc_num_mul(&fprime, &half, x1, resscale);
3688
3689                 // Switch.
3690                 temp = x0;
3691                 x0 = x1;
3692                 x1 = temp;
3693         }
3694
3695         // Copy to the result and truncate.
3696         bc_num_copy(b, x0);
3697         if (b->scale > scale) bc_num_truncate(b, b->scale - scale);
3698
3699         assert(!BC_NUM_NEG(b) || BC_NUM_NONZERO(b));
3700         assert(BC_NUM_RDX_VALID(b));
3701         assert(BC_NUM_RDX_VAL(b) <= b->len || !b->len);
3702         assert(!b->len || b->num[b->len - 1] || BC_NUM_RDX_VAL(b) == b->len);
3703
3704 err:
3705         BC_SIG_MAYLOCK;
3706         bc_num_free(&fprime);
3707         bc_num_free(&f);
3708         bc_num_free(&num2);
3709         bc_num_free(&num1);
3710         BC_LONGJMP_CONT;
3711 }
3712
3713 void bc_num_divmod(BcNum *a, BcNum *b, BcNum *c, BcNum *d, size_t scale) {
3714
3715         size_t ts, len;
3716         BcNum *ptr_a, num2;
3717         bool init = false;
3718
3719         // The bulk of this function is just doing what bc_num_binary() does for the
3720         // binary operators. However, it assumes that only c and a can be equal.
3721
3722         // Set up the parameters.
3723         ts = BC_MAX(scale + b->scale, a->scale);
3724         len = bc_num_mulReq(a, b, ts);
3725
3726         assert(a != NULL && b != NULL && c != NULL && d != NULL);
3727         assert(c != d && a != d && b != d && b != c);
3728
3729         // Initialize or expand as necessary.
3730         if (c == a) {
3731
3732                 memcpy(&num2, c, sizeof(BcNum));
3733                 ptr_a = &num2;
3734
3735                 BC_SIG_LOCK;
3736
3737                 bc_num_init(c, len);
3738
3739                 init = true;
3740
3741                 BC_SETJMP_LOCKED(err);
3742
3743                 BC_SIG_UNLOCK;
3744         }
3745         else {
3746                 ptr_a = a;
3747                 bc_num_expand(c, len);
3748         }
3749
3750         // Do the quick version if possible.
3751         if (BC_NUM_NONZERO(a) && !BC_NUM_RDX_VAL(a) &&
3752             !BC_NUM_RDX_VAL(b) && b->len == 1 && !scale)
3753         {
3754                 BcBigDig rem;
3755
3756                 bc_num_divArray(ptr_a, (BcBigDig) b->num[0], c, &rem);
3757
3758                 assert(rem < BC_BASE_POW);
3759
3760                 d->num[0] = (BcDig) rem;
3761                 d->len = (rem != 0);
3762         }
3763         // Do the slow method.
3764         else bc_num_r(ptr_a, b, c, d, scale, ts);
3765
3766         assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c));
3767         assert(BC_NUM_RDX_VALID(c));
3768         assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len);
3769         assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len);
3770         assert(!BC_NUM_NEG(d) || BC_NUM_NONZERO(d));
3771         assert(BC_NUM_RDX_VALID(d));
3772         assert(BC_NUM_RDX_VAL(d) <= d->len || !d->len);
3773         assert(!d->len || d->num[d->len - 1] || BC_NUM_RDX_VAL(d) == d->len);
3774
3775 err:
3776         // Only cleanup if we initialized.
3777         if (init) {
3778                 BC_SIG_MAYLOCK;
3779                 bc_num_free(&num2);
3780                 BC_LONGJMP_CONT;
3781         }
3782 }
3783
3784 void bc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d) {
3785
3786         BcNum base, exp, two, temp, atemp, btemp, ctemp;
3787         BcDig two_digs[2];
3788
3789         assert(a != NULL && b != NULL && c != NULL && d != NULL);
3790         assert(a != d && b != d && c != d);
3791
3792         if (BC_ERR(BC_NUM_ZERO(c))) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO);
3793
3794         if (BC_ERR(BC_NUM_NEG(b))) bc_err(BC_ERR_MATH_NEGATIVE);
3795
3796 #ifndef NDEBUG
3797         // This is entirely for quieting a useless scan-build error.
3798         btemp.len = 0;
3799         ctemp.len = 0;
3800 #endif // NDEBUG
3801
3802         // Eliminate fractional parts that are zero or error if they are not zero.
3803         if (BC_ERR(bc_num_nonInt(a, &atemp) || bc_num_nonInt(b, &btemp) ||
3804                    bc_num_nonInt(c, &ctemp)))
3805         {
3806                 bc_err(BC_ERR_MATH_NON_INTEGER);
3807         }
3808
3809         bc_num_expand(d, ctemp.len);
3810
3811         BC_SIG_LOCK;
3812
3813         bc_num_init(&base, ctemp.len);
3814         bc_num_setup(&two, two_digs, sizeof(two_digs) / sizeof(BcDig));
3815         bc_num_init(&temp, btemp.len + 1);
3816         bc_num_createCopy(&exp, &btemp);
3817
3818         BC_SETJMP_LOCKED(err);
3819
3820         BC_SIG_UNLOCK;
3821
3822         bc_num_one(&two);
3823         two.num[0] = 2;
3824         bc_num_one(d);
3825
3826         // We already checked for 0.
3827         bc_num_rem(&atemp, &ctemp, &base, 0);
3828
3829         // If you know the algorithm I used, the memory-efficient method, then this
3830         // loop should be self-explanatory because it is the calculation loop.
3831         while (BC_NUM_NONZERO(&exp)) {
3832
3833                 // Num two cannot be 0, so no errors.
3834                 bc_num_divmod(&exp, &two, &exp, &temp, 0);
3835
3836                 if (BC_NUM_ONE(&temp) && !BC_NUM_NEG_NP(temp)) {
3837
3838                         assert(BC_NUM_RDX_VALID(d));
3839                         assert(BC_NUM_RDX_VALID_NP(base));
3840
3841                         bc_num_mul(d, &base, &temp, 0);
3842
3843                         // We already checked for 0.
3844                         bc_num_rem(&temp, &ctemp, d, 0);
3845                 }
3846
3847                 assert(BC_NUM_RDX_VALID_NP(base));
3848
3849                 bc_num_mul(&base, &base, &temp, 0);
3850
3851                 // We already checked for 0.
3852                 bc_num_rem(&temp, &ctemp, &base, 0);
3853         }
3854
3855 err:
3856         BC_SIG_MAYLOCK;
3857         bc_num_free(&exp);
3858         bc_num_free(&temp);
3859         bc_num_free(&base);
3860         BC_LONGJMP_CONT;
3861         assert(!BC_NUM_NEG(d) || d->len);
3862         assert(BC_NUM_RDX_VALID(d));
3863         assert(!d->len || d->num[d->len - 1] || BC_NUM_RDX_VAL(d) == d->len);
3864 }
3865
3866 #if BC_DEBUG_CODE
3867 void bc_num_printDebug(const BcNum *n, const char *name, bool emptyline) {
3868         bc_file_puts(&vm.fout, bc_flush_none, name);
3869         bc_file_puts(&vm.fout, bc_flush_none, ": ");
3870         bc_num_printDecimal(n, true);
3871         bc_file_putchar(&vm.fout, bc_flush_err, '\n');
3872         if (emptyline) bc_file_putchar(&vm.fout, bc_flush_err, '\n');
3873         vm.nchars = 0;
3874 }
3875
3876 void bc_num_printDigs(const BcDig *n, size_t len, bool emptyline) {
3877
3878         size_t i;
3879
3880         for (i = len - 1; i < len; --i)
3881                 bc_file_printf(&vm.fout, " %lu", (unsigned long) n[i]);
3882
3883         bc_file_putchar(&vm.fout, bc_flush_err, '\n');
3884         if (emptyline) bc_file_putchar(&vm.fout, bc_flush_err, '\n');
3885         vm.nchars = 0;
3886 }
3887
3888 void bc_num_printWithDigs(const BcNum *n, const char *name, bool emptyline) {
3889         bc_file_puts(&vm.fout, bc_flush_none, name);
3890         bc_file_printf(&vm.fout, " len: %zu, rdx: %zu, scale: %zu\n",
3891                        name, n->len, BC_NUM_RDX_VAL(n), n->scale);
3892         bc_num_printDigs(n->num, n->len, emptyline);
3893 }
3894
3895 void bc_num_dump(const char *varname, const BcNum *n) {
3896
3897         ulong i, scale = n->scale;
3898
3899         bc_file_printf(&vm.ferr, "\n%s = %s", varname,
3900                        n->len ? (BC_NUM_NEG(n) ? "-" : "+") : "0 ");
3901
3902         for (i = n->len - 1; i < n->len; --i) {
3903
3904                 if (i + 1 == BC_NUM_RDX_VAL(n))
3905                         bc_file_puts(&vm.ferr, bc_flush_none, ". ");
3906
3907                 if (scale / BC_BASE_DIGS != BC_NUM_RDX_VAL(n) - i - 1)
3908                         bc_file_printf(&vm.ferr, "%lu ", (unsigned long) n->num[i]);
3909                 else {
3910
3911                         int mod = scale % BC_BASE_DIGS;
3912                         int d = BC_BASE_DIGS - mod;
3913                         BcDig div;
3914
3915                         if (mod != 0) {
3916                                 div = n->num[i] / ((BcDig) bc_num_pow10[(ulong) d]);
3917                                 bc_file_printf(&vm.ferr, "%lu", (unsigned long) div);
3918                         }
3919
3920                         div = n->num[i] % ((BcDig) bc_num_pow10[(ulong) d]);
3921                         bc_file_printf(&vm.ferr, " ' %lu ", (unsigned long) div);
3922                 }
3923         }
3924
3925         bc_file_printf(&vm.ferr, "(%zu | %zu.%zu / %zu) %lu\n",
3926                        n->scale, n->len, BC_NUM_RDX_VAL(n), n->cap,
3927                        (unsigned long) (void*) n->num);
3928
3929         bc_file_flush(&vm.ferr, bc_flush_err);
3930 }
3931 #endif // BC_DEBUG_CODE