packages feed

hat-2.7.0.0: tools/PrettyHat.hs

module Main where

-- System Imports
import System.IO     (stdin,stdout,stderr,hPutStrLn)
import Data.List     (isSuffixOf)
import System.Cmd    (system)
import System.Environment (getArgs,getProgName)
import System.Exit   (exitWith,ExitCode(..))
import Foreign.C.String (withCString)
import Numeric       (showHex)

import LowLevel      (openHatFile,closeHatFile,FileNode(..),nil,peekTrace
                     ,getResult,getParentNode,getErrorLoc,getErrorMessage
                     ,getSrcRef,getDefnRef)
import NodeExp       (nodeExpForNode)
import Detect        (findMain)
import Pretty        (PrettyOption(..), makeGraph)

main = do args     <- System.Environment.getArgs
          prog     <- System.Environment.getProgName
          let opts = gatherOptions args
          let modNames = map getName (filter isModuleName opts)
          _ <- if modNames == []
                 then do hPutStrLn stderr (usage "no root module")
                         exitWith (ExitFailure 1)
                 else if ShowVersion `elem` opts
                   then do hPutStrLn stdout versionString
                   else return ()
          foldr (prettyFile prog opts) (return ()) modNames

prettyFile :: String -> [PrettyOption] -> String -> IO () -> IO ()
prettyFile prog opts x act =
  do act
     withCString prog (\p -> withCString (hatFile x) (openHatFile p))
     mainNode <- findMain
     writeFile (dotFile x) (makeGraph (nodeExpForNode mainNode) opts)
     closeHatFile

isModuleName :: PrettyOption -> Bool
isModuleName (ShowModule x) = True
isModuleName _ = False

getName :: PrettyOption -> String
getName (ShowModule x) = x

progName :: String
progName = "pretty-hat"

version :: Float
version = 0.1

versionString :: String
versionString = progName ++ " version: " ++ (show version) ++ "\n" ++
                "(c) 2005 Thomas Davie\n"

usage :: String -> String
usage err = progName ++ ": " ++ err ++ "\n" ++
            "usage: " ++ progName ++ " [MODULE]\n"

gatherOptions :: [String] -> [PrettyOption]
gatherOptions = map getOption

getOption :: String -> PrettyOption
getOption "-d" = ShowDecOffsets
getOption "-x" = ShowHexOffsets
getOption "-p" = ShowParents
getOption "-e" = MkEDT
getOption "-s" = ShowSrcPoses
getOption "-v" = ShowVersion
getOption x    = ShowModule x

dotFile :: FilePath -> FilePath
dotFile = (flip rectify) ".dot"

hatFile :: FilePath -> FilePath
hatFile = (flip rectify) ".hat"

rectify :: FilePath -> String -> FilePath
rectify f ext | ext `isSuffixOf` f = f
              | otherwise = f ++ ext