summaryrefslogtreecommitdiff
path: root/driver.fun
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-05-17 14:45:50 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-05-17 14:45:50 +0200
commit5edd85474d6d8f3a0cc06cc0250ed3db8b26fcfa (patch)
treebd7ad914025858b4389b1801216ac7d41a0c1f45 /driver.fun
parent1f31e550385cfa64a36167a5f3f9ec780baaad86 (diff)
Function-like macros
Diffstat (limited to 'driver.fun')
-rw-r--r--driver.fun54
1 files changed, 37 insertions, 17 deletions
diff --git a/driver.fun b/driver.fun
index df50b1e..5336987 100644
--- a/driver.fun
+++ b/driver.fun
@@ -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