diff options
author | sof <unknown> | 1998-12-09 17:52:09 +0000 |
---|---|---|
committer | sof <unknown> | 1998-12-09 17:52:09 +0000 |
commit | b77d3bcd339911ab9dfe4e095ded2f3a3edaa36c (patch) | |
tree | 3e4c5d2969c17596f49596527551a86e7c062968 | |
parent | 9c3ddd5aeb83e38944408a7cfac4471295cad093 (diff) | |
download | haskell-b77d3bcd339911ab9dfe4e095ded2f3a3edaa36c.tar.gz |
[project @ 1998-12-09 17:52:09 by sof]
Added unpackCStringST - unmarshal C strings promptly
-rw-r--r-- | ghc/lib/std/PrelPack.lhs | 22 |
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 |