zor.c - libzahl - big integer library
(HTM) git clone git://git.suckless.org/libzahl
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
zor.c (878B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include "internals.h"
3
4
5 void
6 zor(z_t a, z_t b, z_t c)
7 {
8 size_t n, m;
9
10 if (unlikely(zzero(b))) {
11 SET(a, c);
12 return;
13 } else if (unlikely(zzero(c))) {
14 SET(a, b);
15 return;
16 }
17
18 MIN_MAX_1(n, m, b->used, c->used);
19 ENSURE_SIZE(a, m);
20
21 if (a == b) {
22 ZMEM_2OP_PRECISE(a->chars, a->chars, c->chars, n, |);
23 if (a->used < c->used)
24 zmemcpy_range(a->chars, c->chars, n, m);
25 } else if (unlikely(a == c)) {
26 ZMEM_2OP_PRECISE(a->chars, a->chars, b->chars, n, |);
27 if (a->used < b->used)
28 zmemcpy_range(a->chars, b->chars, n, m);
29 } else if (m == b->used) {
30 ZMEM_2OP(a->chars, c->chars, b->chars, n, |);
31 zmemcpy_range(a->chars, b->chars, n, m);
32 } else {
33 ZMEM_2OP(a->chars, b->chars, c->chars, n, |);
34 zmemcpy_range(a->chars, c->chars, n, m);
35 }
36
37 a->used = m;
38 SET_SIGNUM(a, zpositive2(b, c) * 2 - 1);
39 }