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// This header defines two streambufs:
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// stdio_istreambuf, a read-only streambuf synchronized with a C stdio
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// FILE object
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// stdio_ostreambuf, a write-only streambuf synchronized with a C stdio
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// FILE object.
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Note that neither stdio_istreambuf nor stdio_ostreambuf is a template;
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// both classes are derived from basic_streambuf<char, char_traits<char> >.
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Note: the imbue() member function is a no-op.  In particular, these
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// classes assume that codecvt<char, char, mbstate_t> is always an identity
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// transformation.  This is true of the default locale, and of all locales
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// defined for the C I/O library.  If you need to use a locale where
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// the codecvt<char, char, mbstate_t> facet performs a nontrivial
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// conversion, then you should use basic_filebuf<> instead of stdio_istreambuf
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// or stdio_ostreambuf.  (If you don't understand what any of this means,
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// then it's not a feature you need to worry about.  Locales where
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// codecvt<char, char, mbstate_t> does something nontrivial are a rare
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// corner case.)
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_STDIO_STREAMBUF
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_STDIO_STREAMBUF
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <streambuf>
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <cstdio>              // For FILE.
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Base class for features common to stdio_istreambuf and stdio_ostreambuf
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass stdio_streambuf_base :
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  public basic_streambuf<char, char_traits<char> > /* FILE_basic_streambuf */ {
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:                         // Constructor, destructor.
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // The argument may not be null.  It must be an open file pointer.
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stdio_streambuf_base(FILE*);
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // The destructor flushes the stream, but does not close it.
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~stdio_streambuf_base();
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:                      // Virtual functions from basic_streambuf.
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  streambuf* setbuf(char*, streamsize);
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pos_type seekoff(off_type, ios_base::seekdir,
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   ios_base::openmode
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                          = ios_base::in | ios_base::out);
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pos_type seekpos(pos_type,
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   ios_base::openmode
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                          = ios_base::in | ios_base::out);
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int sync();
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  FILE* _M_file;
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass stdio_istreambuf : public stdio_streambuf_base {
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:                         // Constructor, destructor.
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stdio_istreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~stdio_istreambuf();
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:                      // Virtual functions from basic_streambuf.
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  streamsize showmanyc();
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int_type underflow();
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int_type uflow();
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  virtual int_type pbackfail(int_type c = traits_type::eof());
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass stdio_ostreambuf : public stdio_streambuf_base {
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:                         // Constructor, destructor.
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stdio_ostreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~stdio_ostreambuf();
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:                      // Virtual functions from basic_streambuf.
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  streamsize showmanyc();
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int_type overflow(int_type c = traits_type::eof());
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_STDIO_STREAMBUF */
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
103