[fill out System.IO routines
John Meacham <john@repetae.net>**20080312045536] hunk ./lib/base/System/IO.hs 3
+    BufferMode(..),
hunk ./lib/base/System/IO.hs 6
-    BufferMode(..),
hunk ./lib/base/System/IO.hs 7
+    hClose,
+    hFileSize,
+    hSeek,
+    hTell,
+    hFlush,
+    hGetBuf,
+    hGetPosn,
+    hSetPosn,
+    hGetContents,
+    hIsOpen,
+    hPrint,
+    hPutBuf,
hunk ./lib/base/System/IO.hs 22
-    hPrint,
-    try,hFlush,stdin,stdout,stderr,
-    hGetContents,
-    hClose,
hunk ./lib/base/System/IO.hs 23
-    hPutBuf,
-    hGetBuf,
-    hIsOpen
+    withFile,
+    stdin,stdout,stderr,
+    try
hunk ./lib/base/System/IO.hs 28
-{-
-module IO(
-    Handle,
-    IOMode(..),
-    BufferMode(..),
-    SeekMode(..),
-    stdin,
-    stdout,
-    stderr
-    )  where
-    -}
-
hunk ./lib/base/System/IO.hs 36
+import Data.Int
hunk ./lib/base/System/IO.hs 44
+type HandlePosn = Integer
+
hunk ./lib/base/System/IO.hs 54
+withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r
+withFile fp iom action = do
+    h <- openFile fp iom
+    r <- action h
+    hClose h
+    return r
hunk ./lib/base/System/IO.hs 90
+
hunk ./lib/base/System/IO.hs 102
+hTell :: Handle -> IO Integer
+hTell h = withHandle h $ \ptr -> fmap fromIntegral (c_ftell ptr)
+
+hSeek :: Handle -> SeekMode -> Integer -> IO ()
+hSeek h v w = withHandle h $ \ptr -> do
+    let sm x = case x of
+            AbsoluteSeek -> c_SEEK_SET
+            RelativeSeek -> c_SEEK_CUR
+            SeekFromEnd  -> c_SEEK_END
+    c_fseek ptr (fromIntegral w) (sm v)
+    return ()
+
+hGetPosn :: Handle -> IO HandlePosn
+hGetPosn h = hTell h
hunk ./lib/base/System/IO.hs 117
+hSetPosn :: Handle -> HandlePosn -> IO ()
+hSetPosn h hp = hSeek h AbsoluteSeek hp
hunk ./lib/base/System/IO.hs 132
+hFileSize :: Handle -> IO Integer
+hFileSize h = do
+    cp <- hTell h
+    hSeek h SeekFromEnd 0
+    fl <- hTell h
+    hSeek h AbsoluteSeek cp
+    return fl
hunk ./lib/base/System/IO.hs 143
---hIsEOF :: Handle -> IO Bool
-
hunk ./lib/base/System/IO.hs 151
+foreign import ccall "stdio.h ftell" c_ftell :: Ptr Handle -> IO IntMax                  -- XXX
+foreign import ccall "stdio.h fseek" c_fseek :: Ptr Handle -> IntMax -> CInt -> IO CInt  -- XXX
+
+foreign import primitive "const.SEEK_SET" c_SEEK_SET :: CInt
+foreign import primitive "const.SEEK_CUR" c_SEEK_CUR :: CInt
+foreign import primitive "const.SEEK_END" c_SEEK_END :: CInt