From b77d3bcd339911ab9dfe4e095ded2f3a3edaa36c Mon Sep 17 00:00:00 2001 From: sof Date: Wed, 9 Dec 1998 17:52:09 +0000 Subject: [PATCH] [project @ 1998-12-09 17:52:09 by sof] Added unpackCStringST - unmarshal C strings promptly --- ghc/lib/std/PrelPack.lhs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/ghc/lib/std/PrelPack.lhs b/ghc/lib/std/PrelPack.lhs index b9f2527..8f009cc 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 -- 1.7.10.4