summaryrefslogtreecommitdiffstats
path: root/contrib/libio/outfloat.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libio/outfloat.c')
-rw-r--r--contrib/libio/outfloat.c211
1 files changed, 0 insertions, 211 deletions
diff --git a/contrib/libio/outfloat.c b/contrib/libio/outfloat.c
deleted file mode 100644
index 5cbb6c9..0000000
--- 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
OpenPOWER on IntegriCloud