177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stlport_prefix.h"
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stdio_streambuf.h"
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_UNIX
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <sys/types.h>
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <sys/stat.h>
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <fstream>
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <limits>
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Compare with streamoff definition in stl/char_traits.h!
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_DEFAULT_FILE_OFFSET) || \
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    (!defined(_LARGEFILE_SOURCE) && !defined(_LARGEFILE64_SOURCE))
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if !defined (_STLP_MSVC) || (_STLP_MSVC < 1400) || defined(_STLP_WCE)
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define FSEEK fseek
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  else
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define FSEEK _fseeki64
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FSETPOS  fsetpos
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FGETPOS  fgetpos
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FPOS_T   fpos_t
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FSEEK fseeko64
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FSETPOS  fsetpos64
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FGETPOS  fgetpos64
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define FPOS_T   fpos64_t
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class stdio_streambuf_base
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::stdio_streambuf_base(FILE* file)
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : /* _STLP_STD::FILE_basic_streambuf(file, 0), */
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_file(file)
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{}
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::~stdio_streambuf_base() {
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VENDOR_CSTD::fflush(_M_file);
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_STD::streambuf* stdio_streambuf_base::setbuf(char* s, streamsize n) {
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_WCE
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // no buffering in windows ce .NET
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __n_size_t = (sizeof(streamsize) > sizeof(size_t)) ? __STATIC_CAST(size_t, (min)(__STATIC_CAST(streamsize, (numeric_limits<size_t>::max)()), n))
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                                                            : __STATIC_CAST(size_t, n);
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VENDOR_CSTD::setvbuf(_M_file, s, (s == 0 && n == 0) ? _IONBF : _IOFBF, __n_size_t);
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return this;
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::pos_type
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::seekoff(off_type off, ios_base::seekdir dir,
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                              ios_base::openmode /* mode */) {
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int whence;
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  switch (dir) {
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::beg:
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    whence = SEEK_SET;
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::cur:
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    whence = SEEK_CUR;
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  case ios_base::end:
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    whence = SEEK_END;
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    break;
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  default:
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(-1);
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (off <= numeric_limits<off_type>::max() && FSEEK(_M_file, off, whence) == 0) {
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    FPOS_T pos;
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    FGETPOS(_M_file, &pos);
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // of a primitive type
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if (defined (__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2))))
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type((streamoff)pos.__pos);
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (__ISCPP__) || defined (__MVS__) || defined (__OS400__)
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(pos.__fpos_elem[ 0 ]);
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (__EMX__)
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type((streamoff)pos._pos);
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(pos);
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return pos_type(-1);
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::pos_type
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_streambuf_base::seekpos(pos_type pos, ios_base::openmode /* mode */) {
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // of a primitive type
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  FPOS_T p;
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p.__pos = pos;
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  ifdef _STLP_USE_UCLIBC
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    ifdef __STDIO_MBSTATE
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset( &(p.__mbstate), 0, sizeof(p.__mbstate) );
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    endif
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    ifdef __STDIO_WIDE
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p.mblen_pending = 0;
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    endif
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  else
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset( &(p.__state), 0, sizeof(p.__state) );
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (__MVS__) || defined (__OS400__)
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  FPOS_T p;
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p.__fpos_elem[0] = pos;
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (__EMX__)
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  FPOS_T p;
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p._pos = pos;
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset( &(p._mbstate), 0, sizeof(p._mbstate) );
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  FPOS_T p(pos);
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return FSETPOS(_M_file, &p) == 0 ? pos : pos_type(-1);
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerint stdio_streambuf_base::sync() {
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _STLP_VENDOR_CSTD::fflush(_M_file) == 0 ? 0 : -1;
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class stdio_istreambuf
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_istreambuf::~stdio_istreambuf() {}
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstreamsize stdio_istreambuf::showmanyc()
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return 0; }
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_istreambuf::int_type stdio_istreambuf::underflow()
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_WCE
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int c = fgetc(_M_file);
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int c = getc(_M_file);
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (c != EOF) {
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_VENDOR_CSTD::ungetc(c, _M_file);
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return c;
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return traits_type::eof();
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_istreambuf::int_type stdio_istreambuf::uflow() {
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_WCE
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int c = fgetc(_M_file);
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int c = getc(_M_file);
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return c != EOF ? c : traits_type::eof();
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_istreambuf::int_type stdio_istreambuf::pbackfail(int_type c) {
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (c != traits_type::eof()) {
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int result = _STLP_VENDOR_CSTD::ungetc(c, _M_file);
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return result != EOF ? result : traits_type::eof();
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else{
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (this->eback() < this->gptr()) {
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      this->gbump(-1);
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return traits_type::not_eof(c);
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return traits_type::eof();
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//----------------------------------------------------------------------
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class stdio_ostreambuf
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_ostreambuf::~stdio_ostreambuf() {}
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstreamsize stdio_ostreambuf::showmanyc()
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return -1; }
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstdio_ostreambuf::int_type stdio_ostreambuf::overflow(int_type c) {
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Write the existing buffer, without writing any additional character.
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (c == traits_type::eof()) {
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // Do we have a buffer to write?
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ptrdiff_t unwritten = this->pptr() - this->pbase();
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (unwritten != 0) {
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_VENDOR_CSTD::fflush(_M_file);
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // Test if the write succeeded.
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (this->pptr() - this->pbase() < unwritten)
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        return traits_type::not_eof(c);
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      else
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        return traits_type::eof();
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // We always succeed if we don't have to do anything.
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return traits_type::not_eof(c);
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Write the character c, and whatever else might be in the buffer.
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  else {
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_WCE
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int result = fputc(c, _M_file);
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    int result = putc(c, _M_file);
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return result != EOF ? result : traits_type::eof();
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
240