module Text.Show.Text.Foreign.Ptr (
showbPtr
, showbFunPtr
, showbIntPtrPrec
, showbWordPtr
, showbForeignPtr
) where
import Data.Text.Lazy.Builder (Builder)
import Foreign.ForeignPtr (ForeignPtr)
import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
import Foreign.Ptr (FunPtr, IntPtr, WordPtr, castFunPtrToPtr)
import GHC.Num (wordToInteger)
import GHC.Ptr (Ptr(..))
import GHC.Prim (addr2Int#, int2Word#, unsafeCoerce#)
import Prelude hiding (Show)
import Text.Show.Text.Class (Show(showb, showbPrec))
import Text.Show.Text.Data.Integral (showbHex, showbIntPrec, showbWord)
import Text.Show.Text.Utils ((<>), lengthB, replicateB, s)
#include "MachDeps.h"
showbPtr :: Ptr a -> Builder
showbPtr (Ptr a) = padOut . showbHex $ wordToInteger (int2Word# (addr2Int# a))
where
padOut :: Builder -> Builder
padOut ls = s '0' <> s 'x'
<> replicateB (2*SIZEOF_HSPTR lengthB ls) (s '0')
<> ls
showbFunPtr :: FunPtr a -> Builder
showbFunPtr = showb . castFunPtrToPtr
showbIntPtrPrec :: Int -> IntPtr -> Builder
showbIntPtrPrec k ip = showbIntPrec k $ unsafeCoerce# ip
showbWordPtr :: WordPtr -> Builder
showbWordPtr wp = showbWord $ unsafeCoerce# wp
showbForeignPtr :: ForeignPtr a -> Builder
showbForeignPtr = showb . unsafeForeignPtrToPtr
instance Show (Ptr a) where
showb = showbPtr
instance Show (FunPtr a) where
showb = showbFunPtr
instance Show IntPtr where
showbPrec = showbIntPtrPrec
instance Show WordPtr where
showb = showbWordPtr
instance Show (ForeignPtr a) where
showb = showbForeignPtr