1 ! Copyright (C) 2009 Daniel Ehrenberg.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: combinators endian io io.encodings io.encodings.iana
4 io.encodings.utf16 kernel sequences ;
9 utf32be "UTF-32BE" register-encoding
13 utf32le "UTF-32LE" register-encoding
17 utf32 "UTF-32" register-encoding
23 : char> ( stream quot -- ch )
24 swap [ 4 ] dip stream-read dup length {
27 [ 3drop replacement-char ]
30 M: utf32be decode-char drop [ be> ] char> ;
32 M: utf32le decode-char drop [ le> ] char> ;
36 : >char ( char stream quot -- )
37 4 swap curry dip stream-write ; inline
39 M: utf32be encode-char drop [ >be ] >char ;
41 M: utf32le encode-char drop [ >le ] >char ;
45 CONSTANT: bom-le B{ 0xff 0xfe 0 0 }
47 CONSTANT: bom-be B{ 0 0 0xfe 0xff }
49 : bom>le/be ( bom -- le/be )
50 dup bom-le sequence= [
53 bom-be sequence= [ utf32be ] [ missing-bom ] if
57 drop 4 over stream-read bom>le/be <decoder> ;
60 drop bom-le over stream-write utf32le <encoder> ;