summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorsof <unknown>1998-12-09 17:52:09 +0000
committersof <unknown>1998-12-09 17:52:09 +0000
commitb77d3bcd339911ab9dfe4e095ded2f3a3edaa36c (patch)
tree3e4c5d2969c17596f49596527551a86e7c062968 /ghc
parent9c3ddd5aeb83e38944408a7cfac4471295cad093 (diff)
downloadhaskell-b77d3bcd339911ab9dfe4e095ded2f3a3edaa36c.tar.gz
[project @ 1998-12-09 17:52:09 by sof]
Added unpackCStringST - unmarshal C strings promptly
Diffstat (limited to 'ghc')
-rw-r--r--ghc/lib/std/PrelPack.lhs22
1 files changed, 17 insertions, 5 deletions
diff --git a/ghc/lib/std/PrelPack.lhs b/ghc/lib/std/PrelPack.lhs
index b9f25273b3..8f009ccbd4 100644
--- a/ghc/lib/std/PrelPack.lhs
+++ b/ghc/lib/std/PrelPack.lhs
@@ -23,6 +23,7 @@ module PrelPack
packNBytesST, -- :: Int -> [Char] -> ST s (ByteArray Int)
unpackCString, -- :: Addr -> [Char]
+ unpackCStringST, -- :: Addr -> ST s [Char]
unpackNBytes, -- :: Addr -> Int -> [Char]
unpackNBytesST, -- :: Addr -> Int -> ST s [Char]
unpackNBytesAccST, -- :: Addr -> Int -> [Char] -> ST s [Char]
@@ -66,11 +67,22 @@ sequence of bytes into a list of @Char@s:
\begin{code}
unpackCString :: Addr{- ptr. to NUL terminated string-} -> [Char]
-unpackCString a@(A# addr) =
- if a == ``NULL'' then
- []
- else
- unpackCString# addr
+unpackCString a@(A# addr)
+ | a == nullAddr = []
+ | otherwise = unpackCString# addr
+
+unpackCStringST :: Addr{- ptr. to NUL terminated string-} -> ST s [Char]
+unpackCStringST a@(A# addr)
+ | a == nullAddr = return []
+ | otherwise = unpack 0#
+ where
+ unpack nh
+ | ch `eqChar#` '\0'# = return []
+ | otherwise = do
+ ls <- unpack (nh +# 1#)
+ return ((C# ch ) : ls)
+ where
+ ch = indexCharOffAddr# addr nh
unpackCString# :: Addr# -> [Char]
unpackCString# addr