DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T V ┃
Length: 17428 (0x4414) Types: TextFile Names: »V«
└─⟦5829e5ed5⟧ Bits:30000534 8mm tape, Rational 1000, RCI 2_0_5 └─ ⟦c9a165082⟧ »DATA« └─⟦2162db02b⟧ └─⟦this⟧
-- portable Parameter_Parser -- All options appear in Adaesque aggregate notation, with appropriate -- relaxations of the rules. Switch values and switch names, where the set -- of choices is static (i.e. fixed set of switches, but not for User -- names), should recognize unique prefix. A package is available for -- parsing parameter lists that adhere to this convention. -- Options are formed from the following lexical components: -- -- Punctuation ::= '=>' | '=' | ':=' | '|' | '..' -- ::= Separator -- -- Separator ::= ',' | ';' -- -- Value ::= Integer-Literal -- ::= Float-Literal -- ::= Literal -- ::= '<>' -- The default value defined for an -- -- option. -- ::= Other-Value -- Any sequence of contiguous char- -- -- acters not including separators; -- -- leading and trailing blanks are -- -- removed. -- ::= '(' Balanced ') -- Any sequence of contiguous char- -- -- acters, balanced with respect to -- -- parentheses, nested within -- -- parentheses. The outer-most -- -- enclosing parentheses are not part -- -- of the value, but all contained -- -- characters, including blanks, are. -- -- Name ::= Simple-Ada-Name -- ::= Other-Name -- Any sequence of contiguous char- -- -- acters not including punctuation -- -- or blanks -- -- Literal ::= Simple-Ada-Name -- Any two-character sequence begining with \ is interpreted as a single, -- non-special occurence of the second character. Thus, "\," is NOT a -- separator character, but a benign ocurrence of ','. -- -- Blanks are allowed around the special characters: -- -- Since Blanks are not allowed in a Name, a blank following a Name may be -- used as a separator. -- -- The syntax is (enclosing quotes not included): -- -- Options ::= [Option {Separator Option}] -- -- Option ::= Range {'|' Range} [('=>' | ':=' | '=') Value] -- ::= ['~'] Range {'|' Range} -- ::= Literal -- -- Range ::= Name ['..' Name] -- ::= 'others' -- Denotes names not otherwise -- -- specified. -- -- -- General semantics: -- A Name denotes an option. A Range denotes the options in a predefined -- sequence of options from the option denoted by the first name to and -- including the option denoted by the last name of the range. The -- specified Value is associated with each option denoted by the Names and -- Ranges of the Option. -- If a Value clause is omitted, the options denoted by the Names and -- Ranges of the Option must be Boolean-valued. If '~' preceeds -- the Names of an Option, the options assume the value False, otherwise they -- assume the value True. -- A Literal denotes a value of a specific option. When it appears as an -- Option, it denotes both the Name and the Value of that option. -- If a name appears more than once, the value associated with the leftmost -- instance of the name is the one used. -- Examples: -- Access_List.Set ("Public=>RW"); -- Profile.Set ("+++,---,++*,!!!,l=>80"); -- Profile.Set ("Persevere, +++ | --- | ++* | !!! => true,w => 80"); -- Source_Archive.Restore (..., Form => "New_Units, Acl => (Public=>RW)"); -- Switches.set ("Semantics.Ignore_Minor_Errors := True"); generic type Option_Id is (<>); -- This discrete type defines the ordering of option names used to -- define ranges. Its values are used in the programmatic interface to -- identify options. For a static collection of options, such as in -- Profile, Option_Id would probably be an enumerated type; its -- enumeration ids would define the names of the options. For -- non-static options, such as access lists, Option_Id would be an -- integer type and most names would be defined using the define -- procedure exported by the generic. Nil : in Option_Id := Option_Id'First; First : in Option_Id := Option_Id'Succ (Nil); Last : in Option_Id := Option_Id'Last; -- Nil is an Option_Id that represents no option name. Only option_id's -- in the range First .. Last are definable; Nil should not be in that -- range; Option_Kinds : in String := "others => Unspecified"; -- Specification of the kind of each option. The string must satisfy -- the syntax for a forms parameter in which Names are taken from the -- set of Option_Id images and Values are the enumeration ids of the -- type Option_Kind, defined below. (The Option_Kind 'Literal' may not -- be specified in this string; use the Define function.) The default -- kind for all options is 'Unspecified'. Options that are not -- Boolean-Valued must be followed by a Value clause when they are used -- in a parameter string. If the Kind of an option is other than -- 'Unspecified', the parser will verify that the associated value is of -- the proper form for the specified Kind. Default_Values : in String := ""; -- Default values for the options. The string must satisfy the syntax -- for a forms parameter in which Names are taken from the set of -- Option_Id images. Not all Option_Ids need to have Default_Values. -- Default values are substituted for the special symbol '<>' when it -- appears in a Value clause. If no default value has been specified -- for an option and the option appears with a '<>' value, the reference -- to the option is deleted by the option parser. Alternate_Names : in String := ""; -- Alternate names for the options. The string must satisfy the syntax -- for a forms parameter in which Names are taken from the set of -- Option_Id images, and the Values obey the syntax for Other_Names. -- Not all Option_Ids need to have Alternate_Names. The standard name -- for an option is the Image of the Option_Id. The Undefine function -- may be used to remove the standard name from the set of permitted -- names. All names for the same option_id value have the same kind and -- default value. From : Option_Id := First; To : Option_Id := Last; -- From and To define the range of Option_Id's that make up the -- initial set of defined options. This set can be expanded or -- reduced using the Define and Undefine procedures defined in the -- package. package Parameter_Parser is type Option_Kind is (Unspecified, Boolean_Valued, Integer_Valued, Float_Valued, Literal); procedure Define (Option : Option_Id; Name : String := ""; Kind : Option_Kind := Unspecified; Default_Value : String := ""; Allow_Name_Prefix : Boolean := False); -- Defines a new Name to be associated with the given Option_Id. The -- default Name is the Option_Id'image of the Option. Any number of -- names may be associated with an Option_Id value. The parameter -- specification may use any of these names to set the option. -- Allow_Name_Prefix allows a unique prefix of the Name to be used in -- place of the Name in a parameter specification. -- The Default_Value string is parsed as if it were a Value -- specification; a balanced string or '\' must be used to protect -- separators in the default value. If Default_Value is the null -- string, no default value is assigned to the option. If you want the -- default value to be a null string, use "()". -- If Kind is 'Literal', Name must be non-null. The given Name must -- never appear with a Value clause. When it appears by itself, without -- a Value clause, the implied value is the Name itself. (The generic -- package Enumerated_Value, defined below, provides a convenient way to -- define all enumeration ids of an option as literals.) procedure Undefine (Name : String); -- Removes the Name (and its prefixes) as a possible option name. procedure Undefine (From : Option_Id; To : Option_Id := Nil); -- Removes all names and prefixes that denote an Option_Id in the given -- range as possible option names. procedure Allow_Name_Prefix (Name : String; Value : Boolean := True); procedure Allow_Name_Prefix (Value : Boolean := True; From : Option_Id := Nil; To : Option_Id := Nil); -- The Allow_Name_Prefix flag for a name, when set, allows a unique -- prefix of the name to be used in place of the name in a parameter -- specification. The default setting of this flag for the initial set -- of Option_Ids is true. -- The first procedure sets the Allow_Name_Prefix flag for the named -- option. -- The second procedure sets the Allow_Name_Prefix flag for all defined -- Names that map to an Option_Id in the specified range. The range -- implied by the default values is the full set of Option_Id's defined -- at the time of call. If From is non-Nil and To is Nil, the single -- Option_Id From is implied. If From and To are both non-Nil, all -- Option_Id's in the range From .. To are implied. type Iterator is private; procedure Parse (Parameter : String; Options : out Iterator; Success : out Boolean); function Parse (Parameter : String) return Iterator; function Is_Successful (Iter : Iterator) return Boolean; -- Success is True, iff all options were parsed correctly. When no -- options parsed correctly, a Done iterator is returned, which may be -- passed to the Diagnosis function to obtain more information. If -- some, but not all, options were parsed correctly the returned -- iterator will be non-null. Iterations (positions in the iterator) -- are allocated for erroneous specifications as well as for correctly -- parsed specifications. The Is_Ok() predicate distinguishes between -- them. -- The iterator returned by Parse represents an expanded, unfactored -- specification, equivalent to the input specification; each iteration -- represents a simple specification of the form, "Name [=> Value]." All -- Names are returned with their full spelling. Ranges and the reserved -- name 'others' are expanded so that there is one iteration for each -- option_id covered by the Range or 'others.' Duplicate specifications -- have been removed, leaving the last specification at its point of -- occurrence. Except for the deleted duplications all specifications -- of the input string are present in the iterator in the same order as -- in the input string. -- In the following subprograms, the optional Name parameter is used -- to interrogate the iterator as a set. The default value, Nil, -- addresses the current iteration of the iterator. function Is_Ok (Iter : Iterator; Name : Option_Id := Nil) return Boolean; -- Indicates whether the designated option was syntactically correct in -- the specification; If the named option was not specified, Is_Ok() -- returns False; function Is_Present (Iter : Iterator; Name : Option_Id) return Boolean; -- Indicates whether the indicated option was present in the option -- parameter string. An option is present if its name was -- parsable. It may otherwise be in error. function Diagnosis (Iter : Iterator; Name : Option_Id := Nil) return String; -- Returns text for a message that describes what was wrong with the -- option specification, if anything. If the named option was not -- specified, Diagnosis returns a message to this effect. If an -- option Is_Ok(), Diagnosis returns the null string. function Done (Iter : Iterator) return Boolean; procedure Next (Iter : in out Iterator); procedure Reset (Iter : in out Iterator); -- Advances the iterator to the next iteration. function Name (Iter : Iterator) return Option_Id; -- Returns Nil if the iteration corresponds to an unparsable -- specification. function Name (Iter : Iterator; Name : Option_Id := Nil) return String; -- Returns the name that was used in the specification to denote the -- indicated Option_Id. The full name is returned even if a prefix was -- used. function Has_Value (Iter : Iterator; Name : Option_Id := Nil) return Boolean; -- Indicates whether the Value clause for the indicated option was -- specified or not. function Get_Image (Iter : Iterator; Name : Option_Id := Nil; Default : String := "") return String; -- Get_Image returns the uninterpreted image of the Value associated -- with the indicated option. If Is_OK() or Has_Value() is false, -- the null string is returned. If Is_Present() is false, the -- default value associated with the named option is returned. -- In the returned value, the two-character sequences begining with \ -- have been reduced to a single character. -- The Get_xxx functions defined below use Get_Image to obtain a -- string to interpret. Thus they operate on the default value -- when the option has not been named. function Kind (Iter : Iterator; Name : Option_Id := Nil) return Option_Kind; -- The value of Get_Image() on the specified option is inspected to -- determine its type. Kind returns Unspecified if the kind cannot be -- determined. function Get_Boolean (Iter : Iterator; Name : Option_Id := Nil; Default : Boolean := False) return Boolean; -- If Get_Image() is non-null, Get_boolean tries to interpret it as -- a Boolean_Literal and returns the denoted value. If the it is not -- a Boolean_Literal, False is returned, and Is_Ok() and Diagnosis() -- will indicate an error and the nature of the error. A -- Boolean_Literal may be any prefix of True or False. -- If Get_Image() is null, Get_Boolean returns false if the name -- appeared with a '~' and it returns true otherwise. function Get_Integer (Iter : Iterator; Name : Option_Id := Nil; Default : Integer := Integer'Last) return Integer; -- Get_Integer tries to parse the Get_Image() value as an -- integer and returns the denoted value. If Integer'Value fails, -- Integer'last is returned and Is_OK() and Diagnosis() will -- identify the error. function Get_Float (Iter : Iterator; Name : Option_Id := Nil; Default : Float := Float'Safe_Large) return Float; -- Get_Float tries to parse the Get_Image() value as a float -- literal and returns the denoted value. If it cannot parse the -- value as a float value, Float'large is returned and Is_OK() and -- Diagnosis() will identify the error. generic type T is (<>); Nil : in T := T'First; Id : Option_Id := Parameter_Parser.Nil; Allow_Name_Prefix : Boolean := True; package Enumerated_Value is function Get_Enumeration (Iter : Iterator; Name : Option_Id := Parameter_Parser.Nil; Allow_Value_Prefix : Boolean := True; Default : T := Nil) return T; end Enumerated_Value; -- Get_Enumeration tries to interpret the Get_Image() value as the -- unique prefix of an image of a component of T. It returns Nil and -- preps Is_Ok() and Diagnosis() if no such interpretation is possible. -- If Allow_Value_Prefix is false, only full spellings of values of type -- T are recognized. -- If the Id formal parameter is not Nil, the values of type T will be -- defined as legal option names. If one of these values is found in an -- option list in the place of a name, it will be treated as a value of -- the option denoted by Id (i.e., "Id =>" is implicitly inserted before -- the value). If Allow_Name_prefix is True, unique prefixes of the -- values of T will be recognized. generic type T is private; Nil : in T; with function Value (S : String) return T is <>; with function Diagnosis (S : String) return String; function Get_Value (Iter : Iterator; Name : Option_Id := Parameter_Parser.Nil; Default : T := Nil) return T; -- Get_Value applies the formal Value function to the Get_Image() -- value. Value should return Nil if the passed value is -- unacceptable. If Nil is returned, the next call to Diagnosis -- will return the value returned by Get_Value.Diagnosis. private type Iterator_Data; type Iterator is access Iterator_Data; end Parameter_Parser;