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