From d993f5b07a82df12aaba033f42925693ac524752 Mon Sep 17 00:00:00 2001 From: sof Date: Mon, 10 May 1999 16:55:43 +0000 Subject: [PATCH] [project @ 1999-05-10 16:55:43 by sof] The implementation of hGetLine, as given in the report, doesn't handle partial lines on unbuffered handles that well (not at all, as it turns out). Fixed. --- ghc/lib/std/IO.lhs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ghc/lib/std/IO.lhs b/ghc/lib/std/IO.lhs index 6670ff3..5b5aef6 100644 --- a/ghc/lib/std/IO.lhs +++ b/ghc/lib/std/IO.lhs @@ -216,14 +216,34 @@ hGetChar handle = then return (chr intc) else constructErrorAndFail "hGetChar" +{- + If EOF is reached before EOL is encountered, ignore the + EOF and return the partial line. Next attempt at calling + hGetLine on the handle will yield an EOF IO exception though. +-} hGetLine :: Handle -> IO String hGetLine h = do c <- hGetChar h - if c == '\n' - then return "" + if c == '\n' then + return "" else do - s <- hGetLine h - return (c:s) + l <- getRest + return (c:l) + where + getRest = do + c <- + catch + (hGetChar h) + (\ err -> do + if isEOFError err then + return '\n' + else + ioError err) + if c == '\n' then + return "" + else do + s <- getRest + return (c:s) \end{code} -- 1.7.10.4