123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /*
- * Robin J. Maxwell 11-22-96
- * Fredrik Roubert <roubert@google.com> 2010-07-23
- * Matt Austern <austern@google.com> 2010-07-23
- */
- #ifndef _PRSTRMS_H
- #define _PRSTRMS_H
- #include <cstddef>
- #include <istream>
- #include <ostream>
- #include <streambuf>
- #include "prio.h"
- #ifdef _MSC_VER
- // http://support.microsoft.com/kb/q168958/
- class PR_IMPLEMENT(std::_Mutex);
- class PR_IMPLEMENT(std::ios_base);
- #endif
- class PR_IMPLEMENT(PRfilebuf): public std::streambuf
- {
- public:
- PRfilebuf();
- PRfilebuf(PRFileDesc *fd);
- PRfilebuf(PRFileDesc *fd, char_type *ptr, std::streamsize len);
- virtual ~PRfilebuf();
- bool is_open() const {
- return _fd != NULL;
- }
- PRfilebuf *open(
- const char *name,
- std::ios_base::openmode flags,
- PRIntn mode);
- PRfilebuf *attach(PRFileDesc *fd);
- PRfilebuf *close();
- protected:
- virtual std::streambuf *setbuf(char_type *ptr, std::streamsize len);
- virtual pos_type seekoff(
- off_type offset,
- std::ios_base::seekdir dir,
- std::ios_base::openmode flags);
- virtual pos_type seekpos(
- pos_type pos,
- std::ios_base::openmode flags) {
- return seekoff(pos, std::ios_base::beg, flags);
- }
- virtual int sync();
- virtual int_type underflow();
- virtual int_type overflow(int_type c = traits_type::eof());
- // TODO: Override pbackfail(), showmanyc(), uflow(), xsgetn(), and xsputn().
- private:
- bool allocate();
- void setb(char_type *buf_base, char_type *buf_end, bool user_buf);
- PRFileDesc *_fd;
- bool _opened;
- bool _allocated;
- bool _unbuffered;
- bool _user_buf;
- char_type *_buf_base;
- char_type *_buf_end;
- };
- class PR_IMPLEMENT(PRifstream): public std::istream
- {
- public:
- PRifstream();
- PRifstream(PRFileDesc *fd);
- PRifstream(PRFileDesc *fd, char_type *ptr, std::streamsize len);
- PRifstream(const char *name, openmode flags = in, PRIntn mode = 0);
- virtual ~PRifstream();
- PRfilebuf *rdbuf() const {
- return &_filebuf;
- }
- bool is_open() const {
- return _filebuf.is_open();
- }
- void open(const char *name, openmode flags = in, PRIntn mode = 0);
- void attach(PRFileDesc *fd);
- void close();
- private:
- mutable PRfilebuf _filebuf;
- };
- class PR_IMPLEMENT(PRofstream): public std::ostream
- {
- public:
- PRofstream();
- PRofstream(PRFileDesc *fd);
- PRofstream(PRFileDesc *fd, char_type *ptr, std::streamsize len);
- PRofstream(const char *name, openmode flags = out, PRIntn mode = 0);
- virtual ~PRofstream();
- PRfilebuf *rdbuf() const {
- return &_filebuf;
- }
- bool is_open() const {
- return _filebuf.is_open();
- }
- void open(const char *name, openmode flags = out, PRIntn mode = 0);
- void attach(PRFileDesc *fd);
- void close();
- private:
- mutable PRfilebuf _filebuf;
- };
- class PR_IMPLEMENT(PRfstream): public std::iostream
- {
- public:
- PRfstream();
- PRfstream(PRFileDesc *fd);
- PRfstream(PRFileDesc *fd, char_type *ptr, std::streamsize len);
- PRfstream(const char *name, openmode flags = in | out, PRIntn mode = 0);
- virtual ~PRfstream();
- PRfilebuf *rdbuf() const {
- return &_filebuf;
- }
- bool is_open() const {
- return _filebuf.is_open();
- }
- void open(const char *name, openmode flags = in | out, PRIntn mode = 0);
- void attach(PRFileDesc *fd);
- void close();
- private:
- mutable PRfilebuf _filebuf;
- };
- #endif /* _PRSTRMS_H */
|