X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=gmp%2Fmpf%2Fout_str.c;fp=gmp%2Fmpf%2Fout_str.c;h=afccdbb031a302f354538112e00f409ca6033d95;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/gmp/mpf/out_str.c b/gmp/mpf/out_str.c new file mode 100644 index 00000000..afccdbb0 --- /dev/null +++ b/gmp/mpf/out_str.c @@ -0,0 +1,105 @@ +/* mpf_out_str (stream, base, n_digits, op) -- Print N_DIGITS digits from + the float OP to STREAM in base BASE. Return the number of characters + written, or 0 if an error occurred. + +Copyright 1996, 1997, 2001, 2002, 2005 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 Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ + +#define _GNU_SOURCE /* for DECIMAL_POINT in langinfo.h */ + +#include "config.h" + +#include +#include + +#if HAVE_LANGINFO_H +#include /* for nl_langinfo */ +#endif + +#if HAVE_LOCALE_H +#include /* for localeconv */ +#endif + +#include "gmp.h" +#include "gmp-impl.h" + + +size_t +mpf_out_str (FILE *stream, int base, size_t n_digits, mpf_srcptr op) +{ + char *str; + mp_exp_t exp; + size_t written; + TMP_DECL; + + TMP_MARK; + + if (base == 0) + base = 10; + if (n_digits == 0) + MPF_SIGNIFICANT_DIGITS (n_digits, base, op->_mp_prec); + + if (stream == 0) + stream = stdout; + + /* Consider these changes: + * Don't allocate memory here for huge n_digits; pass NULL to mpf_get_str. + * Make mpf_get_str allocate extra space when passed NULL, to avoid + allocating two huge string buffers. + * Implement more/other allocation reductions tricks. */ + + str = (char *) TMP_ALLOC (n_digits + 2); /* extra for minus sign and \0 */ + + mpf_get_str (str, &exp, base, n_digits, op); + n_digits = strlen (str); + + written = 0; + + /* Write sign */ + if (str[0] == '-') + { + str++; + fputc ('-', stream); + written = 1; + n_digits--; + } + + { + const char *point = GMP_DECIMAL_POINT; + size_t pointlen = strlen (point); + putc ('0', stream); + fwrite (point, 1, pointlen, stream); + written += pointlen + 1; + } + + /* Write mantissa */ + { + size_t fwret; + fwret = fwrite (str, 1, n_digits, stream); + written += fwret; + } + + /* Write exponent */ + { + int fpret; + fpret = fprintf (stream, (base <= 10 ? "e%ld" : "@%ld"), exp); + written += fpret; + } + + TMP_FREE; + return ferror (stream) ? 0 : written; +}