module Magic.Operations(
magicFile, magicStdin,
magicString, magicCString,
magicSetFlags, magicCompile)
where
import Foreign.Ptr
import Foreign.C.String
import Magic.Types
import Foreign.C.Types
import Data.Word
import Foreign.C.String
import Foreign.C.Error
import Magic.Utils
import Magic.TypesLL
import Foreign.Marshal.Utils
magicFile :: Magic -> FilePath -> IO String
magicFile magic fp =
withMagicPtr magic (\cmagic ->
withCString fp (\cfp ->
do res <- throwErrorIfNull "magicFile" magic (magic_file cmagic cfp)
peekCString res
)
)
magicStdin :: Magic -> IO String
magicStdin magic =
withMagicPtr magic (\cmagic ->
do res <- throwErrorIfNull "magicStdin" magic (magic_file cmagic nullPtr)
peekCString res
)
magicString :: Magic -> String -> IO String
magicString m s = withCStringLen s (magicCString m)
magicCString :: Magic -> CStringLen -> IO String
magicCString magic (cstr, len) =
withMagicPtr magic (\cmagic ->
do res <- throwErrorIfNull "magicCString" magic (magic_buffer cmagic cstr (fromIntegral len))
peekCString res
)
magicSetFlags :: Magic -> [MagicFlag] -> IO ()
magicSetFlags m mfl = withMagicPtr m (\cmagic ->
checkIntError "magicSetFlags" m $ magic_setflags cmagic flags)
where flags = flaglist2int mfl
magicCompile :: Magic
-> Maybe String
-> IO ()
magicCompile m mstr = withMagicPtr m (\cm ->
case mstr of
Nothing -> worker cm nullPtr
Just x -> withCString x (worker cm)
)
where worker cm cs = checkIntError "magicCompile" m $ magic_compile cm cs
foreign import ccall unsafe "magic.h magic_file"
magic_file :: Ptr CMagic -> CString -> IO CString
foreign import ccall unsafe "magic.h magic_buffer"
magic_buffer :: Ptr CMagic -> CString -> Word32 -> IO CString
foreign import ccall unsafe "magic.h magic_setflags"
magic_setflags :: Ptr CMagic -> CInt -> IO CInt
foreign import ccall unsafe "magic.h magic_compile"
magic_compile :: Ptr CMagic -> CString -> IO CInt