packages feed

HTF-0.1: scripts/HTFpp.hs

--
-- Copyright (c) 2005   Stefan Wehr - http://www.stefanwehr.de
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation; either version 2 of
-- the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-- 02111-1307, USA.
--

module Main where

import System.IO
import System.Environment
import System.Exit

import Test.Framework.Process

assertions :: [String]
assertions = [ "assertBool"
             , "assertEqual"
             , "assertEqualNoShow"
             , "assertSetEqual"
             , "assertNull"
             , "assertNotNull"
             , "assertThrows"
             ]

macros :: String
macros = unlines $
         "#define SRC_LOC_ (__FILE__, __LINE__)" :
         map define assertions
    where define s = "#define " ++ s ++ " (" ++ s ++ "_ SRC_LOC_)"

main :: IO ()
main =
    do prog <- getProgName
       args <- getArgs
       if length args /= 4
          then hPutStrLn stderr
                   ("Usage: " ++ prog ++
                    " original-filename input-filename output-filename "
                    ++ "cpp-command")
          else let orig = args!!0
                   infile = args!!1
                   outfile = args!!2
                   cpp = args!!3
                   fstLine = "#line 1 \"" ++ orig ++ "\"\n"
                   in do inString <- readFile infile
                         (out,err,_) <- popen cpp ["-w"]
                                        (Just $ macros ++ fstLine ++
                                                inString)
                         if null err
                            then do writeFile outfile out
                                    exitWith ExitSuccess
                            else do hPutStrLn stderr err
                                    exitWith (ExitFailure 1)