Line data Source code
1 : #include "tommath_private.h" 2 : #ifdef BN_MP_FREAD_C 3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */ 4 : /* SPDX-License-Identifier: Unlicense */ 5 : 6 : #ifndef MP_NO_FILE 7 : /* read a bigint from a file stream in ASCII */ 8 0 : mp_err mp_fread(mp_int *a, int radix, FILE *stream) 9 : { 10 0 : mp_err err; 11 0 : mp_sign neg; 12 : 13 : /* if first digit is - then set negative */ 14 0 : int ch = fgetc(stream); 15 0 : if (ch == (int)'-') { 16 0 : neg = MP_NEG; 17 0 : ch = fgetc(stream); 18 : } else { 19 0 : neg = MP_ZPOS; 20 : } 21 : 22 : /* no digits, return error */ 23 0 : if (ch == EOF) { 24 0 : return MP_ERR; 25 : } 26 : 27 : /* clear a */ 28 0 : mp_zero(a); 29 : 30 0 : do { 31 0 : int y; 32 0 : unsigned pos = (unsigned)(ch - (int)'('); 33 0 : if (mp_s_rmap_reverse_sz < pos) { 34 0 : break; 35 : } 36 : 37 0 : y = (int)mp_s_rmap_reverse[pos]; 38 : 39 0 : if ((y == 0xff) || (y >= radix)) { 40 : break; 41 : } 42 : 43 : /* shift up and add */ 44 0 : if ((err = mp_mul_d(a, (mp_digit)radix, a)) != MP_OKAY) { 45 0 : return err; 46 : } 47 0 : if ((err = mp_add_d(a, (mp_digit)y, a)) != MP_OKAY) { 48 0 : return err; 49 : } 50 0 : } while ((ch = fgetc(stream)) != EOF); 51 : 52 0 : if (a->used != 0) { 53 0 : a->sign = neg; 54 : } 55 : 56 0 : return MP_OKAY; 57 : } 58 : #endif 59 : 60 : #endif