{-# LINE 1 "src/Magic/Types.hsc" #-}
{-  -*- Mode: haskell; -*-
Haskell magic Interface
Copyright (C) 2005 John Goerzen <jgoerzen@complete.org>

This code is under a 3-clause BSD license; see COPYING for details.
-}

{- |
   Module     : Magic.Types
   Copyright  : Copyright (C) 2005 John Goerzen
   License    : BSD-3-Clause

   Maintainer : Philippe <philippedev101\@gmail.com>
   Stability  : provisional
   Portability: portable

The core types of the binding: the opaque 'Magic' handle, the 'MagicFlag'
enumeration (re-exported from "Magic.Data") and the 'MagicParam' tunables.

Written by John Goerzen.
-}

module Magic.Types(Magic,
                   CMagic,
                   MagicFlag(..),
                   MagicParam(..))
where
import Foreign.ForeignPtr
import Magic.Data



-- | Phantom type standing in for the C @magic_t@ cookie. It appears only as the
-- argument of a 'Foreign.ForeignPtr.ForeignPtr' (the 'Magic' handle) and has no
-- values of its own.
data CMagic

{- | The magic handle: an opaque cookie obtained from @magicOpen@ and passed to
the loading and querying functions.

Handles are closed (and their memory freed) automatically when they are
garbage-collected by Haskell. There is no need to close them explicitly.

__Thread safety.__ A single @Magic@ handle is /not/ safe for concurrent use:
the underlying @libmagic@ cookie keeps mutable state, so calling operations on
the same handle from multiple threads at once is a data race. Use one handle
per thread, or serialise access to a shared handle (e.g. behind an @MVar@).
Distinct handles are independent and may be used concurrently. Programs doing
blocking work (loading databases, examining files) should also be built with
the threaded runtime (@-threaded@).
-}
type Magic = ForeignPtr CMagic

{- | Tunable limits that bound how hard @libmagic@ works when examining data,
read and written with @magicGetParam@ and @magicSetParam@ (see
"Magic.Operations"). Lowering these (especially 'MagicParamBytesMax') is a way
to cap the effort spent on untrusted input. Defaults below are those documented
for @libmagic@ 5.45.

@since 1.1.2
-}
data MagicParam
    = -- | Maximum number of levels of recursion when following indirect magic. (Default: 15.)
      MagicParamIndirMax
    | -- | Maximum length of a name used by name\/use magic. (Default: 30.)
      MagicParamNameMax
    | -- | Maximum number of ELF program header sections processed. (Default: 128.)
      MagicParamElfPhnumMax
    | -- | Maximum number of ELF section header sections processed. (Default: 32768.)
      MagicParamElfShnumMax
    | -- | Maximum number of ELF notes processed. (Default: 256.)
      MagicParamElfNotesMax
    | -- | Maximum length of a regex search. (Default: 8192.)
      MagicParamRegexMax
    | -- | Maximum number of bytes read from a file before giving up. (Default: 1048576, i.e. 1 MiB.)
      MagicParamBytesMax
    | -- | Maximum number of bytes scanned when guessing a text encoding.
      MagicParamEncodingMax
    | -- | Maximum size of an ELF section processed.
      MagicParamElfShsizeMax
  deriving (Int -> MagicParam -> ShowS
[MagicParam] -> ShowS
MagicParam -> String
(Int -> MagicParam -> ShowS)
-> (MagicParam -> String)
-> ([MagicParam] -> ShowS)
-> Show MagicParam
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MagicParam -> ShowS
showsPrec :: Int -> MagicParam -> ShowS
$cshow :: MagicParam -> String
show :: MagicParam -> String
$cshowList :: [MagicParam] -> ShowS
showList :: [MagicParam] -> ShowS
Show, MagicParam -> MagicParam -> Bool
(MagicParam -> MagicParam -> Bool)
-> (MagicParam -> MagicParam -> Bool) -> Eq MagicParam
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MagicParam -> MagicParam -> Bool
== :: MagicParam -> MagicParam -> Bool
$c/= :: MagicParam -> MagicParam -> Bool
/= :: MagicParam -> MagicParam -> Bool
Eq, Eq MagicParam
Eq MagicParam =>
(MagicParam -> MagicParam -> Ordering)
-> (MagicParam -> MagicParam -> Bool)
-> (MagicParam -> MagicParam -> Bool)
-> (MagicParam -> MagicParam -> Bool)
-> (MagicParam -> MagicParam -> Bool)
-> (MagicParam -> MagicParam -> MagicParam)
-> (MagicParam -> MagicParam -> MagicParam)
-> Ord MagicParam
MagicParam -> MagicParam -> Bool
MagicParam -> MagicParam -> Ordering
MagicParam -> MagicParam -> MagicParam
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MagicParam -> MagicParam -> Ordering
compare :: MagicParam -> MagicParam -> Ordering
$c< :: MagicParam -> MagicParam -> Bool
< :: MagicParam -> MagicParam -> Bool
$c<= :: MagicParam -> MagicParam -> Bool
<= :: MagicParam -> MagicParam -> Bool
$c> :: MagicParam -> MagicParam -> Bool
> :: MagicParam -> MagicParam -> Bool
$c>= :: MagicParam -> MagicParam -> Bool
>= :: MagicParam -> MagicParam -> Bool
$cmax :: MagicParam -> MagicParam -> MagicParam
max :: MagicParam -> MagicParam -> MagicParam
$cmin :: MagicParam -> MagicParam -> MagicParam
min :: MagicParam -> MagicParam -> MagicParam
Ord, Int -> MagicParam
MagicParam -> Int
MagicParam -> [MagicParam]
MagicParam -> MagicParam
MagicParam -> MagicParam -> [MagicParam]
MagicParam -> MagicParam -> MagicParam -> [MagicParam]
(MagicParam -> MagicParam)
-> (MagicParam -> MagicParam)
-> (Int -> MagicParam)
-> (MagicParam -> Int)
-> (MagicParam -> [MagicParam])
-> (MagicParam -> MagicParam -> [MagicParam])
-> (MagicParam -> MagicParam -> [MagicParam])
-> (MagicParam -> MagicParam -> MagicParam -> [MagicParam])
-> Enum MagicParam
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: MagicParam -> MagicParam
succ :: MagicParam -> MagicParam
$cpred :: MagicParam -> MagicParam
pred :: MagicParam -> MagicParam
$ctoEnum :: Int -> MagicParam
toEnum :: Int -> MagicParam
$cfromEnum :: MagicParam -> Int
fromEnum :: MagicParam -> Int
$cenumFrom :: MagicParam -> [MagicParam]
enumFrom :: MagicParam -> [MagicParam]
$cenumFromThen :: MagicParam -> MagicParam -> [MagicParam]
enumFromThen :: MagicParam -> MagicParam -> [MagicParam]
$cenumFromTo :: MagicParam -> MagicParam -> [MagicParam]
enumFromTo :: MagicParam -> MagicParam -> [MagicParam]
$cenumFromThenTo :: MagicParam -> MagicParam -> MagicParam -> [MagicParam]
enumFromThenTo :: MagicParam -> MagicParam -> MagicParam -> [MagicParam]
Enum, MagicParam
MagicParam -> MagicParam -> Bounded MagicParam
forall a. a -> a -> Bounded a
$cminBound :: MagicParam
minBound :: MagicParam
$cmaxBound :: MagicParam
maxBound :: MagicParam
Bounded)