cleaner update chunks
[ekitaihs.git] / Parse.hs
1 module Parse ( ekitaiOpts, optTimeStep, hGetLines ) where
2
3 import System.Console.GetOpt
4 import System.Environment
5 import System.Exit
6 import System.IO
7 import Data.Maybe
8 import Data.Either
9
10 data Options = Options
11     { optHelp       :: Bool
12     , optColor      :: Bool
13     , optTimeStep   :: Int
14     }
15
16 defaultOptions = Options
17     { optHelp       = False
18     , optColor      = False
19     , optTimeStep   = 50000
20     }
21
22 options :: [OptDescr (Options -> Options)]
23 options =
24     [ Option ['h'] ["help"]
25         (NoArg (\opts -> opts { optHelp = True }))
26         "display's this message"
27     , Option ['c'] ["color", "colour"]
28         (NoArg (\opts -> opts { optColor = True }))
29         "enables color"
30     , Option ['t'] ["timestep"]
31         (ReqArg (\t opts -> opts { optTimeStep = read t :: Int }) "timestep")
32         "sets the simulation time step"
33     ]
34
35 ekitaiOpts :: [String] -> IO (Options, String)
36 ekitaiOpts argv =
37     case getOpt RequireOrder options argv of
38         (o, [n], []) -> return (foldl (flip id) defaultOptions o, n)
39         (o, _, [])   -> ioError $ userError $ "missing input file"
40         (_, _, errs) -> ioError $ userError $ concat errs 
41
42 -- reads in file by lines
43 hGetLines :: Handle -> IO [String]
44 hGetLines h = do
45     line <- hGetLine h
46     isEof <- hIsEOF h
47     if isEof then return [line]
48     else do
49         lines <- hGetLines h
50         return (line:lines)
51