-- The current version of compress acts as a filter: the data to be -- compressed is taken from standard input, and the result is placed on -- the standard output. module Main (main) where import Encode import WriteRoutines main = getContents >>= \ i -> putStr (compress i) -- The output is given by a magic header consisting of two fixed numbers, -- and a third representing the maximum number of bits used per code and -- whether or not block compression is being used. There is currently no -- option for turning off block compression in this program. The maximum -- number of bits is imported from the encode module. compress = magic_header . processInput magic_header cs = "\o037\o235" ++ [toEnum third_byte] ++ cs where third_byte = block_compress + maxBits block_compress = 128 -- 0 if block compression is not required -- The two phases of the compression technique are joined together in a -- pipeline with a feedback loop. This is because the encoding function -- needs to know how many characters have been output at any time so it -- can determine whether or not the compression ratio has fallen. This is -- known, however, only when the codes are combined. Therefore the result -- of the output function is a string containing the output, and a list -- of integers representing the size of the output. processInput cs = fst output where output = outputCodes codes codes = encode (snd output) cs