{-# LANGUAGE ForeignFunctionInterface #-}
module System.Demangle(demangle) where
import qualified Data.ByteString.Char8 as BS
import Control.Exception
import Foreign.C
import Foreign.Marshal.Alloc
import Foreign.Ptr
import Data.CStringRepresentable
foreign import ccall "__cxa_demangle"
cxa_demangle :: CString -> CString -> Ptr CSize -> Ptr CInt -> IO CString
demangle :: CStringRepresentable s => s -> IO (Maybe s)
demangle str = toCString str $ \str' ->
bracket
(cxa_demangle str' nullPtr nullPtr nullPtr)
free
$ \res ->
if res == nullPtr
then pure Nothing
else do
res' <- fromCString res
pure $ Just res'