module Main where import GRIP import PSlib import Graph import Parse import Pool import Activity import Spark --import Prog (prog) import System -- 1.3 (partain) main = do str <- getArgs control (map parseLine (condenseArgs str)) control args = do stats <- if from=="stdin" then getContents else readFile from (if into=="stdout" then putStr else writeFile into) (form (graph stats)) where form :: (String -> Postscript) form = if (sizeX==0) then (if (elem G args) then gspostscript else postscript) else ePostscript (sizeX,sizeY) graph :: String -> Postscript graph stats = if (elem P args) then poolGraph processors stats else if orderSp/=[] then sparkGraph orderSp processors stats else activityGraph orderAct processors stats (A orderAct) = lookUp (A defaultAct) args (S orderSp) = lookUp (S []) args (E sizeX sizeY) = lookUp (E 0 0) args (PS processors) = lookUp (PS []) args (IO (from,into)) = lookUp (IO ("stdin","stdout")) args condenseArgs :: [String] -> [String] condenseArgs [] = [] condenseArgs (arg@('-':_):more) = arg:condenseArgs more condenseArgs [a,b] = [a++" "++b] condenseArgs a = a lookUp :: Args -> [Args] -> Args lookUp a [] = a lookUp a (b:bs) | a==b = b | otherwise = lookUp a bs data Args = A [Activity] | S [Spark] | P | E Int Int | F | G | PS [PElement] | IO (String,String) instance Eq Args where (==) (A _) (A _) = True (==) (S _) (S _) = True (==) P P = True (==) (E _ _) (E _ _) = True (==) F F = True (==) G G = True (==) (PS _) (PS _) = True (==) (IO _) (IO _) = True (==) _ _ = False defaultAct = [GC,REDN,IDLE,FLUSH] defaultSp = [RESUMED,USED,CREATED,LOST] defaultSize = (15::Int,10::Int) defaultPS = [PE "14" 1] instance Parse Args where parseType ('-':'A':string) = (A order,more) where order = if (whiteSpace string)=="" then defaultAct else x (x,more) = parse string parseType ('-':'S':string) = (S order,more) where order = if (whiteSpace string=="") then defaultSp else x (x,more) = parse string parseType ('-':'P':string) = (P,string) parseType ('-':'E':string) = (E x y,"") where (x,y) = if (whiteSpace string) == "" then defaultSize else (p,q) (p,'x':a) = parse string (q,more) = parse a parseType ('-':'F':string) = (F,string) parseType ('-':'G':string) = (G,string) parseType ('-':'p':string) = (PS processors,more) where order = if (whiteSpace string=="") then defaultPS else processors (processors,more) = parse string parseType ('-':string) = error("Illegal flag to GRIP-graph : -" ++ string ++ "\n") parseType string = (IO files,"") where files = if string == "" then ("stdin","stdout") else if (whiteSpace more) == "" then (file1,file1++".ps") else (file1,file2) (file1,more) = span (\x->x/=' ') string (file2,_) = span (\x->x/=' ') (whiteSpace (more++" "))