! Copyright (C) 2006, 2009 Daniel Ehrenberg. ! See http://factorcode.org/license.txt for BSD license. USING: math kernel sequences sbufs vectors namespaces io.binary io.encodings combinators splitting io byte-arrays ; IN: io.encodings.utf16 SINGLETON: utf16be SINGLETON: utf16le SINGLETON: utf16 ERROR: missing-bom ; utf16be ( stream char -- ) dup HEX: FFFF > [ HEX: 10000 - 2dup encode-first stream-write2 encode-second stream-write2 ] [ h>b/b swap stream-write2 ] if ; M: utf16be encode-char ( char stream encoding -- ) drop swap char>utf16be ; : char>utf16le ( char stream -- ) dup HEX: FFFF > [ HEX: 10000 - 2dup encode-first swap stream-write2 encode-second swap stream-write2 ] [ h>b/b stream-write2 ] if ; M: utf16le encode-char ( char stream encoding -- ) drop swap char>utf16le ; ! UTF-16 CONSTANT: bom-le B{ HEX: ff HEX: fe } CONSTANT: bom-be B{ HEX: fe HEX: ff } : bom>le/be ( bom -- le/be ) dup bom-le sequence= [ drop utf16le ] [ bom-be sequence= [ utf16be ] [ missing-bom ] if ] if ; M: utf16 ( stream utf16 -- decoder ) drop 2 over stream-read bom>le/be ; M: utf16 ( stream utf16 -- encoder ) drop bom-le over stream-write utf16le ; PRIVATE>