On Sat, Aug 21, 2010 at 11:58, Judah Jacobson <judah.jacob...@gmail.com> wrote:
> You should note that in ghc>=6.12, hWaitForInput tries to decode the
> next character of input based on to the Handle's encoding.  As a
> result, it will block if the next multibyte sequence is incomplete,
> and it will throw an error if a multibyte sequence gets split between
> two chunks.
>
> I worked around this problem in Haskeline by temporarily setting stdin
> to BinaryMode; you may want to do something similar.
>
> Also, this issue caused a bug in bytestring with ghc-6.12:
> http://hackage.haskell.org/trac/ghc/ticket/3808
> which will be resolved by the new function 'hGetBufSome' (in ghc-6.14)
> that blocks only when there's no data to read:
> http://hackage.haskell.org/trac/ghc/ticket/4046
> That function might be useful for your package, though not portable to
> other implementations or older GHC versions.

You should not be reading bytestrings from text-mode handles.

The more I think about it, the more having a single Handle type for
both text and binary data causes problems. There should be some
separation so users don't accidentally use a text handle with binary
functions, and vice-versa:

openFile :: FilePath -> IOMode -> IO TextHandle
openBinaryFile :: FIlePath -> IOMode -> IO BinaryHandle
hGetBuf :: BinaryHandle -> Ptr a -> Int -> IO Int
Data.ByteString.hGet :: BinaryHandle -> IO ByteString
-- etc

then the enumerators would simply require the correct handle type:

Data.Enumerator.IO.enumHandle :: BinaryHandle -> Enumerator
SomeException ByteString IO b
Data.Enumerator.Text.enumHandle :: TextHandle -> Enumerator
SomeException Text IO b

I suppose the enumerators could verify the handle mode and throw an
exception if it's incorrect -- at least that way, it will fail
consistently rather than only in rare occasions.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to