diff options
Diffstat (limited to 'driver.fun')
-rw-r--r-- | driver.fun | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/driver.fun b/driver.fun new file mode 100644 index 0000000..78ca877 --- /dev/null +++ b/driver.fun @@ -0,0 +1,39 @@ +functor Driver(P: CPP): DRIVER = struct + structure P = P + + type config = { + file: string option, + includeDirs: string list + } + + val initConfig: config = { file = NONE, includeDirs = [] } + + fun die msg = (printLn msg; Posix.Process.exit $ Word8.fromInt 1) + + fun parseCmdArgs { file, includeDirs } [] = + if file = NONE then + die "missing input file" + else + { file, includeDirs = rev includeDirs } + | 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) = + if String.sub (arg, 0) = #"-" then + die $ arg ^ ": unknown flag" + else + case file of + NONE => parseCmdArgs { file = SOME arg, includeDirs } tail + | SOME _ => die $ arg ^ ": file already specified" + + fun exec () = + let + val config = parseCmdArgs initConfig (CommandLine.arguments ()) + + val cpp = P.create (valOf $ #file config) (#includeDirs config) + in + P.debugPrint cpp + end +end + |