X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO%2FHandle%2FInternals.hs;h=a948b655fc1bb0a112487e1410b57e14c2688aa4;hb=e3e2159dbf55edd3124d66533ff2c598f53aa811;hp=6fb66c740de275a9f26f46e8be0613ee24b0cead;hpb=82b61ac8e14df43f84afc20c6f6691f433f07951;p=ghc-base.git diff --git a/GHC/IO/Handle/Internals.hs b/GHC/IO/Handle/Internals.hs index 6fb66c7..a948b65 100644 --- a/GHC/IO/Handle/Internals.hs +++ b/GHC/IO/Handle/Internals.hs @@ -205,7 +205,8 @@ checkWritableHandle act h_@Handle__{..} buf <- readIORef haCharBuffer writeIORef haCharBuffer buf{ bufState = WriteBuffer } buf <- readIORef haByteBuffer - writeIORef haByteBuffer buf{ bufState = WriteBuffer } + buf' <- Buffered.emptyWriteBuffer haDevice buf + writeIORef haByteBuffer buf' act h_ _other -> act h_ @@ -521,6 +522,7 @@ mkHandle dev filepath ha_type buffered mb_codec nl finalizer other_side = do haBuffers = spares, haEncoder = mb_encoder, haDecoder = mb_decoder, + haCodec = mb_codec, haInputNL = inputNL nl, haOutputNL = outputNL nl, haOtherSide = other_side @@ -678,7 +680,7 @@ hLookAhead_ handle_@Handle__{..} = do debugIO :: String -> IO () #if defined(DEBUG_DUMP) debugIO s = do - withCStringLen (s++"\n") $ \(p,len) -> c_write 1 p (fromIntegral len) + withCStringLen (s++"\n") $ \(p,len) -> c_write 1 (castPtr p) (fromIntegral len) return () #else debugIO s = return () @@ -704,8 +706,8 @@ writeTextDevice h_@Handle__{..} cbuf = do debugIO ("writeTextDevice after encoding: cbuf=" ++ summaryBuffer cbuf' ++ " bbuf=" ++ summaryBuffer bbuf') - Buffered.flushWriteBuffer haDevice bbuf' - writeIORef haByteBuffer bbuf{bufL=0,bufR=0} + bbuf' <- Buffered.flushWriteBuffer haDevice bbuf' + writeIORef haByteBuffer bbuf' if not (isEmptyBuffer cbuf') then writeTextDevice h_ cbuf' else return () @@ -791,13 +793,19 @@ readTextDeviceNonBlocking h_@Handle__{..} cbuf = do bbuf1 <- if not (isEmptyBuffer bbuf0) then return bbuf0 else do - (r,bbuf1) <- Buffered.fillReadBuffer haDevice bbuf0 - if r == 0 then ioe_EOF else do -- raise EOF + (r,bbuf1) <- Buffered.fillReadBuffer0 haDevice bbuf0 + if isNothing r then ioe_EOF else do -- raise EOF return bbuf1 - (bbuf2,cbuf') <- case haDecoder of - Nothing -> latin1_decode bbuf1 cbuf - Just decoder -> (encode decoder) bbuf1 cbuf + (bbuf2,cbuf') <- + case haDecoder of + Nothing -> do + writeIORef haLastDecode (error "codec_state", bbuf1) + latin1_decode bbuf1 cbuf + Just decoder -> do + state <- getState decoder + writeIORef haLastDecode (state, bbuf1) + (encode decoder) bbuf1 cbuf writeIORef haByteBuffer bbuf2 return cbuf'