diff options
Diffstat (limited to 'driver.fun')
-rw-r--r-- | driver.fun | 54 |
1 files changed, 37 insertions, 17 deletions
@@ -1,38 +1,58 @@ functor Driver(P: PPC): DRIVER = struct structure P = P + datatype execMode = Normal | DebugE | DebugT + type config = { file: string option, - includeDirs: string list + includeDirs: string list, + mode: execMode } - val initConfig: config = { file = NONE, includeDirs = [] } + val updateC = fn z => + let + fun from file includeDirs mode = { file, includeDirs, mode } + fun to f { file, includeDirs, mode } = f file includeDirs mode + in + FRU.makeUpdate3 (from, from, to) + end z + + val initConfig: config = { file = NONE, includeDirs = [], mode = Normal } + + val die = fn z => die 1 z + + fun finish ({ file = NONE, ... }: config) = die `"missing input file" % + | finish conf = updateC conf u#includeDirs rev % - fun die msg = (printf `msg `"\n"; Posix.Process.exit $ Word8.fromInt 1) + fun parseFlag conf "-dE" tail = + parseCmdArgs (updateC conf s#mode DebugE %) tail + | parseFlag conf "-dT" tail = + parseCmdArgs (updateC conf s#mode DebugT %) tail + | parseFlag _ arg _ = die `arg `": unknown flag" % - fun parseCmdArgs { file, includeDirs } [] = - if file = NONE then - die "missing input file" - else - { file, includeDirs = rev includeDirs } + and parseCmdArgs conf [] = finish conf | parseCmdArgs _ ("-I" :: []) = - die "-I: expected directory path after flag" - | parseCmdArgs { file, includeDirs } ("-I" :: path :: tail) = - parseCmdArgs { file, includeDirs = path :: includeDirs } tail - | parseCmdArgs { file, includeDirs } (arg :: tail) = + die `"-I: expected directory path after flag" % + | parseCmdArgs conf ("-I" :: path :: tail) = + parseCmdArgs (updateC conf u#includeDirs + (fn dirs => path :: dirs) %) tail + | parseCmdArgs (C as { file, ... }) (arg :: tail) = if String.sub (arg, 0) = #"-" then - die $ arg ^ ": unknown flag" + parseFlag C arg tail else case file of - NONE => parseCmdArgs { file = SOME arg, includeDirs } tail - | SOME _ => die $ arg ^ ": file already specified" + NONE => parseCmdArgs (updateC C s#file (SOME arg) %) tail + | SOME _ => die `arg `": file already specified" % fun exec () = let val config = parseCmdArgs initConfig (CommandLine.arguments ()) - val fname = valOf $ #file config + val file = valOf $ #file config in - P.debugPrint fname (#includeDirs config) + case (#mode config) of + Normal => die `"Normal mode is not implemented yet" % + | DebugT => P.T.debugPrint file + | DebugE => P.debugPrint file (#includeDirs config) end end |