diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-04-11 21:54:16 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-04-11 21:54:16 +0200 |
commit | e99a8dc48ede26696be2ba75a8cb0d5122d94598 (patch) | |
tree | c3dcd1d6a9b96aaedd081f13b9dc7e7d6c07e2bd /driver.fun | |
parent | 8e2dc7712de206b87e1c46df9383c3fa1e18a43a (diff) |
#include directive
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 + |