summaryrefslogtreecommitdiff
path: root/testsuite/tests/lib/IO/hGetPosn001.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/lib/IO/hGetPosn001.hs')
-rw-r--r--testsuite/tests/lib/IO/hGetPosn001.hs28
1 files changed, 28 insertions, 0 deletions
diff --git a/testsuite/tests/lib/IO/hGetPosn001.hs b/testsuite/tests/lib/IO/hGetPosn001.hs
new file mode 100644
index 0000000000..5a0d7d4827
--- /dev/null
+++ b/testsuite/tests/lib/IO/hGetPosn001.hs
@@ -0,0 +1,28 @@
+-- !!! Test file positioning
+
+module Main(main) where
+
+import Control.Monad
+import System.Directory (removeFile, doesFileExist)
+import System.IO
+import System.IO.Error
+
+main = do
+ hIn <- openFile "hGetPosn001.in" ReadMode
+ f <- doesFileExist "hGetPosn001.out"
+ when f (removeFile "hGetPosn001.out")
+ hOut <- openFile "hGetPosn001.out" ReadWriteMode
+ bof <- hGetPosn hIn
+ putStrLn (show bof) -- you can show HandlePosns
+ copy hIn hOut
+ hSetPosn bof
+ copy hIn hOut
+ hSeek hOut AbsoluteSeek 0
+ stuff <- hGetContents hOut
+ putStr stuff
+
+copy :: Handle -> Handle -> IO ()
+copy hIn hOut =
+ try (hGetChar hIn) >>=
+ either (\ err -> if isEOFError err then return () else error "copy")
+ ( \ x -> hPutChar hOut x >> copy hIn hOut)