summaryrefslogtreecommitdiff
path: root/utils/checkUniques/checkUniques.hs
diff options
context:
space:
mode:
Diffstat (limited to 'utils/checkUniques/checkUniques.hs')
-rw-r--r--utils/checkUniques/checkUniques.hs113
1 files changed, 0 insertions, 113 deletions
diff --git a/utils/checkUniques/checkUniques.hs b/utils/checkUniques/checkUniques.hs
deleted file mode 100644
index 2eda188e3c..0000000000
--- a/utils/checkUniques/checkUniques.hs
+++ /dev/null
@@ -1,113 +0,0 @@
--- Some things could be improved, e.g.:
--- * Check that each file given contains at least one instance of the
--- function
--- * Check that we are testing all functions
--- * If a problem is found, give better location information, e.g.
--- which problem the file is in
-
-module Main (main) where
-
-import Control.Concurrent
-import Control.Exception
-import Control.Monad
-import Control.Monad.State
-import Data.Char
-import Data.Set (Set)
-import qualified Data.Set as Set
-import System.Environment
-import System.Exit
-import System.IO
-import System.Process
-
-main :: IO ()
-main = do args <- getArgs
- case args of
- function : files ->
- doit function files
-
-die :: String -> IO a
-die err = do hPutStrLn stderr err
- exitFailure
-
-type M = StateT St IO
-
-data St = St {
- stSeen :: Set Int,
- stLast :: Maybe Int,
- stHadAProblem :: Bool
- }
-
-emptyState :: St
-emptyState = St {
- stSeen = Set.empty,
- stLast = Nothing,
- stHadAProblem = False
- }
-
-use :: Int -> M ()
-use n = do st <- get
- let seen = stSeen st
- put $ st { stSeen = Set.insert n seen, stLast = Just n }
- if (n `Set.member` seen)
- then problem ("Duplicate " ++ show n)
- else case stLast st of
- Just l
- | (l > n) ->
- problem ("Decreasing order for " ++ show l
- ++ " -> " ++ show n)
- _ ->
- return ()
-
-problem :: String -> M ()
-problem str = do lift $ putStrLn str
- st <- get
- put $ st { stHadAProblem = True }
-
-doit :: String -> [FilePath] -> IO ()
-doit function files
- = do (hIn, hOut, hErr, ph) <- runInteractiveProcess
- "grep" ("-h" : function : files)
- Nothing Nothing
- hClose hIn
- strOut <- hGetContents hOut
- strErr <- hGetContents hErr
- forkIO $ do evaluate (length strOut)
- return ()
- forkIO $ do evaluate (length strErr)
- return ()
- ec <- waitForProcess ph
- case (ec, strErr) of
- (ExitSuccess, "") ->
- check function strOut
- _ ->
- error "grep failed"
-
-check :: String -> String -> IO ()
-check function str
- = do let ls = lines str
- -- filter out lines that start with whitespace. They're
- -- from things like:
- -- import M ( ...,
- -- ..., <function>, ...
- ls' = filter (not . all isSpace . take 1) ls
- ns <- mapM (parseLine function) ls'
- st <- execStateT (do mapM_ use ns
- st <- get
- when (Set.null (stSeen st)) $
- problem "No values found")
- emptyState
- when (stHadAProblem st) exitFailure
-
-parseLine :: String -> String -> IO Int
-parseLine function str
- = -- words isn't necessarily quite right, e.g. we could have
- -- "var=" rather than "var =", but it works for the code
- -- we have
- case words str of
- _var : "=" : fun : numStr : rest
- | fun == function,
- null rest || "--" == head rest,
- [(num, "")] <- reads numStr
- -> return num
- _ -> error ("Bad line: " ++ show str)
-