diff options
Diffstat (limited to 'contrib/libio/outfloat.c')
-rw-r--r-- | contrib/libio/outfloat.c | 211 |
1 files changed, 0 insertions, 211 deletions
diff --git a/contrib/libio/outfloat.c b/contrib/libio/outfloat.c deleted file mode 100644 index 5cbb6c925982..000000000000 --- a/contrib/libio/outfloat.c +++ /dev/null @@ -1,211 +0,0 @@ -/* -Copyright (C) 1993 Free Software Foundation - -This file is part of the GNU IO Library. This 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. - -This 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 this library; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#include "libioP.h" - -#ifdef _IO_USE_DTOA -/* Format floating-point number and print them. - Return number of chars printed, or EOF on error. - - sign_mode == '+' : print "-" or "+" - sign_mode == ' ' : print "-" or " " - sign_mode == '\0' : print "-' or "" -*/ - -int -_IO_outfloat (value, sb, type, width, precision, flags, sign_mode, fill) - double value; - _IO_FILE *sb; - int type; - int width; - int precision; - int flags; - int sign_mode; - int fill; -{ - int count = 0; -#define PUT(x) do {if (_IO_putc(x, sb) < 0) goto error; count++;} while (0) -#define PUTN(p, n) \ - do {int _n=n; count+=_n; if (_IO_sputn(sb, p,_n) != _n) goto error;} while(0) -#define PADN(fill, n) \ - do {int _n = n; count+=_n; if (_IO_padn(sb, fill, _n) != _n) goto error;} while (0) - int pad_kind = flags & (_IO_LEFT|_IO_RIGHT|_IO_INTERNAL); - int skip_zeroes = 0; - int show_dot = (flags & _IO_SHOWPOINT) != 0; - int decpt; - int sign; - int mode; - int exponent_size; - int print_sign; - int trailing_zeroes, useful_digits; - int padding, unpadded_width; - char *p; - char *exponent_start; - register int i; -#define EBUF_SIZE 12 -#define EBUF_END &ebuf[EBUF_SIZE] - char ebuf[EBUF_SIZE]; - char *end; - int exp = 0; - switch (type) - { - case 'f': - mode = 3; - break; - case 'e': - case 'E': - exp = type; - mode = 2; - if (precision != 999) - precision++; /* Add one to include digit before decimal point. */ - break; - case 'g': - case 'G': - exp = type == 'g' ? 'e' : 'E'; - if (precision == 0) precision = 1; - if (!(flags & _IO_SHOWPOINT)) - skip_zeroes = 1; - type = 'g'; - mode = 2; - break; - } - /* Do the actual convension */ - if (precision == 999 && mode != 3) - mode = 0; - p = _IO_dtoa(value, mode, precision, &decpt, &sign, &end); - useful_digits = end-p; - exponent_start = EBUF_END; - if (mode == 0) - precision = useful_digits; - /* Check if we need to emit an exponent. */ - if (mode != 3 && decpt != 9999) - { - i = decpt - 1; - if ((type != 'g' && type != 'F') || i < -4 || i >= precision) - { - /* Print the exponent into ebuf. - We write ebuf in reverse order (right-to-left). */ - char sign; - if (i >= 0) - sign = '+'; - else - sign = '-', i = -i; - /* Note: ANSI requires at least 2 exponent digits. */ - do { - *--exponent_start = (i % 10) + '0'; - i /= 10; - } while (i >= 10); - *--exponent_start = i + '0'; - *--exponent_start = sign; - *--exponent_start = exp; - } - } - exponent_size = EBUF_END - exponent_start; - if (mode == 1) - precision = 1; - /* If we print an exponent, always show just one digit before point. */ - if (exponent_size) - decpt = 1; - if (decpt == 9999) - { /* Infinity or NaN */ - decpt = useful_digits; - precision = 0; - show_dot = 0; - } - - /* dtoa truncates trailing zeroes. Set the variable trailing_zeroes to - the number of 0's we have to add (after the decimal point). */ - if (skip_zeroes) - trailing_zeroes = 0; - else if (type == 'f') - trailing_zeroes = useful_digits <= decpt ? precision - : precision-(useful_digits-decpt); - else if (exponent_size) /* 'e' 'E' or 'g' format using exponential notation*/ - trailing_zeroes = precision - useful_digits; - else /* 'g' format not using exponential notation. */ - trailing_zeroes = useful_digits <= decpt ? precision - decpt - : precision-useful_digits; - if (trailing_zeroes < 0) trailing_zeroes = 0; - - if (trailing_zeroes != 0 || useful_digits > decpt) - show_dot = 1; - if (sign_mode == 0) - print_sign = sign ? '-' : 0; - else if (sign_mode == '+') - print_sign = sign ? '-' : '+'; - else /* if (sign_mode == ' ') */ - print_sign = sign ? '-' : ' '; - - /* Calculate the width (before padding). */ - unpadded_width = - (print_sign != 0) + trailing_zeroes + exponent_size + show_dot - + useful_digits - + (decpt > useful_digits ? decpt - useful_digits - : decpt > 0 ? 0 : 1 - decpt); - - padding = width > unpadded_width ? width - unpadded_width : 0; - if (padding > 0 && pad_kind != _IO_LEFT && pad_kind != _IO_INTERNAL) - PADN(fill, padding); /* Default (right) adjust */ - if (print_sign) - PUT(print_sign); - if (pad_kind == _IO_INTERNAL && padding > 0) - PADN(fill, padding); - if (decpt > 0) - { - if (useful_digits >= decpt) - PUTN(p, decpt); - else - { - PUTN(p, useful_digits); - PADN('0', decpt-useful_digits); - } - if (show_dot) - { - PUT('.'); - /* Print digits after the decimal point. */ - if (useful_digits > decpt) - PUTN(p + decpt, useful_digits-decpt); - } - } - else - { - PUT('0'); - if (show_dot) - { - PUT('.'); - PADN('0', -decpt); - /* Print digits after the decimal point. */ - PUTN(p, useful_digits); - } - } - PADN('0', trailing_zeroes); - if (exponent_size) - PUTN(exponent_start, exponent_size); - if (pad_kind == _IO_LEFT && padding > 0) /* Left adjustment*/ - PADN(fill, padding); - return count; - error: - return EOF; -} -#endif |