packages feed

magic-2.0.0: src/Magic/Data.hsc

-- AUTO-GENERATED FILE, DO NOT EDIT.  GENERATED BY utils/genconsts.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE PatternSynonyms #-}
{- |
   Module     : Magic.Data
   Copyright  : Copyright (C) 2005 John Goerzen
   License    : BSD-3-Clause

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

The t'MagicFlags' bit-mask, mapping the C @libmagic@ @MAGIC_*@ constants to
Haskell. Flags are combined with @('<>')@, tested with 'hasFlag', and narrowed
with 'removeFlags'; the empty set ('mempty') is 'MagicNone'.
-}

module Magic.Data
  ( MagicFlags(..)
  , hasFlag
  , removeFlags
  , pattern MagicNone
  , pattern MagicDebug
  , pattern MagicSymlink
  , pattern MagicCompress
  , pattern MagicDevices
  , pattern MagicMimeType
  , pattern MagicMimeEncoding
  , pattern MagicMime
  , pattern MagicContinue
  , pattern MagicCheck
  , pattern MagicPreserveAtime
  , pattern MagicRaw
  , pattern MagicError
  , pattern MagicApple
  , pattern MagicExtension
  , pattern MagicCompressTransp
  , pattern MagicNoCompressFork
  , pattern MagicNodesc
  , pattern MagicNoCheckCompress
  , pattern MagicNoCheckTar
  , pattern MagicNoCheckSoft
  , pattern MagicNoCheckApptype
  , pattern MagicNoCheckElf
  , pattern MagicNoCheckText
  , pattern MagicNoCheckCdf
  , pattern MagicNoCheckCsv
  , pattern MagicNoCheckTokens
  , pattern MagicNoCheckEncoding
  , pattern MagicNoCheckJson
  , pattern MagicNoCheckSimh
  , pattern MagicNoCheckBuiltin
  ) where

#include "magic.h"

import Control.DeepSeq (NFData(rnf))
import Data.Bits ((.&.), (.|.), complement, popCount)
import Data.List (intercalate)
import Foreign.C.Types (CInt)
import GHC.Generics (Generic)

-- | A set of @libmagic@ flags, represented as the underlying C bit-mask.
-- Combine flags with @('<>')@, start from 'mempty' (no flags), test
-- membership with 'hasFlag', and narrow with 'removeFlags'. The
-- v'MagicFlags' constructor is an escape hatch for passing a raw mask;
-- prefer the pattern synonyms below.
--
-- @since 2.0.0
newtype MagicFlags = MagicFlags CInt
  deriving (Eq, Ord, Generic)

instance NFData MagicFlags where rnf (MagicFlags x) = x `seq` ()

-- | Flags combine by bitwise-or.
instance Semigroup MagicFlags where
  MagicFlags a <> MagicFlags b = MagicFlags (a .|. b)

-- | 'mempty' is the empty flag set ('MagicNone').
instance Monoid MagicFlags where
  mempty = MagicFlags 0

-- | Prints the set flags by name (e.g. @MagicMimeType <> MagicError@), or
-- @MagicNone@ when empty. Any bits not corresponding to a known flag are
-- shown as a raw @MagicFlags n@ term.
instance Show MagicFlags where
  showsPrec p fs =
    case names of
      []  -> showString "MagicNone"
      [n] -> showString n
      _   -> showParen (p > 6) (showString (intercalate " <> " names))
    where
      MagicFlags raw = fs
      set      = [ (n, v) | (n, MagicFlags v) <- allNamedFlags, popCount v == 1, raw .&. v == v ]
      covered  = foldr (\(_, v) acc -> v .|. acc) (0 :: CInt) set
      leftover = raw .&. complement covered
      names    = map fst set ++ [ "MagicFlags " ++ show leftover | leftover /= (0 :: CInt) ]

