/* This is part of libio/iostream, providing -*- C++ -*- input/output.
   Copyright (C) 1993, 1997 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()) {
	int ch = _strbuf->sbumpc();
	if (ch == EOF) {
	  set(ios::eofbit|ios::failbit);
	  _gcount = 0;
	}
	else {
	  c = (char)ch;
	  _gcount = 1;
	}
    }
    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()) {
	register streambuf* sb = _strbuf;
	if (delim == EOF) {
	    _gcount = sb->ignore(n);
	    return *this;
	}
	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;
	}
    }
    return *this;
}

istream& istream::read(char *s, streamsize n)
{
    if (ipfx1()) {
	_gcount = _strbuf->sgetn(s, n);
	if (_gcount != n)
	    set(ios::failbit|ios::eofbit);
    }
    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()) {
	int ch = _strbuf->sbumpc();
	if (ch == EOF)
	    set(ios::eofbit|ios::failbit);
	else
	    c = (char)ch;
    }
    return *this;
}

istream&
istream::operator>> (char* ptr)
{
  register char *p = ptr;
  int w = width(0);
  if (ipfx0())
    {
      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);
    }
  *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;
    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;
		return 1;
	    }
	    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
		return 1;
	}
	ndigits++;
	val = base * val + digit;
	ch = sb->sbumpc();
    }
    return 1;
  fail:
    stream.set(ios::failbit);
    return 0;
  eof_fail:
    stream.set(ios::failbit|ios::eofbit);
    return 0;
}

#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())
      {
#if _G_HAVE_LONG_DOUBLE_IO
	scan("%Lg", &x);
#else
	double y;
	scan("%lg", &y);
	x = y;
#endif
      }
    return *this;
}

istream& istream::operator>>(double& x)
{
    if (ipfx0())
	scan("%lg", &x);
    return *this;
}

istream& istream::operator>>(float& x)
{
    if (ipfx0())
	scan("%g", &x);
    return *this;
}

istream& istream::operator>>(register streambuf* sbuf)
{
    if (ipfx0()) {
	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;
	    }
	}
    }
    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,
#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,
#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);
      osfx();
     failed:
      _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
