Multics Technical Bulletin MTB-629 Processing Arguments. To: Distribution From: Lindsey Leroy Spratt Date: 07/21/83 Subject: A new argument processing technique for commands and requests. 1 ABSTRACT Process_arguments_ provides a method for centralizing user interaction with respect to arguments, application of default arguments, and basic argument "parsing", validation, and command-line completion. A major goal of this proposal is to enhance the existing command environment while minimizing the effect on the implementation of existing commands. This MTB presents a system for (pre-)processing arguments for commands and subsystem requests. The central utility of this system is the process_arguments_ subroutine. The command or request calls process_arguments_. Process_arguments_ uses argument processing control information, default arguments if defined, an argument list if present, and interaction with the user if appropriate, to generate its output. The output is an array of instances of options which is guaranteed to conform with the argument processing control information's syntax constraints. The command or request extracts option values from the output "result" array, applying the information as appropriate to carry out its task. _________________________________________________________________ Multics project internal working documentation. Not to be reproduced or distributed outside the Multics project without the consent of the author or the author's management. MTB-629 Multics Technical Bulletin Processing Arguments. Comments should be sent to the author: via Multics Mail: Spratt.Multics on either MIT Multics or System M. via US Mail: Lindsey Spratt Honeywell Information Systems, inc. 575 Tech Square Cambridge, Massachusetts 02139 via telephone: (HVN) 261-9321, or (617) 492-9321 CONTENTS Page 1 Abstract . . . . . . . . . . . . . . i 2 Introduction . . . . . . . . . . . . 1 3 The sources of arguments to be processed. . . . . . . . . . . . . . 2 3.1 The argument list. . . . . . . 2 3.2 Interaction with the user. . . 2 3.3 Default arguments. . . . . . . 3 4 The processed arguments, the output of process_arguments_. . . . . . . . 3 4.1 The basic model for the meaning of arguments. . . . . . . . . . . 3 4.1.1 Options . . . . . . . . . 4 4.1.2 Arguments . . . . . . . . 4 4.1.2.1 Grouping . . . . . . 4 4.1.2.2 Names . . . . . . . . 4 4.2 Instances . . . . . . . . . . . 5 4.2.1 Groups . . . . . . . . . . 5 4.2.2 Options . . . . . . . . . 5 4.2.2.1 Explicit . . . . . . 5 4.2.2.2 Implicit . . . . . . 5 4.3 The result print_vector_array. 5 4.3.1 Example result print_vector_array. . . . . . . 5 4.3.1.1 Example 1 . . . . . . 6 4.3.1.2 Example 2 . . . . . . 6 4.3.1.3 Example 3 . . . . . . 6 4.3.2 Dimensions present in each print_vector of the result print_vector_array. . . . . . . 6 4.3.3 Dimensions whose presence depends on the argument syntax. 7 5 Controlling process_arguments_. . . 7 5.1 An example control print_vector_array. . . . . . . . 7 5.2 The definition of the syntax of arguments. . . . . . . . . . . . . 8 5.2.1 Initial implied option. . 8 5.2.2 Required options. . . . . 8 5.2.3 Multiply-named options. . 9 5.2.4 The next implied option. . 9 5.2.5 The initial argument. . . 9 CONTENTS (cont) Page 5.2.6 Argument groups. . . . . . 9 5.2.7 Required arguments. . . . 9 5.3 Explanations . . . . . . . . . 10 5.4 Sources of the argument processing control information. . 10 5.4.1 Caller-provided. . . . . . 10 5.4.2 From a search list of databases. . . . . . . . . . . 10 cvapd . . . . . . . . . . . . . . . . 11 process_arguments_ . . . . . . . . 15 $argument_array . . . . . . . . 16 $argument_list . . . . . . . . . 18 $argument_string . . . . . . . . 20 $cv_result_to_linear_form . . . 22 $get_default_linear_form . . . . 23 $get_definition . . . . . . . . 24 $get_option_value . . . . . . . 25 The option_value_list structure. 26 $get_reference_name . . . . . . 27 vector_util_ . . . . . . . . . . . 28 The print_vector_array structure. . . . . . . . . . . 28 The print_vector structure. . . 29 Multics Technical Bulletin MTB-629 Processing Arguments. 2 INTRODUCTION The process_arguments_ proposal addresses several needs of the Multics command environment. These needs fall into two categories: better services for the users of commands; and, easy development of the command environment for developers. The better services provided by process_arguments_ are of two groups: adaptable modes of interaction with the user, according to the user's needs; and, hierarchically-defined defaults for each command and subsystem request, edited and reviewed in an easily comprehended fasion. The basic mode of interaction is to use arguments provided on a command line, stopping with the first error encountered. The first level of refinement for getting information from the user is for process_arguments_ to be prepared to prompt the user for any required data which was not given in the argument list. The second level of refinement is to provide a menu of all of the defined options, with defaults. The user chooses any number of options from the menu, providing data for the options selected as appropriate. Process_arguments_ can also be used by the video system's line editor to "complete" the user's input line. In each of these modes of interaction it is possible for the user to get explanations of what an option means, or what data the option uses, at any point in the process of interacting with process_arguments_. The arguments as strung together on a command line are called the linear form of input. Settable defaults for commands and subsystem requests are implmented by linear forms which are a preface to the arguments provided by the user for any invocation of the command or request in question. The arguments are processed as though the user had typed in the default linear form before the arguments she actually provided. This definition of defaults has the advantage of being both simple and very expressive (although not amenable to all approaches which might be taken to using defaults, by any means). The hierarchical definition of defaults allows for a system to define defaults for everyone, which can be selectively overridden by projects (for instance), which, in turn, can be overridden by the user. Various other hierarchies can be defined by appropriate manipulation of a search list. The development of the command environment with the features mentioned above is made possible by having all initial processing of arguments done by a single routine, process_arguments_. It is the only program needed to understand the techniques for: prompting, using menus (for argument input), finding and applying MTB-629 Multics Technical Bulletin Processing Arguments. argument defaults, providing specific explanations about arguments and their meanings, and implementing the argument syntax (including some argument validation). This makes it possible to have extensive interface capabilities for command and subsystem requests with little development effort expended per command or request. 3 THE SOURCES OF ARGUMENTS TO BE PROCESSED. There are three ways a user can provide arguments to process_arguments_, on a command or request line, in response to a request for input by process_arguments_ (which is either a prompt or a menu), and by defining default arguments. 3.1 The argument list. The pointer to the argument list specified on the command or request line is gotten by the caller of process_arguments_ (since it is the caller's argument list, in general, which is interesting). Further, the caller of process_arguments_ identifies which arguments in the argument list are to be processed by process_arguments_. This approach to using argument lists makes it easy to implement a command for setting default arguments for all commands and requests. The command, set_defaults, takes as its argument a command line consisting of one command name and the arguments it is to assume by default (for instance, "set_defaults list -no_header -records"). The set_defaults command calls process_arguments_ with the user-provided command name ("list") and has process_arguments_ start processing at the first "default" argument ("-no_header"). Set_defaults takes the result array from process_arguments_ and stores it in a database for future reference by process_arguments_. The input linear form can be passed to process_arguments_ not only in the form of a standard Multics argument list (as described above), but also as an array of varying character strings (the form in which iox_$attach passes an attach description) or as a single character string (exactly as the input linear form would appear in a command line). 3.2 Interaction with the user. The interaction with the user is of three kinds, prompting, menus of options, and command-line completion. The command completion interaction is invoked by the video system's input Multics Technical Bulletin MTB-629 Processing Arguments. line editor to help the user build a command line. The prompting which is done by default is for required arguments which are absent in the default arguments and the argument list. The control information for a command or request may explicitly identify options for which process_arguments_ is to prompt. 3.3 Default arguments. There are two kinds of default arguments: 1 - a list of arguments to processed before processing any user input (a "default linear form"); and, 2 - values to be provided to options which must have values associated with them, but none were specified in the invocation of the command. The default list of arguments is found by searching databases in a search list of databases (named "process_arguments" and "pa"). If more than one database has defaults, the defaults are concatenated together to make a single default linear form string. The default linear form from a database lower in the search list goes further to the left in this combined default linear form, to take advantage of the fact that when there are conflicting options the option further to the right takes precedence. Hence, the options in a default linear form found "higher" in the search list takes precedence over the options in one found "lower" in the search list. The default values for options (as opposed to the default linear form specification of options and option values) are provided in the control definition of the command. These default values can be applied when doing command-line completion. 4 THE PROCESSED ARGUMENTS, THE OUTPUT OF PROCESS_ARGUMENTS_. The primary output of process_arguments_ is a data structure which contains all of the input arguments (from any or all of the sources mentioned above) in a canonical form. This canonical form is a print_vector_array, containing print_vectors. Each print_vector identifies an "option", present either explicitly or implicitly in the input arguments, and a single instance of an argument "group" for that option. 4.1 The basic model for the meaning of arguments. The basic model for command or request arguments has two pieces, the "option" and the "argument group". MTB-629 Multics Technical Bulletin Processing Arguments. 4.1.1 OPTIONS Options are identified in an argument list by an "option reference name", a character string starting with a "-" (hyphen). Any number of option reference names can be defined to name a particular option, but an option reference name must name exactly one option. In Example 1 below, -source_pathname and -target_pathname are option names for two different options. 4.1.2 ARGUMENTS Arguments are of two types, option reference names and option values. Option reference names only appear in argument lists and are used only to identify an option. Option value arguments are values associated with an option. An option value is associated with exactly one group, which in turn is associated with exactly one option. Any instance of an argument which does not start with a "-" (hyphen), is an instance of an option value. For the instance of the argument to be valid, there must be an instance of an option with which it can be associated. The option instance may be either explicit or implicit. In Example 1 below, the arguments "foo" and "bar" are option values with implicit option instances of -source_pathname and -target_pathname, respectively. 4.1.2.1 Grouping An option may be defined to have any number of arguments. In the case where an option is defined to take exactly one argument instance, this argument instance is given a type and the extent of the "argument group" for the option is one argument. If an option takes several argument instances, but all of the same type, then it, too, has an "argument group" consisting of one argument, with the difference that several instances of the argument group may occur within one instance of the option. An option which takes argument instances which must occur in pairs has two arguments in its argument group. In this fashion an argument group may define triplets of arguments, quadruplets, or, generally, n-tuplets. In Example 1 below, there is one instance of the -source_pathname option and one instance of its "pathname" option value, which has a value of "foo". 4.1.2.2 Names Each option value has a name which is unique within its argument group. Multics Technical Bulletin MTB-629 Processing Arguments. 4.2 Instances The type of an option value is fully identified by the name of the option with which its argument group is associated and the name of the argument within its argument group. The instance of an option value is a value of the type specified by the option value. 4.2.1 GROUPS An instance of an argument group consists of no more than one instance of each of the arguments of the group. 4.2.2 OPTIONS An instance of an option consists of the option name and a number of instances of argument groups consistent with the definition of the option. 4.2.2.1 Explicit An instance of an option which is named by an option reference name in an argument list is an "explicit" instance. 4.2.2.2 Implicit An option which is syntactically determined to be present in an argument list (in order to interpret an argument group) is an "implicit" instance. 4.3 The result print_vector_array. The result is a print_vector_array as declared in print_vector_array.incl.pl1. Vector arrays (and data vectors) are discussed in MTB-541, "Toward a unification of data manipulation on Multics." The documentation of them is included at the end of this MTB. 4.3.1 EXAMPLE RESULT PRINT_VECTOR_ARRAY. Following is a display of the print_vector_array returned by process_arguments_ for the example command lines provided. The definition used for the copy command is only for the purposes of the example. MTB-629 Multics Technical Bulletin Processing Arguments. 4.3.1.1 Example 1 Command line: copy foo bar Result array: command name order option name option instance pathname copy 1 -source_pathname 1 foo 2 -target_pathname 1 bar 4.3.1.2 Example 2 Command line: copy foo1 bar1 foo2 bar2 Result array: command name order option name option instance pathname copy 1 -source_pathname 1 foo1 2 -target_pathname 1 bar1 3 -source_pathname 2 foo2 4 -target_pathname 2 bar2 4.3.1.3 Example 3 Command line: copy foo bar -names Result array: command name order option name option instance pathname copy 1 -source_pathname 1 foo 2 -target_pathname 1 bar 3 -names 1 -------- (1) 4.3.2 DIMENSIONS PRESENT IN EACH PRINT_VECTOR OF THE RESULT PRINT_VECTOR_ARRAY. There are four dimensions present in every print_vector of the result print_vector_array, "order", "command name", "option instance", and "option name". The order number is used to preserve the input ordering of the arguments. The command name identifies the command for which the argument was processed. The _________________________________________________________________ (1) The line of hyphens for the pathname dimension of the print_vector for the -names option indicates that the pathname dimension is not present in the print_vector. Multics Technical Bulletin MTB-629 Processing Arguments. option name identifies the option with which the print_vector is associated. 4.3.3 DIMENSIONS WHOSE PRESENCE DEPENDS ON THE ARGUMENT SYNTAX. An argument group instance is presented in a print_vector by having a dimension for each member of the group, with the value of the dimension being the value of that argument in that instance of the argument group. 5 CONTROLLING PROCESS_ARGUMENTS_. The information to control the behavior of process_arguments_ is placed in a print_vector_array of a particular format. The control print_vector_array contains, among other things, information specifying the argument syntax for a command, explanations about the syntax (for printing at the request of a user), and prompt strings (to be used when prompting). 5.1 An example control print_vector_array. The source language for the control information for a simplified copy command is displayed below. The definition of the source language is provided in a later section. The same information is displayed in a format which maintains an obvious correlation to print_vectors later in the MTB. Program_name: copy; Initial implied option: source_pathname; Option: source_pathname; First argument: pathname; Next implied option: target_pathname; Presence: required; Option name: -source_pathname, -scpn; Unexclude: source_pathname; /* Options exclude themselves by default. */ Argument: pathname; Next argument: NONE; Explanation: "This is the pathname of a file to be copied."; Presence: required; Validate: "exists file &1"; MTB-629 Multics Technical Bulletin Processing Arguments. Option: target_pathname; First argument: pathname; Next implied option: source_pathname; Option name: -target_pathname, -tgtpn; Unexclude: target_pathname; Argument: pathname; Next argument: NONE; Explanation: "This is the pathname of the new file into which the source file is copied."; Presence: required; Option: names; Explanation: "Indicates all of the entry names on the source file are to be added to the target file."; Option name: -names, -nm, -name; Antonym: -no_names, -nnm, -no_name; Argument: flag; Default_value: true; Antonym_value: false; End; 5.2 The definition of the syntax of arguments. There are several aspects of command argument syntax which can be specified in the control information. 5.2.1 INITIAL IMPLIED OPTION. The initial implied option is used when the first argument in an argument list is not an option reference name (i.e., it is an option value). The initial implied option is the option to which it belongs. For the copy command, the initial implied option is -source_pathname. If the user types "copy foo", "foo" is an option value which implicitly belongs to the -source_pathname option. 5.2.2 REQUIRED OPTIONS. Any number of instances of an option may be required. The "presence" value present in the example control information above indicates the number of required instances. In the example, there must be (at least) one occurrence of the -source_pathname option. Multics Technical Bulletin MTB-629 Processing Arguments. 5.2.3 MULTIPLY-NAMED OPTIONS. An option may have any number of option reference names (i.e., reference names) associated with it. For the -target_pathname option, it has the reference names -target_pathname and -tgtpn. For the -names option there are the option reference names -names, -name, and -nm. 5.2.4 THE NEXT IMPLIED OPTION. When an option definition is being used (in parsing an argument list) because it was determined to be implied by the syntax, the next option which will be used, when the syntax indicates an implied option, is determined by the current implied option's specification of a next implied option. Intervening uses of explicit options do not affect the choice of option under "implication". For the example copy command, after picking up a source_pathname, the next "unaccompanied" option value will be assumed to belong to an implicit instance of the -target_pathname option, even if an instance of the -name option should happen to intervene. For the two command lines "copy foo bar" and "copy foo -names bar", bar would be interpreted identically in both, as an instance of the option value for an implied -target_pathname option. 5.2.5 THE INITIAL ARGUMENT. The first option value for an option is explicitly identified in the control information for that option. If there is no argument group for an option, then no initial argument is specified. For the example copy command, the -source_pathname option has an initial option value named "pathname". 5.2.6 ARGUMENT GROUPS. Argument groups are specified by chaining argument specifications together. The "next argument" may identify any other option value of the option (including one already identified), or it may indicate that there is no next argument. By specifying an already chained argument, one establishes a loop. The argument group will be cycled through until another option is explicitly supplied (when parsing an argument list). MTB-629 Multics Technical Bulletin Processing Arguments. 5.2.7 REQUIRED ARGUMENTS. The number of required instances of an option value, per instance of the associated option, is indicated by the "presence" value. For the example copy command, one instance of the pathname argument is required for each instance of the -source_pathname option. 5.3 Explanations Explanations can be associated with both options and option values. These explanations are available on demand from the user by entering a "?" (question mark) at appropriate times. For the example copy command, "copy ?" prints the explanation of the command (including, perhaps, a list of options), and the explanation of the initial implied option; "copy <option name> ?" prints explanation for the named option and the explanation of the initial argument for that option, or, if there is no initial argument, the explanation for the next implied option; "copy <option name> <argument> ?" prints the explanation for the next argument, if one is defined, otherwise the next implied option is explained. 5.4 Sources of the argument processing control information. The control print_vector_array can be provided to the process_arguments_ subroutine in two ways. 5.4.1 CALLER-PROVIDED. The caller of process_arguments_ may provide a pointer to a print_vector_array which contains the control information. 5.4.2 FROM A SEARCH LIST OF DATABASES. If no control information is provided by the caller, process_arguments_ will search through the process_arguments search list of databases for a print_vector_array of control information for the command. _____ _____ cvapd cvapd _____ _____ Name: cvapd SYNTAX AS A COMMAND: cvapd {-source} path {{-target} path} {-control_arg} FUNCTION: This command takes a source segment and translates the information specified by that source into a print vector array. The resulting print vector array is stored into a vector database. The vector database resides in a file specified by the user. The information in the source file must be specified in the language whose grammar is described below. The source segment contains information about the syntax of a specific command. The print_vector_array that is the result of using cvapd on a source segment is later used by the process_arguments_ subroutine to process the command line arguments of that command. CONTROL ARGUMENTS: -source path is the pathname (relative or absolute) of the source segment. The source segment name must have the "cvapd" suffix although the suffix need not be specified in the command line. -target path is the pathname of the vector database where the resultant print vector array is stored. The target segment name must have the "vd" suffix although the suffix need not be specified in the command line. -replace, -rp causes the new command syntax definition (specified in the source file) to replace the definition already in the target vector database. If the command definition does not already exist in the target database, the new definition is simply added. NOTES: If the target path is not specified, then print vector array will be stored in a segment in the user's working directory. If the target segment does not exist, it will be created. If it must be _____ _____ cvapd cvapd _____ _____ created, it will be given the name of the source segment with the "cvapd" suffix replaced by "vd". It will also be initialized as a vector data base. If the target segment exists it must already be a vector database. LANGUAGE DEFINITION The cvapd source language is specified by the following grammar. /~********** Overall language structure **********~/ <source> := <initial definition> {<option definition list>} <end statement> <initial definition> := <program name statement> {<initial statement list>} <initial statement list> := {<explanation statement>} {<default linear form statement>} {<initial implied option statement>} <option definition list> := <option definition> {<option definition list>} <option definition> := <option statement> {<per option statement list>} {<argument definition list>} <per option statement list> := {<option reference name statement>} {<linked option statement>} {<first argument statement>} {<antonym reference name statement>} {<explanation statement>} {<exclude statement>} {<unexclude statement>} {<presence statement>} {<next implied option statement>} <argument definition list> := <argument definition> {<argument definition list>} <argument definition> := <argument statement> {<per argument statement list>} <per argument statement list> := {<validate statement>} {<default value statement>} {<antonym value statement>} _____ _____ cvapd cvapd _____ _____ {<presence statement>} {<next argument statement>} {<explanation statement>} /~********** Statements **********~/ <program name statement> := Program_name: <program name>; <option statement> := Option: <option name>; <linked option statement> := Linked_option: <option name>; <initial implied option statement> := Initial_implied_option: <option name>; <next implied option statement> := Next_implied_option: <option name>; <exclude statement> := Exclude: <option name list>; <unexclude statement> := Unexclude: <option name list>; <antonym reference name statement> := Antonym: <option reference name list>; <option reference name statement> := Option_name: <option reference name list>; <argument statement> := Argument: <argument name>; <first argument statement> := First_argument: <argument name>; <next argument statement> := Next_argument: <argument name>; <default linear form statement> := Default_linear_form: <linear form>; | Default_linear_form: <active string>; <explanation statement> := Explanation: <string>; <validate statement> := Validate: <active string>; <default value statement> := Default_value: <active string>; <antonym value statement> := Antonym_value: <active string>; <presence statement> := Presence: <presence value>; /~********** Substatement structures **********~/ _____ _____ cvapd cvapd _____ _____ <program name> := <identifier> <linear form> := <string> This is used to form a string of default arguments to be used by the program being described. <option name> := <identifier> <option name list> := <option name> {, <option name list>} <option reference name> := <identifier> <option reference name list> := <option reference name> {, <option reference name list>} <argument name> := <identifier> <active string> := <string> This can be a Multics active function. If it is, it should be a legal active function. <presence value> := <integer> | required | literal_required | optional NOTES: Whitespace, quotes, ",", ";", ":", comment-open, and comment-close characters are special. Also, the source to be translated is free format. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Name: process_arguments_ This module provides several services relating to getting input for a command or subsystem request. Primarily, it gets input according to a argument_processing_definition and formats this input into a "result print_vector_array", to which a pointer is provided to the caller. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$argument_array This entry processes the arguments in a character varying array (as produced by iox_$attach, for instance), producing a result print_vector_array. Usage dcl process_arguments_$argument_array entry (char (*), fixed bin, (*) char (*) varying, ptr, ptr, ptr, fixed bin (35)); call process_arguments_$argument_array (command_name, arg_processing_mode, arg_array, definition_pva_ptr, area_ptr, result_pva_ptr, code); where: command_name (Input) is the name of the command on whose behalf the arguments are being processed. arg_processing_mode (Input) is the mode in which the arguments are to be processed. The modes are declared as constants in pa_proc_constants.incl.pl1. The caller can choose between: DEFAULT_PROC_MODE - process_arguments_ selects a processing mode depending on the user's process state. PROMPT_PROC_MODE - prompt the user for information needed but not present in the provided input. MENU_PROC_MODE - use a menu to get the user's selection of options and arguments for those options. (This argument is currently ignored.) arg_array (Input) is an array of arguments to be processed. definition_pva_ptr (Input) is a pointer to a definition_print_vector_array. If this pointer is null, then the process_arguments search list is used to locate a definition for the specified command. area_ptr (Input) is a pointer to an area in which the result_pva is to __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ be allocated. This area must be a freeing area. result_pva_ptr (Output) is a pointer to the result print_vector_array, which is the final product of the argument processing. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$argument_list This entry processes the arguments in an argument_list (as produced by the command_processor_, for instance), producing a result print_vector_array. Usage dcl process_arguments_$argument_list entry (char (*), fixed bin, ptr, fixed bin, ptr, ptr, ptr, fixed bin (35)); call process_arguments_$argument_list (command_name, arg_processing_mode, arg_list_ptr, first_arg_idx, definition_pva_ptr, area_ptr, result_pva_ptr, code); where: command_name (Input) is the name of the command on whose behalf the arguments are being processed. arg_processing_mode (Input) is the mode in which the arguments are to be processed. The modes are declared as constants in pa_proc_constants.incl.pl1. The caller can choose between: DEFAULT_PROC_MODE - process_arguments_ selects a processing mode depending on the user's process state. PROMPT_PROC_MODE - prompt the user for information needed but not present in the provided input. MENU_PROC_MODE - use a menu to get the user's selection of options and arguments for those options. (This argument is currently ignored.) arg_list_ptr (Input) is a pointer to a standard argument_list structure (with descriptors), as declared in arg_list.incl.pl1. cu_$arg_list_ptr can be used to get the pointer to the arg_list of a command. first_arg_idx (Input) is the index into the arg_list of the argument at which processing is to begin. All arguments preceeding first_arg_idx are ignored by process_arguments_. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ definition_pva_ptr (Input) is a pointer to a definition_print_vector_array. If this pointer is null, then the process_arguments search list is used to locate a definition for the specified command. area_ptr (Input) is a pointer to an area in which the result_pva is to be allocated. This area must be a freeing area. result_pva_ptr (Output) is a pointer to the result print_vector_array, which is the final product of the argument processing. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$argument_string This entry processes the arguments in a character varying string (separated by spaces or tabs), producing a result print_vector_array. Usage dcl process_arguments_$argument_string entry (char (*), fixed bin, char (*) varying, ptr, ptr, ptr, fixed bin (35)); call process_arguments_$argument_string (command_name, arg_processing_mode, arg_string, definition_pva_ptr, area_ptr, result_pva_ptr, code); where: command_name (Input) is the name of the command on whose behalf the arguments are being processed. arg_processing_mode (Input) is the mode in which the arguments are to be processed. The modes are declared as constants in pa_proc_constants.incl.pl1. The caller can choose between: DEFAULT_PROC_MODE - process_arguments_ selects a processing mode depending on the user's process state. PROMPT_PROC_MODE - prompt the user for information needed but not present in the provided input. MENU_PROC_MODE - use a menu to get the user's selection of options and arguments for those options. (This argument is currently ignored.) arg_string (Input) is a string containing the arguments to be processed, separated by whitespace (blanks or tab characters). definition_pva_ptr (Input) is a pointer to a definition_print_vector_array. If this pointer is null, then the process_arguments search list is used to locate a definition for the specified command. area_ptr (Input) __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ is a pointer to an area in which the result_pva is to be allocated. This area must be a freeing area. result_pva_ptr (Output) is a pointer to the result print_vector_array, which is the final product of the argument processing. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$cv_result_to_linear_form This entry converts a result pva to a character string. Passing this character string to the $argument_string entry produces the same result pva as that from which the string was converted. Usage dcl process_arguments_$cv_result_to_linear_form entry (ptr, ptr, char (*) varying, fixed bin (35)); call process_arguments_$cv_result_to_linear_form (definition_pva_ptr, result_pva_ptr, linear_form, code); where: definition_pva_ptr (Input) is a pointer to a definition print_vector_array to be used in converting the associated result print_vector_array. If null, then a definition is found using the databases in the process_arguments search list. result_pva_ptr (Input) is a pointer to the result print_vector_array to be converted. linear_form (Output) is a character string of the options and their values (separated by spaces and requoted where appropriate). The order of the options and values is the same as that in the result print_vector_array. This string can be passed to the $argument_string entry and the same result print_vector_array produced. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$get_default_linear_form This entry finds the default linear form for a specified command via the process_arguments search list. Usage dcl process_arguments_$get_default_linear_form entry (char(*) varying, char (*) varying, fixed bin (35)); call process_arguments_$get_default_linear_form (command_name, default_linear_form, code); where: command_name (Input) is the name of the command for which the default linear form is desired. default_linear_form (Output) is the default_linear_form for the command. This is a composite of all of the default_linear_forms recorded for the command in the search list. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$get_definition This entry finds argument processing definition for a specified command via the process_arguments search list. Usage dcl process_arguments_$get_definition entry (char (*) varying, ptr, ptr, fixed bin (35)); call process_arguments_$get_definition (command_name, area_ptr, definition_ptr, code); where: command_name (Input) is the name of the command for which an argument processing definition is desired. area_ptr (Input) is a pointer to an area in which to allocate the argument processing definition. definition_ptr (Output) is a pointer to the argument processing definition for the command. code (Output) is a standard system error code. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$get_option_value This entry extracts the values of arguments of options as present in a result print_vector_array produced by process_arguments_. Usage dcl process_arguments_$get_option_value entry options (variable); call process_arguments_$get_option_value (result_print_vector_array_ptr, area_ptr, found_option, option_name_1, option_variable_1 ..., option_name_N, option_variable_N); where: result_print_vector_array_ptr (Input) is a pointer to a result print_vector_array produced by process_arguments_. area_ptr (Input) is a pointer to the area in which this entry is to allocate its output information (when appropriate). found_option (Output) is a bit (*) variable where substr(found_option,I,1) = "1"b if a value was found for option_name_I, "0"b if option_name_I was not mentioned in the result print_vector_array. The length (found_option) must be greater than or equal to the number of options for which values are requested. option_name_I (Input) is the name of an option for which a value is to be retrieved. option_variable_I (Output) is the variable into which the value for option_name_I is to be placed. This variable can have one of the following data types: char (N) {varying} [aligned | unaligned] fixed bin (35) [aligned | unaligned] if the option value can't be converted to a fixed binary number, a sub_err_ is signaled. bit (1) [aligned | unaligned] where "true", "yes", "on", and "1" yield a value __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ of "1"b, and "false", "no", "off", and "0" yield a value of "0"b. Any other value causes a sub_err_ to be signaled. pointer [aligned | unaligned] the value returned for variables of this data type is a pointer to the option_value_list structure (see below). This data type is used when an option may have more than one value, and all of the values are to be returned. The option_value_list structure. Multiple values for an option are returned (by $get_option_value) in the option_value_list structure, declared in pa_option_value_list.incl.pl1 as follows: dcl 1 option_value_list based (option_value_list_ptr) aligned, 2 version char (8), 2 number_of_values fixed bin (35), 2 pad bit (36), 2 value (ovl_number_of_values refer (option_value_list.number_of_values)), 3 ptr ptr, 3 vector_idx fixed bin (35), 3 pad bit (36); where: version is the version of the structure, currently OPTION_VALUE_LIST_VERSION_1 (a constant declared in the same include file). number_of_values is the number of values listed by the structure. pad must be "0"b. value.ptr is a pointer to a varying character string value (in a result print_vector_array). value.vector_idx is the index of the print_vector in which the value is located. value.pad must be "0"b. __________________ __________________ process_arguments_ process_arguments_ __________________ __________________ Entry: process_arguments_$get_reference_name This entry returns the primary name by which the specified option can be referenced in a linear form. If the option is one which sets a flag based on whether it is referenced by its "positive" name or its "negative" name, then this entry returns the primary "positive" and the primary "negative" reference names. Usage dcl process_arguments_$get_reference_name entry (ptr, char (*) varying, char (*) varying, char (*) varying); call process_arguments_$get_reference_name (definition_pva_ptr, option_name, positive_reference_name, negative_reference_name); where: definition_pva_ptr (Input) is a pointer to a standard argument processing definition. option_name (Input) is the name of an option for which the reference name is desired. positive_reference_name (Output) is the primary reference name for the specified option. If the option has positive and negative reference names, then this is the primary positive reference name. negative_reference_name (Output) is the primary negative reference name. If the option does not have a negative reference name, this parameter gets a null value. ____________ ____________ vector_util_ vector_util_ ____________ ____________ Name: vector_util_ vector_util_ manipulates vectors. A vector may have multiple dimensions and has no fewer than one dimension. The dimensions may be of different data types. The print_vector_array structure. Following is the print_vector_array structure (in vu_print_vector_array.incl.pl1): dcl 1 print_vector_array based (print_vector_array_ptr) aligned, 2 version fixed bin (35), 2 number_of_dimensions fixed bin (17), 2 maximum_dimension_name_length fixed bin (17), 2 number_of_vectors fixed bin (17), 2 number_of_vector_slots fixed bin (17), 2 dimension_table (pva_number_of_dimensions refer (print_vector_array .number_of_dimensions)) 3 name char ( pva_maximum_dimension_name_length refer (print_vector_array .maximum_dimension_name_length)) varying, 3 descriptor_ptr ptr, 3 cv_to_print entry (ptr, fixed bin(17), fixed bin(17), ptr, ptr, fixed bin(35)), 3 cv_to_typed entry (ptr, fixed bin(17), fixed bin(17), ptr, ptr, fixed bin(35)), 3 maximum_value_length fixed bin (17), 2 vector_slot (pva_number_of_vector_slots refer (printed_vector_array .number_of_vector_slots)) pointer; where: number_of_dimensions is the number of dimensions in the dimension table. maximum_dimension_name_length is the maximum length of any of the dimensions named in the dimension table. number_of_vectors is the number of vector slots actually used to point ____________ ____________ vector_util_ vector_util_ ____________ ____________ at vectors. number_of_vector_slots is the number of vector slots allocated. dimension_table.name is the name of the dimension. dimension_table.descriptor_ptr is a pointer to standard Multics data type descriptor. dimension_table.cv_to_print is an entry for converting from typed format data to print format. dimension_table.cv_to_typed is an entry for converting from print format data to typed. dimension_table.maximum_value_length is the maximum length attained by any value in this dimension among all of the vectors in the array. vector_slot is a pointer to a print_vector structure. The print_vector structure. The following is the print_vector structure: dcl 1 print_vector based (print_vector_ptr) aligned, 2 number_of_dimensions fixed bin (17), 2 maximum_value_length fixed bin (35), 2 dimension (pv_number_of_dimensions refer (print_vector .number_of_dimensions)), 3 identifier fixed bin (17), 3 value char (pv_maximum_value_length refer (print_vector .maximum_value_length)) varying; where: number_of_dimensions is the number of dimensions present in the vector. maximum_value_length is the actual length of the longest value for all of the dimensions in the vector. dimension.identifier is the index into the dimension_table of the print_vector_array for the definition of this dimension. dimension.value is the character string representation of the value of this dimension for the vector.