summaryrefslogtreecommitdiffstats
path: root/contrib/libio/iostream.cc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libio/iostream.cc')
-rw-r--r--contrib/libio/iostream.cc1049
1 files changed, 0 insertions, 1049 deletions
diff --git a/contrib/libio/iostream.cc b/contrib/libio/iostream.cc
deleted file mode 100644
index 792eaae..0000000
--- a/contrib/libio/iostream.cc
+++ /dev/null
@@ -1,1049 +0,0 @@
-/* This is part of libio/iostream, providing -*- C++ -*- input/output.
- Copyright (C) 1993, 1997, 2000 Free Software Foundation, Inc.
-
- 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. */
-
-/* Written by Per Bothner (bothner@cygnus.com). */
-
-#ifdef __GNUC__
-#pragma implementation
-#endif
-#define _STREAM_COMPAT
-#include <iostream.h>
-#include "libioP.h"
-#include <stdio.h> /* Needed for sprintf */
-#include <ctype.h>
-#include <string.h>
-#include <limits.h>
-
-#if _G_HAVE_PRINTF_FP
-#include <printf.h>
-extern "C" int __printf_fp (_IO_FILE *, const struct printf_info *,
- const void *const *);
-#else
-#include "floatio.h"
-# ifndef _IO_USE_DTOA
-int __cvt_double(double number, register int prec, int flags, int *signp,
- int fmtch, char *startp, char *endp);
-# endif
-#endif
-
-#define BUF (MAXEXP+MAXFRACT+1) /* + decimal point */
-
-//#define isspace(ch) ((ch)==' ' || (ch)=='\t' || (ch)=='\n')
-
-istream::istream(streambuf *sb, ostream* tied)
-{
- init (sb, tied);
- _gcount = 0;
-}
-
-int skip_ws(streambuf* sb)
-{
- int ch;
- for (;;) {
- ch = sb->sbumpc();
- if (ch == EOF || !isspace(ch))
- return ch;
- }
-}
-
-istream& istream::get(char& c)
-{
- if (ipfx1()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int ch = _strbuf->sbumpc();
- if (ch == EOF) {
- set(ios::eofbit|ios::failbit);
- _gcount = 0;
- }
- else {
- c = (char)ch;
- _gcount = 1;
- }
- isfx();
- _IO_cleanup_region_end (0);
- }
- else
- _gcount = 0;
- return *this;
-}
-
-int istream::peek()
-{
- if (!good())
- return EOF;
- if (_tie && rdbuf()->in_avail() == 0)
- _tie->flush();
- int ch = _strbuf->sgetc();
- if (ch == EOF)
- set(ios::eofbit);
- return ch;
-}
-
-istream& istream::ignore(int n /* = 1 */, int delim /* = EOF */)
-{
- _gcount = 0;
- if (ipfx1()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- register streambuf* sb = _strbuf;
- if (delim == EOF) {
- _gcount = sb->ignore(n);
- goto unlock;
- }
- for (;;) {
-#if 0
- if (n != MAXINT) // FIXME
-#endif
- if (--n < 0)
- break;
- int ch = sb->sbumpc();
- if (ch == EOF) {
- set(ios::eofbit|ios::failbit);
- break;
- }
- _gcount++;
- if (ch == delim)
- break;
- }
- unlock:
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-istream& istream::read(char *s, streamsize n)
-{
- if (ipfx1()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- _gcount = _strbuf->sgetn(s, n);
- if (_gcount != n)
- set(ios::failbit|ios::eofbit);
- isfx();
- _IO_cleanup_region_end (0);
- }
- else
- _gcount = 0;
- return *this;
-}
-
-int
-istream::sync ()
-{
- streambuf *sb = rdbuf ();
- if (sb == NULL)
- return EOF;
- if (sb->sync ()) // Later: pubsync
- {
- setstate (ios::badbit);
- return EOF;
- }
- else
- return 0;
-}
-
-istream& istream::seekg(streampos pos)
-{
- pos = _strbuf->pubseekpos(pos, ios::in);
- if (pos == streampos(EOF))
- set(ios::badbit);
- return *this;
-}
-
-istream& istream::seekg(streamoff off, _seek_dir dir)
-{
- streampos pos = _IO_seekoff (_strbuf, off, (int) dir, _IOS_INPUT);
- if (pos == streampos(EOF))
- set(ios::badbit);
- return *this;
-}
-
-streampos istream::tellg()
-{
-#if 0
- streampos pos = _strbuf->pubseekoff(0, ios::cur, ios::in);
-#else
- streampos pos = _IO_seekoff (_strbuf, 0, _IO_seek_cur, _IOS_INPUT);
-#endif
- if (pos == streampos(EOF))
- set(ios::badbit);
- return pos;
-}
-
-istream& istream::operator>>(char& c)
-{
- if (ipfx0()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int ch = _strbuf->sbumpc();
- if (ch == EOF)
- set(ios::eofbit|ios::failbit);
- else
- c = (char)ch;
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-istream&
-istream::operator>> (char* ptr)
-{
- register char *p = ptr;
- int w = width(0);
- if (ipfx0())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- register streambuf* sb = _strbuf;
- for (;;)
- {
- int ch = sb->sbumpc();
- if (ch == EOF)
- {
- set(ios::eofbit);
- break;
- }
- else if (isspace(ch) || w == 1)
- {
- sb->sputbackc(ch);
- break;
- }
- else *p++ = ch;
- w--;
- }
- if (p == ptr)
- set(ios::failbit);
- isfx();
- _IO_cleanup_region_end (0);
- }
- *p = '\0';
- return *this;
-}
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#define LONGEST long long
-#else
-#define LONGEST long
-#endif
-
-static int read_int(istream& stream, unsigned LONGEST& val, int& neg)
-{
- if (!stream.ipfx0())
- return 0;
- int retval;
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- stream._strbuf);
- register streambuf* sb = stream.rdbuf();
- int base = 10;
- int ndigits = 0;
- register int ch = skip_ws(sb);
- if (ch == EOF)
- goto eof_fail;
- neg = 0;
- if (ch == '+') {
- ch = skip_ws(sb);
- }
- else if (ch == '-') {
- neg = 1;
- ch = skip_ws(sb);
- }
- if (ch == EOF) goto eof_fail;
- if (!(stream.flags() & ios::basefield)) {
- if (ch == '0') {
- ch = sb->sbumpc();
- if (ch == EOF) {
- val = 0;
- goto unlock;
- }
- if (ch == 'x' || ch == 'X') {
- base = 16;
- ch = sb->sbumpc();
- if (ch == EOF) goto eof_fail;
- }
- else {
- sb->sputbackc(ch);
- base = 8;
- ch = '0';
- }
- }
- }
- else if ((stream.flags() & ios::basefield) == ios::hex)
- base = 16;
- else if ((stream.flags() & ios::basefield) == ios::oct)
- base = 8;
- val = 0;
- for (;;) {
- if (ch == EOF)
- break;
- int digit;
- if (ch >= '0' && ch <= '9')
- digit = ch - '0';
- else if (ch >= 'A' && ch <= 'F')
- digit = ch - 'A' + 10;
- else if (ch >= 'a' && ch <= 'f')
- digit = ch - 'a' + 10;
- else
- digit = 999;
- if (digit >= base) {
- sb->sputbackc(ch);
- if (ndigits == 0)
- goto fail;
- else
- goto unlock;
- }
- ndigits++;
- val = base * val + digit;
- ch = sb->sbumpc();
- }
- unlock:
- retval = 1;
- goto out;
- fail:
- stream.set(ios::failbit);
- retval = 0;
- goto out;
- eof_fail:
- stream.set(ios::failbit|ios::eofbit);
- retval = 0;
- out:
- stream.isfx();
- _IO_cleanup_region_end (0);
- return retval;
-}
-
-#define READ_INT(TYPE) \
-istream& istream::operator>>(TYPE& i)\
-{\
- unsigned LONGEST val; int neg;\
- if (read_int(*this, val, neg)) {\
- if (neg) val = -val;\
- i = (TYPE)val;\
- }\
- return *this;\
-}
-
-READ_INT(short)
-READ_INT(unsigned short)
-READ_INT(int)
-READ_INT(unsigned int)
-READ_INT(long)
-READ_INT(unsigned long)
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-READ_INT(long long)
-READ_INT(unsigned long long)
-#endif
-#if _G_HAVE_BOOL
-READ_INT(bool)
-#endif
-
-istream& istream::operator>>(long double& x)
-{
- if (ipfx0())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
-#if _G_HAVE_LONG_DOUBLE_IO
- scan("%Lg", &x);
-#else
- double y;
- scan("%lg", &y);
- x = y;
-#endif
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-istream& istream::operator>>(double& x)
-{
- if (ipfx0())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- scan("%lg", &x);
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-istream& istream::operator>>(float& x)
-{
- if (ipfx0())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- scan("%g", &x);
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-istream& istream::operator>>(register streambuf* sbuf)
-{
- if (ipfx0()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- register streambuf* inbuf = rdbuf();
- // FIXME: Should optimize!
- for (;;) {
- register int ch = inbuf->sbumpc();
- if (ch == EOF) {
- set(ios::eofbit);
- break;
- }
- if (sbuf->sputc(ch) == EOF) {
- set(ios::failbit);
- break;
- }
- }
- isfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-ostream& ostream::operator<<(char c)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
-#if 1
- // This is what the cfront implementation does.
- if (_strbuf->sputc(c) == EOF) {
- set(ios::badbit);
- goto failed;
- }
-#else
- // This is what cfront documentation and current ANSI drafts say.
- int w = width(0);
- char fill_char = fill();
- register int padding = w > 0 ? w - 1 : 0;
- register streambuf *sb = _strbuf;
- if (!(flags() & ios::left) && padding) // Default adjustment.
- if (_IO_padn(sb, fill_char, padding) < padding) {
- set(ios::badbit);
- goto failed;
- }
- if (sb->sputc(c) == EOF) {
- set(ios::badbit);
- goto failed;
- }
- if (flags() & ios::left && padding) // Left adjustment.
- if (_IO_padn(sb, fill_char, padding) < padding)
- set(ios::badbit);
-#endif
- failed:
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-/* Write VAL on STREAM.
- If SIGN<0, val is the absolute value of a negative number.
- If SIGN>0, val is a signed non-negative number.
- If SIGN==0, val is unsigned. */
-
-static void write_int(ostream& stream, unsigned LONGEST val, int sign)
-{
-#define WRITE_BUF_SIZE (10 + sizeof(unsigned LONGEST) * 3)
- char buf[WRITE_BUF_SIZE];
- register char *buf_ptr = buf+WRITE_BUF_SIZE; // End of buf.
- const char *show_base = "";
- int show_base_len = 0;
- int show_pos = 0; // If 1, print a '+'.
-
- // Now do the actual conversion, placing the result at the *end* of buf.
- // Note that we use separate code for decimal, octal, and hex,
- // so we can divide by optimizable constants.
- if ((stream.flags() & ios::basefield) == ios::oct) { // Octal
- do {
- *--buf_ptr = (val & 7) + '0';
- val = val >> 3;
- } while (val != 0);
- if ((stream.flags() & ios::showbase) && (*buf_ptr != '0'))
- *--buf_ptr = '0';
- }
- else if ((stream.flags() & ios::basefield) == ios::hex) { // Hex
- const char *xdigs = (stream.flags() & ios::uppercase) ? "0123456789ABCDEF0X"
- : "0123456789abcdef0x";
- do {
- *--buf_ptr = xdigs[val & 15];
- val = val >> 4;
- } while (val != 0);
- if ((stream.flags() & ios::showbase)) {
- show_base = xdigs + 16; // Either "0X" or "0x".
- show_base_len = 2;
- }
- }
- else { // Decimal
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
- // Optimization: Only use long long when we need to.
- while (val > UINT_MAX) {
- *--buf_ptr = (val % 10) + '0';
- val /= 10;
- }
- // Use more efficient (int) arithmetic for the rest.
- register unsigned int ival = (unsigned int)val;
-#else
- register unsigned LONGEST ival = val;
-#endif
- do {
- *--buf_ptr = (ival % 10) + '0';
- ival /= 10;
- } while (ival != 0);
- if (sign > 0 && (stream.flags() & ios::showpos))
- show_pos=1;
- }
-
- int buf_len = buf+WRITE_BUF_SIZE - buf_ptr;
- int w = stream.width(0);
-
- // Calculate padding.
- int len = buf_len+show_pos;
- if (sign < 0) len++;
- len += show_base_len;
- int padding = len > w ? 0 : w - len;
-
- // Do actual output.
- register streambuf* sbuf = stream.rdbuf();
- ios::fmtflags pad_kind =
- stream.flags() & (ios::left|ios::right|ios::internal);
- char fill_char = stream.fill();
- if (padding > 0
- && pad_kind != (ios::fmtflags)ios::left
- && pad_kind != (ios::fmtflags)ios::internal) // Default (right) adjust.
- if (_IO_padn(sbuf, fill_char, padding) < padding)
- goto failed;
- if (sign < 0 || show_pos)
- {
- char ch = sign < 0 ? '-' : '+';
- if (sbuf->sputc(ch) < 0)
- goto failed;
- }
- if (show_base_len)
- if (_IO_sputn(sbuf, show_base, show_base_len) <= 0)
- goto failed;
- if (pad_kind == (ios::fmtflags)ios::internal && padding > 0)
- if (_IO_padn(sbuf, fill_char, padding) < padding)
- goto failed;
- if (_IO_sputn (sbuf, buf_ptr, buf_len) != buf_len)
- goto failed;
- if (pad_kind == (ios::fmtflags)ios::left && padding > 0) // Left adjustment
- if (_IO_padn(sbuf, fill_char, padding) < padding)
- goto failed;
- stream.osfx();
- return;
- failed:
- stream.set(ios::badbit);
- stream.osfx();
-}
-
-ostream& ostream::operator<<(int n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int sign = 1;
- unsigned int abs_n = (unsigned)n;
- if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0)
- abs_n = -((unsigned)n), sign = -1;
- write_int(*this, abs_n, sign);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-ostream& ostream::operator<<(unsigned int n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- write_int(*this, n, 0);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-
-ostream& ostream::operator<<(long n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int sign = 1;
- unsigned long abs_n = (unsigned long)n;
- if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0)
- abs_n = -((unsigned long)n), sign = -1;
- write_int(*this, abs_n, sign);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-ostream& ostream::operator<<(unsigned long n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- write_int(*this, n, 0);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-ostream& ostream::operator<<(long long n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int sign = 1;
- unsigned long long abs_n = (unsigned long long)n;
- if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0)
- abs_n = -((unsigned long long)n), sign = -1;
- write_int(*this, abs_n, sign);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-
-ostream& ostream::operator<<(unsigned long long n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- write_int(*this, n, 0);
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-#endif /*__GNUC__*/
-
-ostream& ostream::operator<<(double n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- // Uses __cvt_double (renamed from static cvt), in Chris Torek's
- // stdio implementation. The setup code uses the same logic
- // as in __vsbprintf.C (also based on Torek's code).
- int format_char;
- if ((flags() & ios::floatfield) == ios::fixed)
- format_char = 'f';
- else if ((flags() & ios::floatfield) == ios::scientific)
- format_char = flags() & ios::uppercase ? 'E' : 'e';
- else
- format_char = flags() & ios::uppercase ? 'G' : 'g';
-
- int prec = precision();
- if (prec <= 0 && !(flags() & ios::fixed))
- prec = 6; /* default */
-
- // Do actual conversion.
-#if _G_HAVE_PRINTF_FP
- {
- struct printf_info info = { /* prec: */ prec,
- /* width: */ width(0),
- /* spec: */ format_char,
- /* is_long_double: */ 0,
- /* is_short: */ 0,
- /* is_long: */ 0,
- /* alt: */ (flags() & ios::showpoint) != 0,
- /* space: */ 0,
- /* left: */ (flags() & ios::left) != 0,
- /* showsign: */ (flags() & ios::showpos) != 0,
- /* group: */ 0,
-#if defined __GLIBC__ && __GLIBC__ >= 2
- /* extra: */ 0,
-#if __GLIBC_MINOR__ >= 1
- /* is_char: */ 0,
-#if __GLIBC_MINOR__ >= 2
- /* wide: */ 0,
- /* i18n: */ 0,
-#endif
-#endif
-#endif
- /* pad: */ fill()
- };
- const void *ptr = (const void *) &n;
- if (__printf_fp (rdbuf(), &info, &ptr) < 0)
- set(ios::badbit|ios::failbit);
- }
-#elif defined _IO_USE_DTOA
- if (_IO_outfloat(n, rdbuf(), format_char, width(0),
- prec, flags(),
- flags() & ios::showpos ? '+' : 0,
- fill()) < 0)
- set(ios::badbit|ios::failbit); // ??
-#else
- int fpprec = 0; // 'Extra' (suppressed) floating precision.
- if (prec > MAXFRACT) {
- if (flags() & (ios::fixed|ios::scientific) & ios::showpos)
- fpprec = prec - MAXFRACT;
- prec = MAXFRACT;
- }
- int negative;
- char buf[BUF];
- int sign = '\0';
- char *cp = buf;
- *cp = 0;
- int size = __cvt_double(n, prec,
- flags() & ios::showpoint ? 0x80 : 0,
- &negative,
- format_char, cp, buf + sizeof(buf));
- if (negative) sign = '-';
- else if (flags() & ios::showpos) sign = '+';
- if (*cp == 0)
- cp++;
-
- // Calculate padding.
- int fieldsize = size + fpprec;
- if (sign) fieldsize++;
- int padding = 0;
- int w = width(0);
- if (fieldsize < w)
- padding = w - fieldsize;
-
- // Do actual output.
- register streambuf* sbuf = rdbuf();
- register i;
- char fill_char = fill();
- ios::fmtflags pad_kind =
- flags() & (ios::left|ios::right|ios::internal);
- if (pad_kind != (ios::fmtflags)ios::left // Default (right) adjust.
- && pad_kind != (ios::fmtflags)ios::internal)
- for (i = padding; --i >= 0; ) sbuf->sputc(fill_char);
- if (sign)
- sbuf->sputc(sign);
- if (pad_kind == (ios::fmtflags)ios::internal)
- for (i = padding; --i >= 0; ) sbuf->sputc(fill_char);
-
- // Emit the actual concented field, followed by extra zeros.
- _IO_sputn (sbuf, cp, size);
- for (i = fpprec; --i >= 0; ) sbuf->sputc('0');
-
- if (pad_kind == (ios::fmtflags)ios::left) // Left adjustment
- for (i = padding; --i >= 0; ) sbuf->sputc(fill_char);
-#endif
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-#if _G_HAVE_LONG_DOUBLE_IO
-ostream& ostream::operator<<(long double n)
-{
- if (opfx())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- int format_char;
- if ((flags() & ios::floatfield) == ios::fixed)
- format_char = 'f';
- else if ((flags() & ios::floatfield) == ios::scientific)
- format_char = flags() & ios::uppercase ? 'E' : 'e';
- else
- format_char = flags() & ios::uppercase ? 'G' : 'g';
-
- int prec = precision();
- if (prec <= 0 && !(flags() & ios::fixed))
- prec = 6; /* default */
-
-#if _G_HAVE_PRINTF_FP
- // Do actual conversion.
- struct printf_info info = { /* prec: */ prec,
- /* width: */ width(0),
- /* spec: */ format_char,
- /* is_long_double: */ 1,
- /* is_short: */ 0,
- /* is_long: */ 0,
- /* alt: */ (flags() & ios::showpoint) != 0,
- /* space: */ 0,
- /* left: */ (flags() & ios::left) != 0,
- /* showsign: */ (flags() & ios::showpos) != 0,
- /* group: */ 0,
-#if defined __GLIBC__ && __GLIBC__ >= 2
- /* extra: */ 0,
-#if __GLIBC_MINOR__ >= 1
- /* is_char: */ 0,
-#if __GLIBC_MINOR__ >= 2
- /* wide: */ 0,
- /* i18n: */ 0,
-#endif
-#endif
-#endif
- /* pad: */ fill()
- };
-
- const void *ptr = (const void *) &n;
-
- if (__printf_fp (rdbuf(), &info, &ptr) < 0)
- set (ios::badbit|ios::failbit);
-#else
-# error "long double I/O using dtoa or cvt_double is not implemented"
-#endif
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-#endif
-
-ostream& ostream::operator<<(const char *s)
-{
- if (opfx())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- if (s == NULL)
- s = "(null)";
- int len = strlen(s);
- int w = width(0);
-// FIXME: Should we: if (w && len>w) len = w;
- char fill_char = fill();
- register streambuf *sbuf = rdbuf();
- register int padding = w > len ? w - len : 0;
- if (!(flags() & ios::left) && padding > 0) // Default adjustment.
- if (_IO_padn(sbuf, fill_char, padding) != padding)
- {
- set(ios::badbit);
- goto failed;
- }
- if (_IO_sputn (sbuf, s, len) != len)
- {
- set(ios::badbit);
- goto failed;
- }
- if (flags() & ios::left && padding > 0) // Left adjustment.
- if (_IO_padn(sbuf, fill_char, padding) != padding)
- set(ios::badbit);
- failed:
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-#if 0
-ostream& ostream::operator<<(const void *p)
-{ Is in osform.cc, to avoid pulling in all of _IO_vfprintf by this file. */ }
-#endif
-
-ostream& ostream::operator<<(register streambuf* sbuf)
-{
- if (opfx())
- {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- char buffer[_IO_BUFSIZ];
- register streambuf* outbuf = _strbuf;
- for (;;)
- {
- _IO_size_t count = _IO_sgetn(sbuf, buffer, _IO_BUFSIZ);
- if (count <= 0)
- break;
- if (_IO_sputn(outbuf, buffer, count) != count)
- {
- set(ios::badbit);
- break;
- }
- }
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-ostream::ostream(streambuf* sb, ostream* tied)
-{
- init (sb, tied);
-}
-
-ostream& ostream::seekp(streampos pos)
-{
- pos = _strbuf->pubseekpos(pos, ios::out);
- if (pos == streampos(EOF))
- set(ios::badbit);
- return *this;
-}
-
-ostream& ostream::seekp(streamoff off, _seek_dir dir)
-{
- streampos pos = _IO_seekoff (_strbuf, off, (int) dir, _IOS_OUTPUT);
- if (pos == streampos(EOF))
- set(ios::badbit);
- return *this;
-}
-
-streampos ostream::tellp()
-{
-#if 1
- streampos pos = _IO_seekoff (_strbuf, 0, _IO_seek_cur, _IOS_OUTPUT);
-#else
- streampos pos = _strbuf->pubseekoff(0, ios::cur, ios::out);
-#endif
- if (pos == streampos(EOF))
- set(ios::badbit);
- return pos;
-}
-
-ostream& ostream::flush()
-{
- if (_strbuf->sync())
- set(ios::badbit);
- return *this;
-}
-
-ostream& flush(ostream& outs)
-{
- return outs.flush();
-}
-
-istream& ws(istream& ins)
-{
- if (ins.ipfx1()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- ins._strbuf);
- int ch = skip_ws(ins._strbuf);
- if (ch == EOF)
- ins.set(ios::eofbit);
- else
- ins._strbuf->sputbackc(ch);
- ins.isfx();
- _IO_cleanup_region_end (0);
- }
- return ins;
-}
-
-// Skip white-space. Return 0 on failure (EOF), or 1 on success.
-// Differs from ws() manipulator in that failbit is set on EOF.
-// Called by ipfx() and ipfx0() if needed.
-
-int istream::_skip_ws()
-{
- int ch = skip_ws(_strbuf);
- if (ch == EOF) {
- set(ios::eofbit|ios::failbit);
- return 0;
- }
- else {
- _strbuf->sputbackc(ch);
- return 1;
- }
-}
-
-ostream& ends(ostream& outs)
-{
- outs.put('\0');
- return outs;
-}
-
-ostream& endl(ostream& outs)
-{
- return flush(outs.put('\n'));
-}
-
-istream& lock(istream& ins)
-{
- _IO_flockfile (ins._strbuf);
- return ins;
-}
-istream& unlock(istream& ins)
-{
- _IO_funlockfile (ins._strbuf);
- return ins;
-}
-ostream& lock(ostream& outs)
-{
- _IO_flockfile (outs._strbuf);
- return outs;
-}
-ostream& unlock(ostream& outs)
-{
- _IO_funlockfile (outs._strbuf);
- return outs;
-}
-
-
-ostream& ostream::write(const char *s, streamsize n)
-{
- if (opfx()) {
- _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
- _strbuf);
- if (_IO_sputn(_strbuf, s, n) != n)
- set(ios::failbit);
- osfx();
- _IO_cleanup_region_end (0);
- }
- return *this;
-}
-
-void ostream::do_osfx()
-{
- if (flags() & ios::unitbuf)
- flush();
- if (flags() & ios::stdio) {
- fflush(stdout);
- fflush(stderr);
- }
-}
-
-iostream::iostream(streambuf* sb, ostream* tied)
-{
- init (sb, tied);
-}
-
-// NOTE: extension for compatibility with old libg++.
-// Not really compatible with fistream::close().
-#ifdef _STREAM_COMPAT
-void ios::close()
-{
- if (_strbuf->_flags & _IO_IS_FILEBUF)
- ((struct filebuf*)rdbuf())->close();
- else if (_strbuf != NULL)
- rdbuf()->sync();
- _strbuf = NULL;
- _state = badbit;
-}
-
-int istream::skip(int i)
-{
- int old = (_flags & ios::skipws) != 0;
- if (i)
- _flags |= ios::skipws;
- else
- _flags &= ~ios::skipws;
- return old;
-}
-#endif
OpenPOWER on IntegriCloud