module Getops where import Core_datatype import Vtslib import Type_defs import Edlib {- (******************************************************************************) (* Syntax of flags: *) (* *) (* flags ::= '--' *) (* '-' option [ flags] *) (* option ::= + *) (* *) (******************************************************************************) -} data ArgType = Flag | Arg getops :: [Char] -> [[Char]] -> MayBe ([(Char, Option [Char])], [[Char]]) [Char] getops template argL = Ok ( [ ('t',SOME "Trm")], ["hello"]) -- = process_flags (gen_pattern template) argL process_flags :: [(Char, ArgType)] -> [[Char]] -> MayBe ([(Char, Option [Char])], [[Char]]) [Char] process_flags pattern [] = Ok ([], []) process_flags pattern ("--" : argL) = Ok ([], argL) {- process_flags pattern (arg : argL) | is_option arg = process_options pattern True (tail arg) argL |>| process_flags pattern |@| ( \ ( opts' , opts ) argL' -> Ok (opts' ++ opts, argL')) | otherwise = Ok ([], arg : argL) -} process_options :: [(Char, ArgType)] -> Bool -> [Char] -> [a] -> MayBe ([(Char, Option a)], [a]) [Char] process_options pattern allow_arg (opt : optL) argL = case (assoc opt pattern, (allow_arg, optL, argL)) of (NONE,_) -> Bad ( "Bad option: " <: opt ) (SOME Flag,_) -> process_options pattern False optL argL |@| ( \ opts argL' -> Ok ((opt,NONE):opts, argL') ) (SOME Arg, (True,[],arg:argL)) -> Ok ([(opt,SOME arg)], argL) (SOME Arg, (True,[],[])) -> Bad (opt : " requires an argument") (SOME Arg, _) -> Bad ("Option syntax error") process_options pattern allow_arg "" argL = Ok ([],argL) is_option :: [Char] -> Bool is_option ( '-' : _ ) = True is_option _ = False gen_pattern :: [Char] -> [(Char, ArgType)] gen_pattern [] = [] gen_pattern (opt : ':' : optL) = (opt,Arg) : gen_pattern optL gen_pattern (opt : optL) = (opt,Flag) : gen_pattern optL {- assoc _ [] = NONE assoc x ((y,z):l) | x==y = SOME z | x/=y = assoc x l -}