summaryrefslogtreecommitdiffstats
path: root/libtommath/bn_mp_decr.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2019-06-13 21:28:11 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2019-06-13 21:28:11 (GMT)
commitdb7fa65dce753b80d5f2a87799aabd481e9144a2 (patch)
tree40a8affd6eb84a709b158e4c1f5e4117e9f18171 /libtommath/bn_mp_decr.c
parent233d558b1e7e820960a3db26cd2aedcf036ead9e (diff)
parent505f963287b050bd46871d4659cebc65986ca5ac (diff)
downloadtcl-db7fa65dce753b80d5f2a87799aabd481e9144a2.zip
tcl-db7fa65dce753b80d5f2a87799aabd481e9144a2.tar.gz
tcl-db7fa65dce753b80d5f2a87799aabd481e9144a2.tar.bz2
Merge libtommath
Diffstat (limited to 'libtommath/bn_mp_decr.c')
-rw-r--r--libtommath/bn_mp_decr.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libtommath/bn_mp_decr.c b/libtommath/bn_mp_decr.c
new file mode 100644
index 0000000..c6a1572
--- /dev/null
+++ b/libtommath/bn_mp_decr.c
@@ -0,0 +1,34 @@
+#include "tommath_private.h"
+#ifdef BN_MP_DECR_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
+
+/* Decrement "a" by one like "a--". Changes input! */
+mp_err mp_decr(mp_int *a)
+{
+ if (MP_IS_ZERO(a)) {
+ mp_set(a,1uL);
+ a->sign = MP_NEG;
+ return MP_OKAY;
+ } else if (a->sign == MP_NEG) {
+ mp_err err;
+ a->sign = MP_ZPOS;
+ if ((err = mp_incr(a)) != MP_OKAY) {
+ return err;
+ }
+ /* There is no -0 in LTM */
+ if (!MP_IS_ZERO(a)) {
+ a->sign = MP_NEG;
+ }
+ return MP_OKAY;
+ } else if (a->dp[0] > 1uL) {
+ a->dp[0]--;
+ if (a->dp[0] == 0u) {
+ mp_zero(a);
+ }
+ return MP_OKAY;
+ } else {
+ return mp_sub_d(a, 1uL,a);
+ }
+}
+#endif