packages feed

OpenAFP-Utils-1.1: afp-page.hs

module Main where
import OpenAFP
import System.Exit
import qualified Data.ByteString.Char8 as C

main :: IO ()
main = do
    args    <- getArgs
    if null args then error "Usage: afp-page file.afp [output.afp]" else do
    cs <- readAFP $ head args
    let outputFile = case args of
            (_:fn:_)    -> fn
            _           -> "output.afp"
    cs' <- cs !==>!
        [ _MCF === (`filterChunks`
            [ _MCF_T === (`filterChunks`
                [ _T_FQN === fqnHandler
                , _T_RLI ... io . writeIORef cnt . fromEnum . t_rli
                ])
            ])
        ]
    writeAFP outputFile cs'

{-# NOINLINE cnt #-}
cnt :: IORef Int
cnt = unsafePerformIO (newIORef 0)

cs !==>! list = iter cs
    where
    iter [] = return []
    iter (c:cs) = do
        this    <- c `chunkMapFiltersM` list
        rest    <- unsafeInterleaveIO (iter cs)
        return $ this ++ rest

fqnHandler fqn = do
    c <- io $ readIORef cnt  
    let fqn' = case c of
            0           -> fqnDBCS
            35          -> fqnDBCS
            _ | isM__T  -> fqnDBCS
            _           -> fqn
    push fqn'
    where
    a       = packAStr (t_fqn fqn)
    isM__T  = (C.length a >= 6) && ((C.index a 2 == 'M') || (C.index a 5 == 'T'))
    fqnDBCS = fqn{ t_fqn = toAStr "T0XXXX  " }