-- | @'hasFlag' fs flag@ is 'True' when every bit of @flag@ is set in @fs@.
-- Works for composite flags too (e.g. @fs \`hasFlag\` 'MagicMime'@). Note
-- that @fs \`hasFlag\` 'MagicNone'@ is always 'True' (the empty set is a
-- subset of everything).
--
-- @since 2.0.0
hasFlag :: MagicFlags -> MagicFlags -> Bool
hasFlag (MagicFlags x) (MagicFlags m) = x .&. m == m

-- | @'removeFlags' fs drop@ clears every bit of @drop@ from @fs@ (set
-- difference), e.g. @flags \`removeFlags\` 'MagicError'@.
--
-- @since 2.0.0
removeFlags :: MagicFlags -> MagicFlags -> MagicFlags
removeFlags (MagicFlags a) (MagicFlags b) = MagicFlags (a .&. complement b)

-- | No special handling; return a textual description (the default). This is 'mempty'.
pattern MagicNone :: MagicFlags
pattern MagicNone = MagicFlags (#{const MAGIC_NONE})

-- | Print debugging messages to stderr.
pattern MagicDebug :: MagicFlags
pattern MagicDebug = MagicFlags (#{const MAGIC_DEBUG})

-- | Follow symbolic links.
pattern MagicSymlink :: MagicFlags
pattern MagicSymlink = MagicFlags (#{const MAGIC_SYMLINK})

-- | Look inside compressed files.
pattern MagicCompress :: MagicFlags
pattern MagicCompress = MagicFlags (#{const MAGIC_COMPRESS})

-- | Look at the contents of block or character special devices.
pattern MagicDevices :: MagicFlags
pattern MagicDevices = MagicFlags (#{const MAGIC_DEVICES})

-- | Return a MIME type string instead of a textual description.
pattern MagicMimeType :: MagicFlags
pattern MagicMimeType = MagicFlags (#{const MAGIC_MIME_TYPE})

-- | Return the MIME encoding (character set) instead of a textual description.
pattern MagicMimeEncoding :: MagicFlags
pattern MagicMimeEncoding = MagicFlags (#{const MAGIC_MIME_ENCODING})

-- | Return both the MIME type and the encoding (@'MagicMimeType' '<>' 'MagicMimeEncoding'@).
pattern MagicMime :: MagicFlags
pattern MagicMime = MagicFlags (#{const MAGIC_MIME})

-- | Return all matches, not just the first.
pattern MagicContinue :: MagicFlags
pattern MagicContinue = MagicFlags (#{const MAGIC_CONTINUE})

-- | Check the magic database for consistency and report problems.
pattern MagicCheck :: MagicFlags
pattern MagicCheck = MagicFlags (#{const MAGIC_CHECK})

-- | Preserve the access time of examined files.
pattern MagicPreserveAtime :: MagicFlags
pattern MagicPreserveAtime = MagicFlags (#{const MAGIC_PRESERVE_ATIME})

-- | Do not translate unprintable characters to octal escapes.
pattern MagicRaw :: MagicFlags
pattern MagicRaw = MagicFlags (#{const MAGIC_RAW})

-- | Treat errors while examining a file as real errors instead of embedding them in the result.
pattern MagicError :: MagicFlags
pattern MagicError = MagicFlags (#{const MAGIC_ERROR})

-- | Return the Apple creator and type.
pattern MagicApple :: MagicFlags
pattern MagicApple = MagicFlags (#{const MAGIC_APPLE})

-- | Return a slash-separated list of valid file extensions for the detected type.
pattern MagicExtension :: MagicFlags
pattern MagicExtension = MagicFlags (#{const MAGIC_EXTENSION})

-- | Report on the compressed contents only, without mentioning the compression itself (transparent decompression).
pattern MagicCompressTransp :: MagicFlags
pattern MagicCompressTransp = MagicFlags (#{const MAGIC_COMPRESS_TRANSP})

-- | Do not allow decompression that requires forking a helper process.
pattern MagicNoCompressFork :: MagicFlags
pattern MagicNoCompressFork = MagicFlags (#{const MAGIC_NO_COMPRESS_FORK})

-- | Composite of 'MagicExtension', 'MagicMime' and 'MagicApple': return identifiers rather than a textual description.
pattern MagicNodesc :: MagicFlags
pattern MagicNodesc = MagicFlags (#{const MAGIC_NODESC})

-- | Do not look inside compressed files.
pattern MagicNoCheckCompress :: MagicFlags
pattern MagicNoCheckCompress = MagicFlags (#{const MAGIC_NO_CHECK_COMPRESS})

-- | Do not examine tar archives.
pattern MagicNoCheckTar :: MagicFlags
pattern MagicNoCheckTar = MagicFlags (#{const MAGIC_NO_CHECK_TAR})

-- | Do not consult the magic database entries (soft magic).
pattern MagicNoCheckSoft :: MagicFlags
pattern MagicNoCheckSoft = MagicFlags (#{const MAGIC_NO_CHECK_SOFT})

-- | Do not check for an application type (e.g. EMX).
pattern MagicNoCheckApptype :: MagicFlags
pattern MagicNoCheckApptype = MagicFlags (#{const MAGIC_NO_CHECK_APPTYPE})

-- | Do not examine ELF details.
pattern MagicNoCheckElf :: MagicFlags
pattern MagicNoCheckElf = MagicFlags (#{const MAGIC_NO_CHECK_ELF})

-- | Do not examine text files.
pattern MagicNoCheckText :: MagicFlags
pattern MagicNoCheckText = MagicFlags (#{const MAGIC_NO_CHECK_TEXT})

-- | Do not examine CDF (Microsoft Compound Document) files.
pattern MagicNoCheckCdf :: MagicFlags
pattern MagicNoCheckCdf = MagicFlags (#{const MAGIC_NO_CHECK_CDF})

-- | Do not examine CSV files.
pattern MagicNoCheckCsv :: MagicFlags
pattern MagicNoCheckCsv = MagicFlags (#{const MAGIC_NO_CHECK_CSV})

-- | Do not look for known text tokens.
pattern MagicNoCheckTokens :: MagicFlags
pattern MagicNoCheckTokens = MagicFlags (#{const MAGIC_NO_CHECK_TOKENS})

-- | Do not check text encodings.
pattern MagicNoCheckEncoding :: MagicFlags
pattern MagicNoCheckEncoding = MagicFlags (#{const MAGIC_NO_CHECK_ENCODING})

-- | Do not examine JSON files.
pattern MagicNoCheckJson :: MagicFlags
pattern MagicNoCheckJson = MagicFlags (#{const MAGIC_NO_CHECK_JSON})

-- | Do not examine SIMH tape files.
pattern MagicNoCheckSimh :: MagicFlags
pattern MagicNoCheckSimh = MagicFlags (#{const MAGIC_NO_CHECK_SIMH})

-- | Disable all built-in tests; consult only the magic database.
pattern MagicNoCheckBuiltin :: MagicFlags
pattern MagicNoCheckBuiltin = MagicFlags (#{const MAGIC_NO_CHECK_BUILTIN})

-- Every named flag, used by the 'Show' instance to print flags by name.
allNamedFlags :: [(String, MagicFlags)]
allNamedFlags =
  [ ("MagicNone", MagicNone)
  , ("MagicDebug", MagicDebug)
  , ("MagicSymlink", MagicSymlink)
  , ("MagicCompress", MagicCompress)
  , ("MagicDevices", MagicDevices)
  , ("MagicMimeType", MagicMimeType)
  , ("MagicMimeEncoding", MagicMimeEncoding)
  , ("MagicMime", MagicMime)
  , ("MagicContinue", MagicContinue)
  , ("MagicCheck", MagicCheck)
  , ("MagicPreserveAtime", MagicPreserveAtime)
  , ("MagicRaw", MagicRaw)
  , ("MagicError", MagicError)
  , ("MagicApple", MagicApple)
  , ("MagicExtension", MagicExtension)
  , ("MagicCompressTransp", MagicCompressTransp)
  , ("MagicNoCompressFork", MagicNoCompressFork)
  , ("MagicNodesc", MagicNodesc)
  , ("MagicNoCheckCompress", MagicNoCheckCompress)
  , ("MagicNoCheckTar", MagicNoCheckTar)
  , ("MagicNoCheckSoft", MagicNoCheckSoft)
  , ("MagicNoCheckApptype", MagicNoCheckApptype)
  , ("MagicNoCheckElf", MagicNoCheckElf)
  , ("MagicNoCheckText", MagicNoCheckText)
  , ("MagicNoCheckCdf", MagicNoCheckCdf)
  , ("MagicNoCheckCsv", MagicNoCheckCsv)
  , ("MagicNoCheckTokens", MagicNoCheckTokens)
  , ("MagicNoCheckEncoding", MagicNoCheckEncoding)
  , ("MagicNoCheckJson", MagicNoCheckJson)
  , ("MagicNoCheckSimh", MagicNoCheckSimh)
  , ("MagicNoCheckBuiltin", MagicNoCheckBuiltin)
  ]