1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
6 #include "OutputCharStream.h"
7 #include "CodingSystem.h"
12 namespace SP_NAMESPACE
{
15 OutputCharStream::OutputCharStream()
20 OutputCharStream::~OutputCharStream()
24 void OutputCharStream::setEscaper(Escaper
)
28 OutputCharStream
&OutputCharStream::write(const Char
*s
, size_t n
)
31 size_t spare
= end_
- ptr_
;
33 memcpy(ptr_
, s
, n
*sizeof(Char
));
38 memcpy(ptr_
, s
, spare
*sizeof(Char
));
49 OutputCharStream
&OutputCharStream::operator<<(const char *s
)
58 OutputCharStream
&OutputCharStream::operator<<(unsigned long n
)
60 char buf
[sizeof(unsigned long)*3 + 1];
61 sprintf(buf
, "%lu", n
);
65 OutputCharStream
&OutputCharStream::operator<<(int n
)
67 char buf
[sizeof(int)*3 + 2];
68 sprintf(buf
, "%d", n
);
72 EncodeOutputCharStream::EncodeOutputCharStream()
73 : buf_(0), byteStream_(0), escaper_(0)
77 EncodeOutputCharStream::EncodeOutputCharStream(OutputByteStream
*byteStream
,
78 const OutputCodingSystem
*codingSystem
)
80 byteStream_(byteStream
),
82 ownedEncoder_(codingSystem
->makeEncoder())
84 encoder_
= ownedEncoder_
.pointer();
85 encoder_
->setUnencodableHandler(this);
86 allocBuf(codingSystem
->fixedBytesPerChar());
87 encoder_
->startFile(byteStream_
);
90 EncodeOutputCharStream::EncodeOutputCharStream(OutputByteStream
*byteStream
,
93 byteStream_(byteStream
),
100 EncodeOutputCharStream::~EncodeOutputCharStream()
107 void EncodeOutputCharStream::open(OutputByteStream
*byteStream
,
108 const OutputCodingSystem
*codingSystem
)
112 byteStream_
= byteStream
;
113 ownedEncoder_
= codingSystem
->makeEncoder();
114 encoder_
= ownedEncoder_
.pointer();
115 encoder_
->setUnencodableHandler(this);
119 allocBuf(codingSystem
->fixedBytesPerChar());
120 encoder_
->startFile(byteStream_
);
123 void EncodeOutputCharStream::flush()
126 encoder_
->output(buf_
, ptr_
- buf_
, byteStream_
);
129 byteStream_
->flush();
132 void EncodeOutputCharStream::flushBuf(Char c
)
135 encoder_
->output(buf_
, ptr_
- buf_
, byteStream_
);
140 void EncodeOutputCharStream::allocBuf(int bytesPerChar
)
142 const int blockSize
= 1024;
143 size_t bufSize
= bytesPerChar
? blockSize
/bytesPerChar
: blockSize
;
144 ptr_
= buf_
= new Char
[bufSize
];
145 end_
= buf_
+ bufSize
;
148 void EncodeOutputCharStream::setEscaper(Escaper f
)
153 void EncodeOutputCharStream::handleUnencodable(Char c
, OutputByteStream
*)
155 EncodeOutputCharStream
tem(byteStream_
, encoder_
);
160 StrOutputCharStream::StrOutputCharStream()
161 : buf_(0), bufSize_(0)
166 StrOutputCharStream::~StrOutputCharStream()
171 void StrOutputCharStream::extractString(StringC
&str
)
173 str
.assign(buf_
, ptr_
- buf_
);
177 void StrOutputCharStream::flushBuf(Char c
)
179 size_t used
= ptr_
- buf_
;
180 size_t oldSize
= bufSize_
;
181 bufSize_
= oldSize
? 2*oldSize
: 10;
183 buf_
= new Char
[bufSize_
];
185 memcpy(buf_
, oldBuf
, oldSize
* sizeof(Char
));
192 void StrOutputCharStream::flush()
196 void StrOutputCharStream::sync(size_t length
)
198 ptr_
= buf_
+ length
;
199 end_
= buf_
+ bufSize_
;
202 RecordOutputCharStream::RecordOutputCharStream(OutputCharStream
*os
)
206 end_
= buf_
+ bufSize_
;
209 RecordOutputCharStream::~RecordOutputCharStream()
215 void RecordOutputCharStream::setEscaper(Escaper f
)
220 void RecordOutputCharStream::flush()
226 void RecordOutputCharStream::flushBuf(Char c
)
232 void RecordOutputCharStream::outputBuf()
238 case '\r': // translate RE to newline
240 os_
->write(start
, p
- start
);
244 case '\n': // ignore RS
246 os_
->write(start
, p
- start
);
255 os_
->write(start
, p
- start
);
257 end_
= buf_
+ bufSize_
;