cspmchecker (empty) → 0.1
raw patch · 4 files changed
+185/−0 lines, 4 filesdep +basedep +directorydep +filepathsetup-changed
Dependencies added: base, directory, filepath, libcspm, mtl
Files
- LICENSE.txt +25/−0
- Setup.hs +4/−0
- cspmchecker.cabal +49/−0
- src/Checker/Main.hs +107/−0
+ LICENSE.txt view
@@ -0,0 +1,25 @@+Copyright (c) 2011, Thomas Gibson-Robinson+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:+ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ * Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+ * Neither the name of the author nor the+ names of its contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THOMAS GIBSON-ROBINSON BE LIABLE FOR ANY+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+
+ Setup.hs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++import Distribution.Simple+main = defaultMain
+ cspmchecker.cabal view
@@ -0,0 +1,49 @@+Name: cspmchecker+License: BSD3+License-File: LICENSE.txt+Copyright: (c) 2011 Thomas Gibson-Robinson+Author: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>+Maintainer: Thomas Gibson-Robinson <thomas.gibsonrobinson@gmail.com>+Bug-reports: https://github.com/tomgr/libcspm/issues+Homepage: https://github.com/tomgr/libcspm+Category: Concurrency+Build-type: Simple+Cabal-version: >=1.9.2+Synopsis: A command line type checker for CSPM files.+Version: 0.1++Source-Repository head+ type: git+ location: git://github.com/tomgr/libcspm.git+ subdir: cspmchecker++Source-repository this+ type: git+ location: git://github.com/tomgr/libcspm.git+ subdir: cspmchecker+ tag: 0.1+ +Executable cspmchecker+ Main-is: Main.hs+ + Build-depends: + base >= 4 && < 5,+ libcspm,+ filepath >= 1.2,+ mtl >= 2.0,+ directory >= 1.0+ + Hs-Source-Dirs: src/Checker++--Executable cspmcheckeri+-- Main-is: Main.hs+-- +-- Build-depends: +-- base >= 4 && < 5,+-- libcspm,+-- filepath >= 1.2, +-- mtl >= 2.0,+-- directory >= 1.0,+-- haskeline >= 0.6+-- +-- Hs-Source-Dirs: src/InteractiveChecker
+ src/Checker/Main.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE DoAndIfThenElse #-}+module Main where++import Control.Monad+import Control.Monad.Trans+import Data.List+import System.Console.GetOpt+import System.Directory+import System.Environment+import System.FilePath+import System.Exit+import System.IO++import CSPM+import CSPM.PrettyPrinter+import Monad+import Util.Annotated+import Util.Exception+import Util.PrettyPrint++countSuccesses :: [Sfdr Bool] -> Sfdr ()+countSuccesses tasks = do+ results <- sequence tasks+ let + failed = length $ filter id results+ succeeded = length $ filter id results+ total = length tasks+ if failed+succeeded > 1 then do+ liftIO $ putStrLn $ show succeeded++" files succeeded out of "++show total+ else return ()++getFilesFromDir :: FilePath -> IO [FilePath]+getFilesFromDir path = do+ all <- getDirectoryContents path+ let all' = [path++"/"++f | f <- all]+ files <- filterM doesFileExist all'+ dirs <- filterM doesDirectoryExist all'+ let + dirs' = filter (\f -> not $ (isSuffixOf "." f) + || (isSuffixOf ".." f)) dirs+ files' = filter (isSuffixOf ".csp") files+ fss <- mapM getFilesFromDir [dir | dir <- dirs']+ return $ files'++concat fss++doFile :: FilePath -> Sfdr Bool+doFile fp = do+ liftIO $ putStr $ "Checking "++fp++"....."+ res <- tryM $ do+ ms <- parseFile fp+ typeCheckFile ms+ return ()+ ws <- getState lastWarnings+ resetCSPM+ case res of+ Left e -> do+ printError ("\n"++show e)+ return False+ Right _ -> do+ liftIO $ putStrLn $ "Ok"+ if ws /= [] then printError (show (prettyPrint ws))+ else return ()+ return True++printError :: String -> Sfdr ()+printError s = liftIO $ putStrLn $ "\ESC[1;31m\STX"++s++"\ESC[0m\STX"++data Options = Options {+ recursive :: Bool,+ help :: Bool+ }+defaultOptions = Options { + recursive = False, + help = False + }++options :: [OptDescr (Options -> Options)]+options = [+ Option ['r'] ["recursive"] + (NoArg (\o -> o { recursive = True })) + "If the input file is a directory, check all files contained in all subdirectories",+ Option ['h'] ["help"] + (NoArg (\o -> o { help = True })) + "Display usage message"+ ]++header :: String+header = "Usage: cspmchecker [OPTION...] files..."++main :: IO ()+main = do+ args <- getArgs+ st <- initSfdrState+ runSfdr st $ + case getOpt RequireOrder options args of+ (_,_,e:es) -> liftIO $ putStr $ concat (e:es) ++ usageInfo header options+ (o,files, []) -> do+ let opts = foldl (flip id) defaultOptions o+ case (opts, files) of+ (_, []) -> + liftIO $ putStr $ usageInfo header options+ (Options { help = True }, files) -> + liftIO $ putStr $ usageInfo header options+ (Options { recursive = True }, dirs) -> do+ tasks <- mapM (liftIO . getFilesFromDir) dirs+ countSuccesses (map doFile (concat tasks))+ (_, files) -> + countSuccesses (map doFile files)