X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIO.hs;h=b3d590a02d455ee733c4f861f154a7da50a30590;hb=c81f31abd5c00d14a95a94a7b66d9853fc6c03ac;hp=32018e9e62f9f1c168be8510c3efc617c95fe610;hpb=b706340c451952adf230b5b8daecad8a1f34d714;p=ghc-base.git diff --git a/GHC/IO.hs b/GHC/IO.hs index 32018e9..b3d590a 100644 --- a/GHC/IO.hs +++ b/GHC/IO.hs @@ -168,10 +168,13 @@ hGetLineBufferedLoop handle_ ref #endif xs <- unpack raw r off + + -- if eol == True, then off is the offset of the '\n' + -- otherwise off == w and the buffer is now empty. if eol - then do if w == off + 1 - then writeIORef ref buf{ bufRPtr=0, bufWPtr=0 } - else writeIORef ref buf{ bufRPtr = off + 1 } + then do if (w == off + 1) + then writeIORef ref buf{ bufRPtr=0, bufWPtr=0 } + else writeIORef ref buf{ bufRPtr = off + 1 } return (concat (reverse (xs:xss))) else do maybe_buf <- maybeFillReadBuffer (haFD handle_) True (haIsStream handle_) @@ -179,10 +182,12 @@ hGetLineBufferedLoop handle_ ref case maybe_buf of -- Nothing indicates we caught an EOF, and we may have a -- partial line to return. - Nothing -> let str = concat (reverse (xs:xss)) in - if not (null str) - then return str - else ioe_EOF + Nothing -> do + writeIORef ref buf{ bufRPtr=0, bufWPtr=0 } + let str = concat (reverse (xs:xss)) + if not (null str) + then return str + else ioe_EOF Just new_buf -> hGetLineBufferedLoop handle_ ref new_buf (xs:xss) @@ -607,7 +612,8 @@ hPutBuf :: Handle -- handle to write to -> Int -- number of bytes of data in buffer -> IO () hPutBuf handle ptr count - | count <= 0 = illegalBufferSize handle "hPutBuf" count + | count == 0 = return () + | count < 0 = illegalBufferSize handle "hPutBuf" count | otherwise = wantWritableHandle "hPutBuf" handle $ \ handle_@Handle__{ haFD=fd, haBuffer=ref, haIsStream=is_stream } -> do @@ -647,7 +653,8 @@ writeChunk fd ptr bytes = loop 0 bytes hGetBuf :: Handle -> Ptr a -> Int -> IO Int hGetBuf handle ptr count - | count <= 0 = illegalBufferSize handle "hGetBuf" count + | count == 0 = return 0 + | count < 0 = illegalBufferSize handle "hGetBuf" count | otherwise = wantReadableHandle "hGetBuf" handle $ \ handle_@Handle__{ haFD=fd, haBuffer=ref } -> do @@ -694,6 +701,7 @@ slurpFile fname = do ioError (userError "slurpFile: file too big") else do let sz_i = fromIntegral sz + if sz_i == 0 then return (nullPtr, 0) else do chunk <- mallocBytes sz_i r <- hGetBuf handle chunk sz_i hClose handle