summaryrefslogtreecommitdiffstats
path: root/mpi
diff options
context:
space:
mode:
Diffstat (limited to 'mpi')
-rw-r--r--mpi/mpi.c31
-rw-r--r--mpi/mpi.h3
2 files changed, 34 insertions, 0 deletions
diff --git a/mpi/mpi.c b/mpi/mpi.c
index ff11f2e2..2097b574 100644
--- a/mpi/mpi.c
+++ b/mpi/mpi.c
@@ -469,6 +469,37 @@ mp_err mp_get_intptr(mp_int *mp, int_ptr_t *z)
return MP_OKAY;
}
+int mp_in_range(mp_int *mp, uint_ptr_t lim, int unsig)
+{
+ const int ptrnd = (SIZEOF_PTR + MP_DIGIT_BIT - 1) / MP_DIGIT_BIT;
+ mp_size nd = USED(mp);
+
+ if (unsig && ISNEG(mp))
+ return 0;
+
+ if (nd < ptrnd)
+ return 1;
+
+ if (nd > ptrnd)
+ return 0;
+
+ {
+ mp_digit top = DIGITS(mp)[ptrnd - 1];
+ lim >>= ((ptrnd - 1) * MP_DIGIT_BIT);
+ return top <= lim;
+ }
+}
+
+int mp_in_intptr_range(mp_int *mp)
+{
+ return mp_in_range(mp, INT_PTR_MAX, 0);
+}
+
+int mp_in_uintptr_range(mp_int *mp)
+{
+ return mp_in_range(mp, UINT_PTR_MAX, 1);
+}
+
#ifdef HAVE_DOUBLE_INTPTR_T
mp_err mp_set_double_intptr(mp_int *mp, double_intptr_t z)
{
diff --git a/mpi/mpi.h b/mpi/mpi.h
index 28fadb31..71e08055 100644
--- a/mpi/mpi.h
+++ b/mpi/mpi.h
@@ -85,6 +85,9 @@ mp_err mp_set_uintptr(mp_int *mp, uint_ptr_t z);
mp_err mp_set_intptr(mp_int *mp, int_ptr_t z);
mp_err mp_get_uintptr(mp_int *mp, uint_ptr_t *z);
mp_err mp_get_intptr(mp_int *mp, int_ptr_t *z);
+int mp_in_range(mp_int *mp, uint_ptr_t lim, int unsig);
+int mp_in_intptr_range(mp_int *mp);
+int mp_in_uintptr_range(mp_int *mp);
#ifdef HAVE_DOUBLE_INTPTR_T
mp_err mp_set_double_intptr(mp_int *mp, double_intptr_t z);
#endif