[project @ 1999-05-10 16:55:43 by sof]
authorsof <unknown>
Mon, 10 May 1999 16:55:43 +0000 (16:55 +0000)
committersof <unknown>
Mon, 10 May 1999 16:55:43 +0000 (16:55 +0000)
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

index 6670ff3..5b5aef6 100644 (file)
@@ -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}