Blame include/OutputCharStream.h

Packit 8a864e
// Copyright (c) 1994 James Clark
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#ifndef OutputCharStream_INCLUDED
Packit 8a864e
#define OutputCharStream_INCLUDED 1
Packit 8a864e
Packit 8a864e
#include "types.h"
Packit 8a864e
#include <stddef.h>
Packit 8a864e
#include "Link.h"
Packit 8a864e
#include "StringC.h"
Packit 8a864e
#include "Owner.h"
Packit 8a864e
#include "CodingSystem.h"
Packit 8a864e
#include "OutputByteStream.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
class SP_API OutputCharStream : public Link {
Packit 8a864e
public:
Packit 8a864e
  enum Newline { newline };
Packit 8a864e
  typedef void (*Escaper)(OutputCharStream &, Char);
Packit 8a864e
  OutputCharStream();
Packit 8a864e
  virtual ~OutputCharStream();
Packit 8a864e
  OutputCharStream &put(Char);
Packit 8a864e
  OutputCharStream &write(const Char *, size_t);
Packit 8a864e
  virtual void flush() = 0;
Packit 8a864e
  virtual void setEscaper(Escaper);
Packit 8a864e
Packit 8a864e
  OutputCharStream &operator<<(char);
Packit 8a864e
  OutputCharStream &operator<<(const char *);
Packit 8a864e
  OutputCharStream &operator<<(const StringC &);
Packit 8a864e
  OutputCharStream &operator<<(unsigned long);
Packit 8a864e
  OutputCharStream &operator<<(int);
Packit 8a864e
  OutputCharStream &operator<<(Newline);
Packit 8a864e
private:
Packit 8a864e
  OutputCharStream(const OutputCharStream &);	// undefined
Packit 8a864e
  void operator=(const OutputCharStream &);	// undefined
Packit 8a864e
Packit 8a864e
  virtual void flushBuf(Char) = 0;
Packit 8a864e
protected:
Packit 8a864e
  Char *ptr_;
Packit 8a864e
  Char *end_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class SP_API EncodeOutputCharStream : public OutputCharStream,
Packit 8a864e
                            private Encoder::Handler {
Packit 8a864e
public:
Packit 8a864e
  EncodeOutputCharStream();
Packit 8a864e
  // the OutputByteStream will not be deleted
Packit 8a864e
  EncodeOutputCharStream(OutputByteStream *, const OutputCodingSystem *);
Packit 8a864e
  ~EncodeOutputCharStream();
Packit 8a864e
  void open(OutputByteStream *, const OutputCodingSystem *);
Packit 8a864e
  void flush();
Packit 8a864e
  void setEscaper(Escaper);
Packit 8a864e
private:
Packit 8a864e
  EncodeOutputCharStream(const EncodeOutputCharStream &); // undefined
Packit 8a864e
  void operator=(const EncodeOutputCharStream &);	    // undefined
Packit 8a864e
  EncodeOutputCharStream(OutputByteStream *, Encoder *);
Packit 8a864e
  void allocBuf(int bytesPerChar);
Packit 8a864e
  void flushBuf(Char);
Packit 8a864e
  void handleUnencodable(Char c, OutputByteStream *);
Packit 8a864e
  Char *buf_;
Packit 8a864e
  OutputByteStream *byteStream_;
Packit 8a864e
  Encoder *encoder_;
Packit 8a864e
  Owner<Encoder> ownedEncoder_;
Packit 8a864e
  Escaper escaper_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class SP_API StrOutputCharStream : public OutputCharStream {
Packit 8a864e
public:
Packit 8a864e
  StrOutputCharStream();
Packit 8a864e
  ~StrOutputCharStream();
Packit 8a864e
  void extractString(StringC &);
Packit 8a864e
  void flush();
Packit 8a864e
private:
Packit 8a864e
  void flushBuf(Char);
Packit 8a864e
  void sync(size_t);
Packit 8a864e
  StrOutputCharStream(const StrOutputCharStream &); // undefined
Packit 8a864e
  void operator=(const StrOutputCharStream &);	    // undefined
Packit 8a864e
  Char *buf_;
Packit 8a864e
  size_t bufSize_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class SP_API RecordOutputCharStream : public OutputCharStream {
Packit 8a864e
public:
Packit 8a864e
  RecordOutputCharStream(OutputCharStream *);
Packit 8a864e
  ~RecordOutputCharStream();
Packit 8a864e
  void flush();
Packit 8a864e
  void setEscaper(Escaper);
Packit 8a864e
private:
Packit 8a864e
  RecordOutputCharStream(const RecordOutputCharStream &); // undefined
Packit 8a864e
  void operator=(const RecordOutputCharStream &);	  // undefined
Packit 8a864e
  void flushBuf(Char);
Packit 8a864e
  void outputBuf();
Packit 8a864e
Packit 8a864e
  OutputCharStream *os_;
Packit 8a864e
  enum { bufSize_ = 1024 };
Packit 8a864e
  Char buf_[bufSize_];
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
OutputCharStream &OutputCharStream::put(Char c)
Packit 8a864e
{
Packit 8a864e
  if (ptr_ < end_)
Packit 8a864e
    *ptr_++ = c;
Packit 8a864e
  else
Packit 8a864e
    flushBuf(c);
Packit 8a864e
  return *this;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
OutputCharStream &OutputCharStream::operator<<(char c)
Packit 8a864e
{
Packit 8a864e
  return put(Char(c));
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
OutputCharStream &OutputCharStream::operator<<(Newline)
Packit 8a864e
{
Packit 8a864e
  put(Char(SP_LINE_TERM1));
Packit 8a864e
#ifdef SP_LINE_TERM2
Packit 8a864e
  put(Char(SP_LINE_TERM2));
Packit 8a864e
#endif
Packit 8a864e
  return *this;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
OutputCharStream &OutputCharStream::operator<<(const StringC &str)
Packit 8a864e
{
Packit 8a864e
  return write(str.data(), str.size());
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#endif /* not OutputCharStream_INCLUDED */