2 * Programming Language SOOPY
3 * (Simple Object Oriented Programming sYstem)
5 * Copyright (C) 2002,2003 SUZUKI Jun
7 * URL: http://sourceforge.jp/projects/soopy/
8 * License: GPL(GNU General Public License)
11 * $Id: EucJPRW.cpp,v 1.27 2004/05/22 05:22:34 randy Exp $
22 SpChar EucJPReadEncoder::readCh()
30 if(eof()){ return (SpChar)NULL; }
31 c = reader->ReadChar();
32 if(isEOF(c)){ return (SpChar)NULL; }
34 if(!EqualCharCode(c, CodeJIS)){
37 ch = SpCharGetChar(c);
53 SpChar EucJPReadDecoder::readCh()
58 if(eof()){ return (SpChar)NULL; }
59 c = reader->ReadChar();
60 if(isEOF(c)){ return (SpChar)NULL; }
62 if(0xA1 <= ch1 && ch1 <= 0xFE){ // JIS X 0208
63 c = reader->ReadChar();
65 ch1 = ch1 - 0xA0 + 0x20;
66 ch2 = ch2 - 0xA0 + 0x20;
67 return MakeSpChar(CodeJIS, (ch1<<8) | ch2);
69 return MakeSpChar(CodeJIS, c);
73 * Class EucJPWriteEncoder
76 void EucJPWriteEncoder::WriteChar(SpChar c)
80 if(!EqualCharCode(c, CodeJIS)){
84 ch = SpCharGetChar(c);
88 writer->WriteChar((char)ten);
93 writer->WriteChar((char)ku);
95 writer->WriteChar((char)ten);
100 * Class EucJPWriteDecoder
103 void EucJPWriteDecoder::WriteChar(SpChar c)
108 if(c > 0xFF){ // not jis
110 writer->WriteChar(c);
112 writeTextTronCode(c);
114 }else if(0xA1 <= c && c <= 0xFE){ // JIS X 0208
116 if(0xA1 <= ch1 && ch1 <= 0xDF){ // when hankaku KANA
117 // write Zenkaku KANA
123 writer->WriteChar(c);
130 ch1 = ch1 - 0xA0 + 0x20;
131 ch2 = ch2 - 0xA0 + 0x20;
132 writer->WriteChar(MakeSpChar(CodeJIS, (ch1<<8) | ch2));
140 SpValue& eucjp_openIn(SpValue& v)
142 SpValue name = v.eval();
143 if(!name.isString()){
144 throw SpException("filename is not string (EucJP.openIn)");
146 SpString* str = name.asString();
147 char* filename = (char*)str->toCStringWithEncoder();
148 ifstream* fin = new ifstream;
150 fin->open(filename, ios::binary);
156 throw SpException("can't open file");
158 FileStreamReader* sr = new FileStreamReader(fin, filename);
159 ReadEncoder* encoder = new EucJPReadDecoder(sr);
160 return SpObjectResult(encoder);
163 SpValue& eucjp_openOut(SpValue& v)
165 SpValue name = v.eval();
166 if(!name.isString()){
167 throw SpException("filename is not string (EucJP.openOut)");
169 SpString* str = name.asString();
170 char* filename = (char*)str->toCStringWithEncoder();
171 ofstream* fout = new ofstream;
173 fout->open(filename, ios::binary);
175 fout->open(filename);
179 throw SpException("can't open file");
181 FileStreamWriter* sw = new FileStreamWriter(fout, filename);
182 WriteEncoder* encoder = new EucJPWriteEncoder(sw);
183 return SpObjectResult(encoder);
186 SpValue& eucjp_openAppend(SpValue& v)
188 SpValue name = v.eval();
189 if(!name.isString()){
190 throw SpException("filename is not string (EucJP.openAppend)");
192 SpString* str = name.asString();
193 char* filename = (char*)str->toCStringWithEncoder();
194 ofstream* fout = new ofstream;
196 fout->open(filename, ios::app | ios::binary);
198 fout->open(filename, ios::app);
202 throw SpException("can't open file");
204 FileStreamWriter* sw = new FileStreamWriter(fout, filename);
205 WriteEncoder* encoder = new EucJPWriteEncoder(sw);
206 // static SpValue result;
207 // result.setNewObject(encoder);
209 return SpObjectResult(encoder);
212 SpValue& eucjp_encoderIn(SpValue& v)
214 SpValue r = v.eval();
216 throw SpException("not reader (EucJP.encoderIn)");
218 Reader* reader = r.asReader();
219 ReadEncoder* encoder = new EucJPReadEncoder(reader);
220 return SpObjectResult(encoder);
223 SpValue& eucjp_decoderIn(SpValue& v)
225 SpValue r = v.eval();
227 throw SpException("not reader (EucJP.decoderIn)");
229 Reader* reader = r.asReader();
230 ReadEncoder* encoder = new EucJPReadDecoder(reader);
231 return SpObjectResult(encoder);
234 SpValue& eucjp_encoderOut(SpValue& v)
236 SpValue w = v.eval();
238 throw SpException("not writer (EucJP.encoderOut)");
240 Writer* writer = w.asWriter();
241 WriteEncoder* encoder = new EucJPWriteEncoder(writer);
242 return SpObjectResult(encoder);
245 SpValue& eucjp_decoderOut(SpValue& v)
247 SpValue w = v.eval();
249 throw SpException("not writer (EucJP.decoderOut)");
251 Writer* writer = w.asWriter();
252 WriteEncoder* encoder = new EucJPWriteDecoder(writer);
253 return SpObjectResult(encoder);
259 SpValue SymEucJP(new SpSymbol("eucjp"));
260 SpNameSpace* ns = new SpNameSpace;
262 PMainNameSpace->internConst(SymEucJP, NSEucJP);
264 SpValue PrimOpenIn(new SpPrim1(&eucjp_openIn));
265 ns->internConst(SymOpenIn, PrimOpenIn);
266 SpValue PrimEncoderIn(new SpPrim1(&eucjp_encoderIn));
267 ns->internConst(SymEncoderIn, PrimEncoderIn);
268 SpValue PrimDecoderIn(new SpPrim1(&eucjp_decoderIn));
269 ns->internConst(SymDecoderIn, PrimDecoderIn);
271 SpValue PrimOpenOut(new SpPrim1(&eucjp_openOut));
272 ns->internConst(SymOpenOut, PrimOpenOut);
273 SpValue PrimOpenAppend(new SpPrim1(&eucjp_openAppend));
274 ns->internConst(SymOpenAppend, PrimOpenAppend);
275 SpValue PrimEncoderOut(new SpPrim1(&eucjp_encoderOut));
276 ns->internConst(SymEncoderOut, PrimEncoderOut);
277 SpValue PrimDecoderOut(new SpPrim1(&eucjp_decoderOut));
278 ns->internConst(SymDecoderOut, PrimDecoderOut);