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