GENERIC: <decoder> ( stream encoding -- newstream )
-CONSTANT: replacement-char HEX: fffd
+CONSTANT: replacement-char 0xfffd
TUPLE: decoder { stream read-only } { code read-only } { cr boolean } ;
-INSTANCE: decoder noncopying-reader
+INSTANCE: decoder input-stream
ERROR: decode-error ;
GENERIC: <encoder> ( stream encoding -- newstream )
TUPLE: encoder { stream read-only } { code read-only } ;
+INSTANCE: encoder output-stream
ERROR: encode-error ;
: >decoder< ( decoder -- stream encoding )
[ stream>> ] [ code>> ] bi ; inline
-: fix-read1 ( stream char -- char )
- over cr>> [
- over cr-
- dup CHAR: \n = [
- drop dup stream-read1
- ] when
- ] when nip ; inline
-
M: decoder stream-element-type
drop +character+ ; inline
] [ (finish-read) ] if*
] if ; inline recursive
-M: decoder stream-read-unsafe ( n buf decoder -- count )
+M: decoder stream-read-unsafe
pick 0 = [ 3drop 0 ] [
(read-first) [
0 (store-read)
] [ 2drop 2drop 0 ] if*
] if ; inline
-M: decoder stream-read-partial-unsafe stream-read-unsafe ; inline
+M: decoder stream-contents
+ (stream-contents-by-element) ;
: line-ends/eof ( stream str -- str ) f like swap cr- ; inline