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