sak-0.1.3.0: src/Info.cpphs
module Info ( identify
) where
import Compression
import Data.ByteString as BS
identify :: BS.ByteString -> Compression
identify bs | lzipMagicBytes `isPrefixOf` bs = Lzip
| lzopMagicBytes `isPrefixOf` bs = Lzo
#ifdef SNAPPY
| snappyStreamIdentifier `isPrefixOf` bs = Snappy
#endif
| lz4Magic `isPrefixOf` bs = Lz4
| gzipId `isPrefixOf` bs = GZip
| xzMagic `isPrefixOf` bs = Lzma
| zstdMagic `isPrefixOf` bs = Zstd
| bzMagic `isPrefixOf` bs = BZip
| lrzipMagic `isPrefixOf` bs = Lrzip
#ifdef BROTLI
| brotliMagic `isPrefixOf` bs = Brotli
#endif
| otherwise = None
brotliMagic :: BS.ByteString
brotliMagic = BS.pack [0xce, 0xb2, 0xcf, 0x81]
lrzipMagic :: BS.ByteString
lrzipMagic = BS.pack [0x4c, 0x52, 0x5a, 0x49]
zstdMagic :: BS.ByteString
zstdMagic = BS.pack [0x28, 0xb5, 0x2f, 0xfd]
lzipMagicBytes :: BS.ByteString
lzipMagicBytes = BS.pack [0x4c, 0x5a, 0x49, 0x50]
lzopMagicBytes :: BS.ByteString
lzopMagicBytes = BS.pack [0x89, 0x4c, 0x5a, 0x4f, 0x00, 0x0d, 0x0a, 0x1a, 0x0a]
snappyStreamIdentifier :: BS.ByteString
snappyStreamIdentifier = BS.pack [0xff, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, 0x50, 0x70, 0x59]
gzipId :: BS.ByteString
gzipId = BS.pack [0x1f, 0x8b]
bzMagic :: BS.ByteString
bzMagic = BS.pack [0x42, 0x5a]
lz4Magic :: BS.ByteString
lz4Magic = BS.pack [0x04, 0x22, 0x4d, 0x18]
xzMagic :: BS.ByteString
xzMagic = BS.pack [0xfd, 0x37, 0x7a, 0x58, 0x5a, 0x00]