summaryrefslogtreecommitdiff
path: root/driver.fun
diff options
context:
space:
mode:
Diffstat (limited to 'driver.fun')
-rw-r--r--driver.fun39
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
+