diff options
author | markm <markm@FreeBSD.org> | 1995-11-12 14:40:41 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 1995-11-12 14:40:41 +0000 |
commit | d938bb78837327b46dc34873a6eb60c002605808 (patch) | |
tree | d720c213b0c2f268c17d14276e809e876bd37dc8 /gnu/lib/libgmp/mpz_inp_str.c | |
parent | 7e662b2efdf7b11bed05bdd944746d7b7d0e56af (diff) | |
download | FreeBSD-src-d938bb78837327b46dc34873a6eb60c002605808.zip FreeBSD-src-d938bb78837327b46dc34873a6eb60c002605808.tar.gz |
GNU MP (Multiprecision) library. This is needed by secure RPC (being
done by Bill Paul) and various other BSD programs.
Obtained from:FSF
Diffstat (limited to 'gnu/lib/libgmp/mpz_inp_str.c')
-rw-r--r-- | gnu/lib/libgmp/mpz_inp_str.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/gnu/lib/libgmp/mpz_inp_str.c b/gnu/lib/libgmp/mpz_inp_str.c new file mode 100644 index 0000000..a775996 --- /dev/null +++ b/gnu/lib/libgmp/mpz_inp_str.c @@ -0,0 +1,105 @@ +/* mpz_inp_str(dest_integer, stream, base) -- Input a number in base + BASE from stdio stream STREAM and store the result in DEST_INTEGER. + +Copyright (C) 1991, 1993 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +The GNU MP Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with the GNU MP Library; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include <stdio.h> +#include <ctype.h> +#include "gmp.h" +#include "gmp-impl.h" + +static int +char_ok_for_base (c, base) + int c; + int base; +{ + if (isdigit (c)) + return (unsigned) c - '0' < base; + if (islower (c)) + return (unsigned) c - 'a' + 10 < base; + if (isupper (c)) + return (unsigned) c - 'A' + 10 < base; + + return 0; +} + +void +#ifdef __STDC__ +mpz_inp_str (MP_INT *dest, FILE *stream, int base) +#else +mpz_inp_str (dest, stream, base) + MP_INT *dest; + FILE *stream; + int base; +#endif +{ + char *str; + size_t str_size; + size_t i; + int c; + int negative = 0; + + str_size = 100; + str = (char *) (*_mp_allocate_func) (str_size); + + c = getc (stream); + if (c == '-') + { + negative = 1; + c = getc (stream); + } + + /* If BASE is 0, try to find out the base by looking at the initial + characters. */ + if (base == 0) + { + base = 10; + if (c == '0') + { + base = 8; + c = getc (stream); + if (c == 'x' || c == 'X') + { + base = 16; + c = getc (stream); + } + } + } + + for (i = 0; char_ok_for_base (c, base); i++) + { + if (i >= str_size) + { + size_t old_str_size = str_size; + str_size = str_size * 3 / 2; + str = (char *) (*_mp_reallocate_func) (str, old_str_size, str_size); + } + str[i] = c; + c = getc (stream); + } + + ungetc (c, stream); + + str[i] = 0; + _mpz_set_str (dest, str, base); + if (negative) + dest->size = -dest->size; + + (*_mp_free_func) (str, str_size); +} |