Improve encoding API

db4
Slava Pestov 2008-06-12 03:49:29 -05:00
parent d6307cdeda
commit 17001b40cd
3 changed files with 31 additions and 6 deletions

View File

@ -14,7 +14,7 @@ GENERIC: encode-char ( char stream encoding -- )
GENERIC: <decoder> ( stream encoding -- newstream )
: replacement-char HEX: fffd ;
: replacement-char HEX: fffd ; inline
TUPLE: decoder stream code cr ;
@ -121,14 +121,28 @@ M: encoder stream-flush encoder-stream stream-flush ;
INSTANCE: encoder plain-writer
PRIVATE>
: re-encode ( stream encoding -- newstream )
over encoder? [ >r encoder-stream r> ] when <encoder> ;
GENERIC# re-encode 1 ( stream encoding -- newstream )
M: object re-encode <encoder> ;
M: encoder re-encode [ stream>> ] dip re-encode ;
: encode-output ( encoding -- )
output-stream [ swap re-encode ] change ;
: re-decode ( stream encoding -- newstream )
over decoder? [ >r decoder-stream r> ] when <decoder> ;
: with-encoded-output ( encoding quot -- )
[ [ output-stream get ] dip re-encode ] dip
with-output-stream* ; inline
GENERIC# re-decode 1 ( stream encoding -- newstream )
M: object re-decode <decoder> ;
M: decoder re-decode [ stream>> ] dip re-decode ;
: decode-input ( encoding -- )
input-stream [ swap re-decode ] change ;
: with-decoded-input ( encoding quot -- )
[ [ input-stream get ] dip re-decode ] dip
with-input-stream* ; inline

View File

@ -1,4 +1,5 @@
USING: io.encodings.string io.encodings.8-bit tools.test strings arrays ;
USING: io.encodings.string io.encodings.8-bit
io.encodings.8-bit.private tools.test strings arrays ;
IN: io.encodings.8-bit.tests
[ B{ CHAR: f CHAR: o CHAR: o } ] [ "foo" latin1 encode ] unit-test
@ -8,3 +9,6 @@ IN: io.encodings.8-bit.tests
[ "bar" ] [ "bar" latin1 decode ] unit-test
[ { CHAR: b 233 CHAR: r } ] [ { CHAR: b 233 CHAR: r } latin1 decode >array ] unit-test
[ { HEX: fffd HEX: 20AC } ] [ { HEX: 81 HEX: 80 } windows-1252 decode >array ] unit-test
[ t ] [ \ latin1 8-bit-encoding? ] unit-test
[ "bar" ] [ "bar" \ latin1 decode ] unit-test

View File

@ -73,6 +73,13 @@ M: 8-bit decode-char
: define-8-bit-encoding ( name stream -- )
>r in get create r> parse-file make-8-bit ;
PREDICATE: 8-bit-encoding < word
word-def dup length 1 = [ first 8-bit? ] [ drop f ] if ;
M: 8-bit-encoding <encoder> word-def first <encoder> ;
M: 8-bit-encoding <decoder> word-def first <decoder> ;
PRIVATE>
[