summaryrefslogtreecommitdiffhomepage
path: root/libtommath/bn_mp_fread.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtommath/bn_mp_fread.c')
-rw-r--r--libtommath/bn_mp_fread.c79
1 files changed, 35 insertions, 44 deletions
diff --git a/libtommath/bn_mp_fread.c b/libtommath/bn_mp_fread.c
index 140721b..52ea773 100644
--- a/libtommath/bn_mp_fread.c
+++ b/libtommath/bn_mp_fread.c
@@ -1,69 +1,60 @@
-#include <tommath_private.h>
+#include "tommath_private.h"
#ifdef BN_MP_FREAD_C
-/* LibTomMath, multiple-precision integer library -- Tom St Denis
- *
- * LibTomMath is a library that provides multiple-precision
- * integer arithmetic as well as number theoretic functionality.
- *
- * The library was designed directly after the MPI library by
- * Michael Fromberger but has been written from scratch with
- * additional optimizations in place.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, tstdenis82@gmail.com, http://libtom.org
- */
+/* LibTomMath, multiple-precision integer library -- Tom St Denis */
+/* SPDX-License-Identifier: Unlicense */
-#ifndef LTM_NO_FILE
+#ifndef MP_NO_FILE
/* read a bigint from a file stream in ASCII */
-int mp_fread(mp_int *a, int radix, FILE *stream)
+mp_err mp_fread(mp_int *a, int radix, FILE *stream)
{
- int err, ch, neg, y;
-
- /* clear a */
- mp_zero(a);
-
+ mp_err err;
+ mp_sign neg;
+
/* if first digit is - then set negative */
- ch = fgetc(stream);
- if (ch == '-') {
+ int ch = fgetc(stream);
+ if (ch == (int)'-') {
neg = MP_NEG;
ch = fgetc(stream);
} else {
neg = MP_ZPOS;
}
-
- for (;;) {
- /* find y in the radix map */
- for (y = 0; y < radix; y++) {
- if (mp_s_rmap[y] == ch) {
- break;
- }
+
+ /* no digits, return error */
+ if (ch == EOF) {
+ return MP_ERR;
+ }
+
+ /* clear a */
+ mp_zero(a);
+
+ do {
+ int y;
+ unsigned pos = (unsigned)(ch - (int)'(');
+ if (mp_s_rmap_reverse_sz < pos) {
+ break;
}
- if (y == radix) {
+
+ y = (int)mp_s_rmap_reverse[pos];
+
+ if ((y == 0xff) || (y >= radix)) {
break;
}
-
+
/* shift up and add */
- if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) {
+ if ((err = mp_mul_d(a, (mp_digit)radix, a)) != MP_OKAY) {
return err;
}
- if ((err = mp_add_d(a, y, a)) != MP_OKAY) {
+ if ((err = mp_add_d(a, (mp_digit)y, a)) != MP_OKAY) {
return err;
}
-
- ch = fgetc(stream);
- }
- if (mp_cmp_d(a, 0) != MP_EQ) {
+ } while ((ch = fgetc(stream)) != EOF);
+
+ if (a->used != 0) {
a->sign = neg;
}
-
+
return MP_OKAY;
}
#endif
#endif
-
-/* ref: $Format:%D$ */
-/* git commit: $Format:%H$ */
-/* commit time: $Format:%ai$ */