1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc.
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk.
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies.
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted,
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice.
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stlport_prefix.h"
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "stdio_streambuf.h"
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_UNIX
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <sys/types.h>
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <sys/stat.h>
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <fstream>
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <limits>
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Compare with streamoff definition in stl/char_traits.h!
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_DEFAULT_FILE_OFFSET) || \
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    (!defined(_LARGEFILE_SOURCE) && !defined(_LARGEFILE64_SOURCE))
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_MSVC) || (_STLP_MSVC < 1400) || defined(_STLP_WCE)
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define FSEEK fseek
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define FSEEK _fseeki64
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FSETPOS  fsetpos
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FGETPOS  fgetpos
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FPOS_T   fpos_t
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FSEEK fseeko64
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FSETPOS  fsetpos64
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FGETPOS  fgetpos64
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define FPOS_T   fpos64_t
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class stdio_streambuf_base
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::stdio_streambuf_base(FILE* file)
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : /* _STLP_STD::FILE_basic_streambuf(file, 0), */
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_file(file)
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{}
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::~stdio_streambuf_base() {
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_VENDOR_CSTD::fflush(_M_file);
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_STD::streambuf* stdio_streambuf_base::setbuf(char* s, streamsize n) {
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_WCE
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // no buffering in windows ce .NET
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t __n_size_t = (sizeof(streamsize) > sizeof(size_t)) ? __STATIC_CAST(size_t, (min)(__STATIC_CAST(streamsize, (numeric_limits<size_t>::max)()), n))
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                                            : __STATIC_CAST(size_t, n);
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_VENDOR_CSTD::setvbuf(_M_file, s, (s == 0 && n == 0) ? _IONBF : _IOFBF, __n_size_t);
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return this;
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::pos_type
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::seekoff(off_type off, ios_base::seekdir dir,
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                              ios_base::openmode /* mode */) {
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int whence;
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  switch (dir) {
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  case ios_base::beg:
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    whence = SEEK_SET;
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  case ios_base::cur:
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    whence = SEEK_CUR;
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  case ios_base::end:
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    whence = SEEK_END;
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    break;
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  default:
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type(-1);
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (off <= numeric_limits<off_type>::max() && FSEEK(_M_file, off, whence) == 0) {
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    FPOS_T pos;
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    FGETPOS(_M_file, &pos);
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // of a primitive type
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if (defined (__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2))))
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type((streamoff)pos.__pos);
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined (__ISCPP__) || defined (__MVS__) || defined (__OS400__)
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type(pos.__fpos_elem[ 0 ]);
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined (__EMX__)
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type((streamoff)pos._pos);
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type(pos);
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return pos_type(-1);
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::pos_type
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_streambuf_base::seekpos(pos_type pos, ios_base::openmode /* mode */) {
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // of a primitive type
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  FPOS_T p;
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p.__pos = pos;
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifdef _STLP_USE_UCLIBC
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    ifdef __STDIO_MBSTATE
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset( &(p.__mbstate), 0, sizeof(p.__mbstate) );
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    ifdef __STDIO_WIDE
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p.mblen_pending = 0;
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset( &(p.__state), 0, sizeof(p.__state) );
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined (__MVS__) || defined (__OS400__)
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  FPOS_T p;
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p.__fpos_elem[0] = pos;
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#elif defined (__EMX__)
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  FPOS_T p;
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  p._pos = pos;
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  memset( &(p._mbstate), 0, sizeof(p._mbstate) );
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  FPOS_T p(pos);
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return FSETPOS(_M_file, &p) == 0 ? pos : pos_type(-1);
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottint stdio_streambuf_base::sync() {
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return _STLP_VENDOR_CSTD::fflush(_M_file) == 0 ? 0 : -1;
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class stdio_istreambuf
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_istreambuf::~stdio_istreambuf() {}
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstreamsize stdio_istreambuf::showmanyc()
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return 0; }
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_istreambuf::int_type stdio_istreambuf::underflow()
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_WCE
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int c = fgetc(_M_file);
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int c = getc(_M_file);
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (c != EOF) {
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_VENDOR_CSTD::ungetc(c, _M_file);
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return c;
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return traits_type::eof();
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_istreambuf::int_type stdio_istreambuf::uflow() {
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_WCE
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int c = fgetc(_M_file);
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  int c = getc(_M_file);
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return c != EOF ? c : traits_type::eof();
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_istreambuf::int_type stdio_istreambuf::pbackfail(int_type c) {
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (c != traits_type::eof()) {
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int result = _STLP_VENDOR_CSTD::ungetc(c, _M_file);
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return result != EOF ? result : traits_type::eof();
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else{
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (this->eback() < this->gptr()) {
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      this->gbump(-1);
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return traits_type::not_eof(c);
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return traits_type::eof();
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//----------------------------------------------------------------------
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class stdio_ostreambuf
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_ostreambuf::~stdio_ostreambuf() {}
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstreamsize stdio_ostreambuf::showmanyc()
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return -1; }
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstdio_ostreambuf::int_type stdio_ostreambuf::overflow(int_type c) {
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Write the existing buffer, without writing any additional character.
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (c == traits_type::eof()) {
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Do we have a buffer to write?
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ptrdiff_t unwritten = this->pptr() - this->pbase();
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (unwritten != 0) {
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_VENDOR_CSTD::fflush(_M_file);
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // Test if the write succeeded.
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (this->pptr() - this->pbase() < unwritten)
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return traits_type::not_eof(c);
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        return traits_type::eof();
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // We always succeed if we don't have to do anything.
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return traits_type::not_eof(c);
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // Write the character c, and whatever else might be in the buffer.
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else {
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef _STLP_WCE
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int result = fputc(c, _M_file);
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    int result = putc(c, _M_file);
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return result != EOF ? result : traits_type::eof();
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Local Variables:
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// mode:C++
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// End:
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
240