summaryrefslogtreecommitdiff
path: root/src/libbiguint/bu_subc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libbiguint/bu_subc.c')
-rw-r--r--src/libbiguint/bu_subc.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/libbiguint/bu_subc.c b/src/libbiguint/bu_subc.c
new file mode 100644
index 0000000..c26adca
--- /dev/null
+++ b/src/libbiguint/bu_subc.c
@@ -0,0 +1,22 @@
+/* ISC license. */
+
+/* OpenBSD needs that for EOVERFLOW. wtfbsdseriously */
+#define _BSD_SOURCE
+
+#include <errno.h>
+#include <skalibs/uint32.h>
+#include <skalibs/biguint.h>
+
+int bu_subc (uint32 *c, unsigned int cn, uint32 const *a, unsigned int an, uint32 const *b, unsigned int bn, register int carry)
+{
+ register unsigned int i = 0 ;
+ for (; i < cn ; i++)
+ {
+ register uint32 ai = (i < an) ? a[i] : 0 ;
+ register uint32 bi = (i < bn) ? b[i] : 0 ;
+ register uint32 ci = ai - bi - carry ;
+ carry = (carry || bi) && (ci > ai) ;
+ c[i] = ci ;
+ }
+ return carry ? (errno = EOVERFLOW, 0) : 1 ;
+}