Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/tests/nofib/real/veritas/Getops.hs

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


module Getops where

import Core_datatype

import Vtslib

import Type_defs

import Edlib



{-
(******************************************************************************)
(*   Syntax of flags:                                                         *)
(*                                                                            *)
(*   flags  ::= '--'							      *)
(*		'-' option [ flags]                                           *)
(*   option ::= <flag_char>+                                                  *)
(*              <arg_char> <arg>                                              *)
(******************************************************************************)
-}


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
-}



Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].