123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: OutputCharStream.h /main/1 1996/07/29 16:59:39 cde-hp $ */
- // Copyright (c) 1994 James Clark
- // See the file COPYING for copying permission.
- #ifndef OutputCharStream_INCLUDED
- #define OutputCharStream_INCLUDED 1
- #include "types.h"
- #include <stddef.h>
- #include "StringC.h"
- #include "Owner.h"
- #include "CodingSystem.h"
- #if defined(__linux__) || defined(CSRG_BASED) || defined(sun)
- #include <streambuf>
- using namespace std;
- #else
- class streambuf;
- #endif
- #ifdef SP_NAMESPACE
- namespace SP_NAMESPACE {
- #endif
- class SP_API OutputCharStream {
- public:
- enum Newline { newline };
- typedef void (*Escaper)(OutputCharStream &, Char);
- OutputCharStream();
- virtual ~OutputCharStream();
- OutputCharStream &put(Char);
- OutputCharStream &write(const Char *, size_t);
- virtual void flush() = 0;
- void setEscaper(Escaper);
- OutputCharStream &operator<<(char);
- OutputCharStream &operator<<(const char *);
- OutputCharStream &operator<<(const StringC &);
- OutputCharStream &operator<<(unsigned long);
- OutputCharStream &operator<<(int);
- OutputCharStream &operator<<(Newline);
- private:
- OutputCharStream(const OutputCharStream &); // undefined
- void operator=(const OutputCharStream &); // undefined
- virtual void flushBuf(Char) = 0;
- Escaper escaper_;
- protected:
- void escape(OutputCharStream &, Char c);
- Char *ptr_;
- Char *end_;
- };
- class SP_API IosOutputCharStream : public OutputCharStream,
- private Encoder::Handler {
- public:
- IosOutputCharStream();
- // the streambuf will not be deleted
- IosOutputCharStream(streambuf *, const OutputCodingSystem *);
- ~IosOutputCharStream();
- void open(streambuf *, const OutputCodingSystem *);
- void flush();
- private:
- IosOutputCharStream(const IosOutputCharStream &); // undefined
- void operator=(const IosOutputCharStream &); // undefined
- IosOutputCharStream(streambuf *, Encoder *);
- void allocBuf(int bytesPerChar);
- void flushBuf(Char);
- void handleUnencodable(Char c, streambuf *);
- Char *buf_;
- streambuf *byteStream_;
- Encoder *encoder_;
- Owner<Encoder> ownedEncoder_;
- };
- class SP_API StrOutputCharStream : public OutputCharStream {
- public:
- StrOutputCharStream();
- ~StrOutputCharStream();
- void extractString(StringC &);
- void flush();
- private:
- void flushBuf(Char);
- void sync(size_t);
- StrOutputCharStream(const StrOutputCharStream &); // undefined
- void operator=(const StrOutputCharStream &); // undefined
- Char *buf_;
- size_t bufSize_;
- };
- class SP_API RecordOutputCharStream : public OutputCharStream {
- public:
- RecordOutputCharStream(OutputCharStream *);
- ~RecordOutputCharStream();
- void flush();
- private:
- RecordOutputCharStream(const RecordOutputCharStream &); // undefined
- void operator=(const RecordOutputCharStream &); // undefined
- void flushBuf(Char);
- void outputBuf();
- OutputCharStream *os_;
- enum { bufSize_ = 1024 };
- Char buf_[bufSize_];
- };
- inline
- OutputCharStream &OutputCharStream::put(Char c)
- {
- if (ptr_ < end_)
- *ptr_++ = c;
- else
- flushBuf(c);
- return *this;
- }
- inline
- OutputCharStream &OutputCharStream::operator<<(char c)
- {
- return put(Char(c));
- }
- inline
- OutputCharStream &OutputCharStream::operator<<(Newline)
- {
- #ifdef SP_HAVE_SETMODE
- put(Char('\r'));
- #endif
- return put(Char('\n'));
- }
- inline
- OutputCharStream &OutputCharStream::operator<<(const StringC &str)
- {
- return write(str.data(), str.size());
- }
- inline
- void OutputCharStream::setEscaper(Escaper f)
- {
- escaper_ = f;
- }
- inline
- void OutputCharStream::escape(OutputCharStream &s, Char c)
- {
- if (escaper_)
- (*escaper_)(s, c);
- }
- #ifdef SP_NAMESPACE
- }
- #endif
- #endif /* not OutputCharStream_INCLUDED */
|