Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 1999
      3  * Silicon Graphics Computer Systems, Inc.
      4  *
      5  * Copyright (c) 1999
      6  * Boris Fomitchev
      7  *
      8  * This material is provided "as is", with absolutely no warranty expressed
      9  * or implied. Any use is at your own risk.
     10  *
     11  * Permission to use or copy this software for any purpose is hereby granted
     12  * without fee, provided the above notices are retained on all copies.
     13  * Permission to modify the code and to distribute modified code is granted,
     14  * provided the above notices are retained, and a notice that the code was
     15  * modified is included with the above copyright notice.
     16  *
     17  */
     18 
     19 // This header defines two streambufs:
     20 // stdio_istreambuf, a read-only streambuf synchronized with a C stdio
     21 // FILE object
     22 // stdio_ostreambuf, a write-only streambuf synchronized with a C stdio
     23 // FILE object.
     24 // Note that neither stdio_istreambuf nor stdio_ostreambuf is a template;
     25 // both classes are derived from basic_streambuf<char, char_traits<char> >.
     26 
     27 // Note: the imbue() member function is a no-op.  In particular, these
     28 // classes assume that codecvt<char, char, mbstate_t> is always an identity
     29 // transformation.  This is true of the default locale, and of all locales
     30 // defined for the C I/O library.  If you need to use a locale where
     31 // the codecvt<char, char, mbstate_t> facet performs a nontrivial
     32 // conversion, then you should use basic_filebuf<> instead of stdio_istreambuf
     33 // or stdio_ostreambuf.  (If you don't understand what any of this means,
     34 // then it's not a feature you need to worry about.  Locales where
     35 // codecvt<char, char, mbstate_t> does something nontrivial are a rare
     36 // corner case.)
     37 
     38 
     39 #ifndef _STLP_STDIO_STREAMBUF
     40 #define _STLP_STDIO_STREAMBUF
     41 
     42 #include <streambuf>
     43 #include <cstdio>              // For FILE.
     44 
     45 _STLP_BEGIN_NAMESPACE
     46 _STLP_MOVE_TO_PRIV_NAMESPACE
     47 
     48 // Base class for features common to stdio_istreambuf and stdio_ostreambuf
     49 class stdio_streambuf_base :
     50   public basic_streambuf<char, char_traits<char> > /* FILE_basic_streambuf */ {
     51 public:                         // Constructor, destructor.
     52   // The argument may not be null.  It must be an open file pointer.
     53   stdio_streambuf_base(FILE*);
     54 
     55   // The destructor flushes the stream, but does not close it.
     56   ~stdio_streambuf_base();
     57 
     58 protected:                      // Virtual functions from basic_streambuf.
     59   streambuf* setbuf(char*, streamsize);
     60 
     61   pos_type seekoff(off_type, ios_base::seekdir,
     62                    ios_base::openmode
     63                           = ios_base::in | ios_base::out);
     64   pos_type seekpos(pos_type,
     65                    ios_base::openmode
     66                           = ios_base::in | ios_base::out);
     67   int sync();
     68 
     69 protected:
     70   FILE* _M_file;
     71 };
     72 
     73 class stdio_istreambuf : public stdio_streambuf_base {
     74 public:                         // Constructor, destructor.
     75   stdio_istreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
     76   ~stdio_istreambuf();
     77 
     78 protected:                      // Virtual functions from basic_streambuf.
     79   streamsize showmanyc();
     80   int_type underflow();
     81   int_type uflow();
     82   virtual int_type pbackfail(int_type c = traits_type::eof());
     83 };
     84 
     85 class stdio_ostreambuf : public stdio_streambuf_base {
     86 public:                         // Constructor, destructor.
     87   stdio_ostreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
     88   ~stdio_ostreambuf();
     89 
     90 protected:                      // Virtual functions from basic_streambuf.
     91   streamsize showmanyc();
     92   int_type overflow(int_type c = traits_type::eof());
     93 };
     94 
     95 _STLP_MOVE_TO_STD_NAMESPACE
     96 _STLP_END_NAMESPACE
     97 
     98 #endif /* _STLP_STDIO_STREAMBUF */
     99 
    100 // Local Variables:
    101 // mode:C++
    102 // End:
    103