From: sof Date: Mon, 10 May 1999 16:55:43 +0000 (+0000) Subject: [project @ 1999-05-10 16:55:43 by sof] X-Git-Tag: Approximately_9120_patches~6234 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=d993f5b07a82df12aaba033f42925693ac524752;p=ghc-hetmet.git [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. --- 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}