1#include <tommath.h>
2#ifdef BN_MP_FREAD_C
3/* LibTomMath, multiple-precision integer library -- Tom St Denis
4 *
5 * LibTomMath is a library that provides multiple-precision
6 * integer arithmetic as well as number theoretic functionality.
7 *
8 * The library was designed directly after the MPI library by
9 * Michael Fromberger but has been written from scratch with
10 * additional optimizations in place.
11 *
12 * The library is free for all purposes without any express
13 * guarantee it works.
14 *
15 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
16 */
17
18/* read a bigint from a file stream in ASCII */
19int mp_fread(mp_int *a, int radix, FILE *stream)
20{
21   int err, ch, neg, y;
22
23   /* clear a */
24   mp_zero(a);
25
26   /* if first digit is - then set negative */
27   ch = fgetc(stream);
28   if (ch == '-') {
29      neg = MP_NEG;
30      ch = fgetc(stream);
31   } else {
32      neg = MP_ZPOS;
33   }
34
35   for (;;) {
36      /* find y in the radix map */
37      for (y = 0; y < radix; y++) {
38          if (mp_s_rmap[y] == ch) {
39             break;
40          }
41      }
42      if (y == radix) {
43         break;
44      }
45
46      /* shift up and add */
47      if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) {
48         return err;
49      }
50      if ((err = mp_add_d(a, y, a)) != MP_OKAY) {
51         return err;
52      }
53
54      ch = fgetc(stream);
55   }
56   if (mp_cmp_d(a, 0) != MP_EQ) {
57      a->sign = neg;
58   }
59
60   return MP_OKAY;
61}
62
63#endif
64
65/* $Source$ */
66/* $Revision$ */
67/* $Date$ */
68