summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsof <unknown>1999-09-19 19:30:04 +0000
committersof <unknown>1999-09-19 19:30:04 +0000
commite16cfb5521f186388e56c47eab95140e81eb1ee5 (patch)
tree4cf7600c5dbfd8e19ddfa5a7b2bba3072c0ebcf8
parent7bef35dc53e91566f1bb8c51cce5ef87123ac4df (diff)
downloadhaskell-e16cfb5521f186388e56c47eab95140e81eb1ee5.tar.gz
[project @ 1999-09-19 19:30:04 by sof]
* Re-exported IO.HandlePosn, i.e., type HandlePosition = Integer data HandlePosn = HandlePosn Handle HandlePosition * Added hTell :: Handle -> HandlePosition (merely a wrapper for IO.hGetPosn ) * Added hSetBinaryMode :: Handle -> Bool -> IO Bool for dynamically changing the 'translation mode' of a Handle. This stuff is only useful on platforms that make a distinction between text and binary files (e.g., Win32)
-rw-r--r--ghc/lib/exts/IOExts.lhs58
1 files changed, 53 insertions, 5 deletions
diff --git a/ghc/lib/exts/IOExts.lhs b/ghc/lib/exts/IOExts.lhs
index e83a78fd69..a0de1cc212 100644
--- a/ghc/lib/exts/IOExts.lhs
+++ b/ghc/lib/exts/IOExts.lhs
@@ -60,6 +60,12 @@ module IOExts
, unsafePtrEq
, freeHaskellFunctionPtr
+
+ , HandlePosition
+ , HandlePosn(..)
+ , hTell -- :: Handle -> IO HandlePosition
+
+ , hSetBinaryMode -- :: Handle -> Bool -> IO Bool
) where
@@ -182,9 +188,12 @@ trace string expr = unsafePerformIO $ do
fd <- getHandleFd stderr
hPutStr stderr string
hPutChar stderr '\n'
- _ccall_ PostTraceHook fd
+ postTraceHook fd
return expr
+
+foreign import "PostTraceHook" postTraceHook :: Int -> IO ()
#endif
+
\end{code}
Not something you want to call normally, but useful
@@ -192,10 +201,8 @@ in the cases where you do want to flush stuff out of
the heap or make sure you've got room enough
\begin{code}
-#ifdef __HUGS__
-#else
-performGC :: IO ()
-performGC = _ccall_GC_ performGC
+#ifndef __HUGS__
+foreign import "performGC" performGC :: IO ()
#endif
\end{code}
@@ -264,3 +271,44 @@ withStdin h a = withHandleFor h stdin a
withStdout h a = withHandleFor h stdout a
withStderr h a = withHandleFor h stderr a
\end{code}
+
+@hTell@ is the lower-level version of @hGetPosn@ - return the
+position, without bundling it together with the handle itself:
+
+\begin{code}
+hTell :: Handle -> IO HandlePosition
+hTell h = do
+ (HandlePosn _ x) <- hGetPosn h
+ return x
+\end{code}
+
+@hSetBinaryMode@ lets you change the translation mode for a handle.
+On some platforms (e.g., Win32) a distinction is made between being in
+'text mode' or 'binary mode', with the former terminating lines
+by \r\n rather than just \n.
+
+Debating the Winnitude or otherwise of such a scheme is less than
+interesting -- it's there, so we have to cope.
+
+A side-effect of calling @hSetBinaryMode@ is that the output buffer
+(if any) is flushed prior to changing the translation mode.
+
+\begin{code}
+hSetBinaryMode :: Handle -> Bool -> IO Bool
+hSetBinaryMode handle is_binary = do
+ -- is_binary = True => set translation mode to binary.
+ wantRWHandle "hSetBinaryMode" handle $ \ handle_ -> do
+ let fo = haFO__ handle_
+ rc <- setBinaryMode fo flg
+ if rc >= 0 then
+ return (int2Bool rc)
+ else
+ constructErrorAndFail "hSetBinaryMode"
+ where
+ flg | is_binary = 1
+ | otherwise = 0
+
+ int2Bool 0 = False
+ int2Bool _ = True
+
+\end{code}