summaryrefslogtreecommitdiff
path: root/mpz/inp_str.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>1998-05-05 01:42:25 +0200
committertege <tege@gmplib.org>1998-05-05 01:42:25 +0200
commit97d408ae1a81e3fa59f21e5254cea715cf2a0bad (patch)
tree8ceef9b9e287bdc1f0e4155fad59c63253ef4460 /mpz/inp_str.c
parent160c3627928a9f81667f44078692590c0fd315ca (diff)
downloadgmp-97d408ae1a81e3fa59f21e5254cea715cf2a0bad.tar.gz
Update from set_str.c.
Diffstat (limited to 'mpz/inp_str.c')
-rw-r--r--mpz/inp_str.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/mpz/inp_str.c b/mpz/inp_str.c
index 715906237..76b867f4e 100644
--- a/mpz/inp_str.c
+++ b/mpz/inp_str.c
@@ -48,10 +48,10 @@ digit_value_in_base (c, base)
size_t
#if __STDC__
-mpz_inp_str (mpz_ptr dest, FILE *stream, int base)
+mpz_inp_str (mpz_ptr x, FILE *stream, int base)
#else
-mpz_inp_str (dest, stream, base)
- mpz_ptr dest;
+mpz_inp_str (x, stream, base)
+ mpz_ptr x;
FILE *stream;
int base;
#endif
@@ -60,7 +60,7 @@ mpz_inp_str (dest, stream, base)
size_t alloc_size, str_size;
int c;
int negative;
- mp_size_t dest_size;
+ mp_size_t xsize;
size_t nread;
if (stream == 0)
@@ -84,6 +84,7 @@ mpz_inp_str (dest, stream, base)
{
negative = 1;
c = getc (stream);
+ nread++;
}
if (digit_value_in_base (c, base == 0 ? 10 : base) < 0)
@@ -105,9 +106,22 @@ mpz_inp_str (dest, stream, base)
c = getc (stream);
nread++;
}
+ else if (c == 'b' || c == 'B')
+ {
+ base = 2;
+ c = getc (stream);
+ nread++;
+ }
}
}
+ /* Skip leading zeros. */
+ while (c == '0')
+ {
+ c = getc (stream);
+ nread++;
+ }
+
for (;;)
{
int dig;
@@ -126,12 +140,21 @@ mpz_inp_str (dest, stream, base)
ungetc (c, stream);
- dest_size = str_size / __mp_bases[base].chars_per_limb + 1;
- if (dest->_mp_alloc < dest_size)
- _mpz_realloc (dest, dest_size);
+ /* Make sure the string is not empty, mpn_set_str would fail. */
+ if (str_size == 0)
+ {
+ x->_mp_size = 0;
+ return nread;
+ }
+
+ xsize = (((mp_size_t) (str_size / __mp_bases[base].chars_per_bit_exactly))
+ / BITS_PER_MP_LIMB + 2);
+ if (x->_mp_alloc < xsize)
+ _mpz_realloc (x, xsize);
- dest_size = mpn_set_str (dest->_mp_d, (unsigned char *) str, str_size, base);
- dest->_mp_size = negative ? -dest_size : dest_size;
+ /* Convert the byte array in base BASE to our bignum format. */
+ xsize = mpn_set_str (x->_mp_d, (unsigned char *) str, str_size, base);
+ x->_mp_size = negative ? -xsize : xsize;
(*_mp_free_func) (str, alloc_size);
return str_size + nread;