cppfilt-0.1.0.0: src/System/Demangle.hs
{-# LANGUAGE ForeignFunctionInterface #-}
{-|
Module : System.Demangle
Description : Functions for demangling C++ names
Stability : experimental
Portability : wherever gcc lives
This module provides bindings to the platform C++ ABI demangling routines
(where the platform is currently limited to gcc). Any string-like type
implementing 'CStringRepresentable' can be used, though strict bytestrings are
the most performant.
This module provides the raw 'IO'-living functions. Thin wrappers pretending
to be pure live in the "System.Demangle.Pure" module.
-}
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
-- |Try to demangle a mangled C++ name.
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'