bn_mp_fread.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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://math.libtomcrypt.com
  16. */
  17. /* read a bigint from a file stream in ASCII */
  18. int mp_fread(mp_int *a, int radix, FILE *stream)
  19. {
  20. int err, ch, neg, y;
  21. /* clear a */
  22. mp_zero(a);
  23. /* if first digit is - then set negative */
  24. ch = fgetc(stream);
  25. if (ch == '-') {
  26. neg = MP_NEG;
  27. ch = fgetc(stream);
  28. } else {
  29. neg = MP_ZPOS;
  30. }
  31. for (;;) {
  32. /* find y in the radix map */
  33. for (y = 0; y < radix; y++) {
  34. if (mp_s_rmap[y] == ch) {
  35. break;
  36. }
  37. }
  38. if (y == radix) {
  39. break;
  40. }
  41. /* shift up and add */
  42. if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) {
  43. return err;
  44. }
  45. if ((err = mp_add_d(a, y, a)) != MP_OKAY) {
  46. return err;
  47. }
  48. ch = fgetc(stream);
  49. }
  50. if (mp_cmp_d(a, 0) != MP_EQ) {
  51. a->sign = neg;
  52. }
  53. return MP_OKAY;
  54. }
  55. #endif
  56. /* $Source: /cvs/libtom/libtommath/bn_mp_fread.c,v $ */
  57. /* $Revision: 1.3 $ */
  58. /* $Date: 2006/03/31 14:18:44 $ */