1 /* $XConsortium: SJISCodingSystem.C /main/1 1996/07/29 17:03:20 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
9 #include "SJISCodingSystem.h"
13 namespace SP_NAMESPACE {
16 class SJISDecoder : public Decoder {
19 size_t decode(Char *, const char *, size_t, const char **);
23 class SJISEncoder : public Encoder {
26 void output(const Char *, size_t, streambuf *);
29 Decoder *SJISCodingSystem::makeDecoder() const
31 return new SJISDecoder;
34 Encoder *SJISCodingSystem::makeEncoder() const
36 return new SJISEncoder;
40 SJISDecoder::SJISDecoder()
44 size_t SJISDecoder::decode(Char *to, const char *s,
45 size_t slen, const char **rest)
49 unsigned char c = *(unsigned char *)s;
55 else if (129 <= c && c <= 159) {
60 unsigned char c2 = *(unsigned char *)s++;
61 unsigned short n = ((c - 112) << 9) | c2;
62 if (64 <= c2 && c2 <= 127)
73 else if (224 <= c && c <= 239) {
78 unsigned char c2 = *(unsigned char *)s++;
79 unsigned short n = ((c - 176) << 9) | c2;
80 if (64 <= c2 && c2 <= 127)
91 else if (161 <= c && c <= 223) {
106 SJISEncoder::SJISEncoder()
110 // FIXME handle errors from streambuf::sputc
112 void SJISEncoder::output(const Char *s, size_t n, streambuf *sb)
114 for (; n > 0; s++, n--) {
116 unsigned short mask = (unsigned short)(c & 0x8080);
118 sb->sputc(char(c & 0xff));
119 else if (mask == 0x8080) {
120 unsigned char c1 = (c >> 8) & 0x7f;
121 unsigned char c2 = c & 0x7f;
126 out1 = ((c1 + 1) >> 1) + 112;
128 out1 = ((c1 + 1) >> 1) + 176;
144 if (33 <= c2 && c2 <= 126)
154 handleUnencodable(c, sb);
157 handleUnencodable(c, sb);
159 else if (mask == 0x0080) {
160 if (161 <= c && c <= 223)
161 sb->sputc(char(c & 0xff));
163 handleUnencodable(c, sb);
166 handleUnencodable(c, sb);
174 #else /* not SP_MULTI_BYTE */
177 static char non_empty_translation_unit; // sigh
180 #endif /* not SP_MULTI_BYTE */