import Codec.Zlib
import System.Environment (getArgs)
import System.IO
import qualified Data.ByteString as S
import Control.Monad (unless)
main = do
[action, inFile, outFile] <- getArgs
withFile inFile ReadMode $ \inH ->
withFile outFile WriteMode $ \outH ->
case action of
"inflate" -> inflate inH outH
"deflate" -> deflate inH outH
inflate inH outH = do
inf <- initInflate $ WindowBits 31
go inf
bs <- finishInflate inf
S.hPutStr outH bs
where
go inf = do
bs <- S.hGet inH 1024
unless (S.null bs) $ do
withInflateInput inf bs $ writer outH
go inf
deflate inH outH = do
def <- initDeflate 7 $ WindowBits 31
go def
finishDeflate def $ writer outH
where
go def = do
bs <- S.hGet inH 1024
unless (S.null bs) $ do
withDeflateInput def bs $ writer outH
go def
writer outH pop = do
mbs <- pop
case mbs of
Nothing -> return ()
Just bs -> do
S.hPutStr outH bs
writer outH pop