?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE SCL Formatter : Command Utility Handlers' ??
MODULE clm$format_utility_handlers;

{
{ PURPOSE:
{   The purpose of this module is to supply the SCL formatter
{   with the procedures, etc. needed to process command utilities
{   in a manner similar to SCL structure blocks.
{

?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cle$ecc_control_statement
*copyc cle$ecc_scl_formatter
*copyc cle$file_never_opened
*copyc clt$command_line
*copyc clt$f_control_statement_desc
*copyc clt$name
*copyc clt$parameter_list
*copyc ost$status
?? POP ??
*copyc amp$get_next
*copyc clp$evaluate_sub_parameters
*copyc clp$f_find_current_block
*copyc clp$f_note_unended_block
*copyc clp$f_pop_block_stack
*copyc clp$f_push_block_stack
*copyc clp$f_scan_parameter_list
*copyc clp$f_set_command_header_type
*copyc clp$get_work_area
*copyc fsp$close_file
*copyc fsp$open_file
*copyc osp$append_status_parameter
*copyc osp$set_status_abnormal

?? EJECT ??

  CONST
    clc$max_utility_count = 500;

  TYPE
    clt$utility_set_range = 1 .. clc$max_utility_count;

  TYPE
    clt$utility_set = set of clt$utility_set_range;

  TYPE
    utility_begin_record = record
      name: ost$name,
      utility_set: clt$utility_set,
    recend;

  VAR
    clv$current_begin_utility_index: 0 .. clc$max_utility_count,
    clv$current_end_index: 0 .. clc$max_utility_count;

{  WARNING:  If the number of utility begin or end commands changes.  The
{  following variable values and the REP clauses at the end of
{  clv$utility_begin_names and clv$utility_end_names need to be changed
{  accordingly.

  VAR
    clv$utility_begin_count: 1 .. clc$max_utility_count := 224,
    clv$utility_end_count: 1 .. clc$max_utility_count := 82;

{  WARNING:  If modifying the next 2 tables, see the warning above.

  VAR
    clv$utility_end_names: [STATIC] array [1 .. clc$max_utility_count] of ost$name := [
          {} 'QUIT                           ',
          {} 'QUI                            ',
          {} 'END                            ',
          {} 'DELETE_INTERSTATE_CONNECTION   ',
          {} 'DELIC                          ',
          {} 'END_MESSAGE_MODULE             ',
          {} 'ENDMM                          ',
          {} 'END_APPLICATION_MENU           ',
          {} 'ENDAM                          ',
          {} 'END_DEFINE_SERVER              ',
          {} 'ENDDS                          ',
          {} 'END_DEFINE_CLIENT              ',
          {} 'ENDDC                          ',
          {} 'END_ADMINISTER_VALIDATIONS     ',
          {} 'ENDAV                          ',
          {} 'END_CHANGE_USER                ',
          {} 'END_CREATE_USER                ',
          {} 'ENDCU                          ',
          {} 'END_CHANGE_ACCOUNT             ',
          {} 'END_CREATE_ACCOUNT             ',
          {} 'ENDCA                          ',
          {} 'END_CHANGE_ACCOUNT_MEMBER      ',
          {} 'END_CREATE_ACCOUNT_MEMBER      ',
          {} 'ENDCAM                         ',
          {} 'END_CHANGE_PROJECT             ',
          {} 'END_CREATE_PROJECT             ',
          {} 'ENDCP                          ',
          {} 'END_CHANGE_PROJECT_MEMBER      ',
          {} 'END_CREATE_PROJECT_MEMBER      ',
          {} 'ENDCPM                         ',
          {} 'END_MANAGE_USER_FIELDS         ',
          {} 'ENDMUF                         ',
          {} 'END_MANAGE_ACCOUNT_FIELDS      ',
          {} 'ENDMAF                         ',
          {} 'END_MANAGE_ACCT_MEMBER_FIELDS  ',
          {} 'ENDMAMF                        ',
          {} 'END_MANAGE_PROJECT_FIELDS      ',
          {} 'ENDMPF                         ',
          {} 'END_MANAGE_PROJ_MEMBER_FIELDS  ',
          {} 'ENDMPMF                        ',
          {} 'END_SYSTEM_OPERATOR_UTILITY    ',
          {} 'ENDSOU                         ',
          {} 'END_FORM_MODULE                ',
          {} 'ENDFM                          ',
          {} 'END_MANAGE_QUEUE_FILE          ',
          {} 'END_MANAGE_QUEUE_FILES         ',
          {} 'ENDMQF                         ',
          {} 'END_ADMINISTER_SECURITY_AUDIT  ',
          {} 'ENDASA                         ',
          {} 'Q                              ',
          {} 'END_MANAGE_EXCEPTION_POLICIES  ',
          {} 'BYE                            ',
          {} 'END_ADMINISTER_MAIL            ',
          {} 'END_EMAIL                      ',
          {} 'ENDE                           ',
          {} 'END_CHANGE_DISTRIBUTION_LIST   ',
          {} 'ENDCDL                         ',
          {} 'END_CHANGE_MAILBOX             ',
          {} 'ENDCM                          ',
          {} 'END_CREATE_DISTRIBUTION_LIST   ',
          {} 'END_CREATE_MAILBOX             ',
          {} 'END_FILTER_MAIL                ',
          {} 'END_FORWARD_LETTER             ',
          {} 'ENDFL                          ',
          {} 'END_MANAGE_LETTER_PARTS        ',
          {} 'ENDMLP                         ',
          {} 'END_WRITE_LETTER               ',
          {} 'ENDWL                          ',
          {} 'END_WRITE_REPLY                ',
          {} 'ENDWR                          ',
          {} 'END_GENERATE_ADDRESS_UPDATES   ',
          {} 'ENDGAU                         ',
          {} 'END_GENERATE_REMOTE_UPDATES    ',
          {} 'ENDGRU                         ',
          {} 'END_MANAGE_MAIL_DIRECTORY      ',
          {} 'ENDMMD                         ',
          {} 'END_MANAGE_MAIL_QUEUES         ',
          {} 'ENDMMQ                         ',
          {} 'END_UPDATE_DISTRIBUTION_LIST   ',
          {} 'ENDUDL                         ',
          {} 'END_UPDATE_MAILBOX             ',
          {} 'ENDUM                          ',
          {} REP (clc$max_utility_count - 82) of '                               '];

  VAR
    clv$utility_begin_names: [STATIC] array [1 .. clc$max_utility_count] of utility_begin_record := [
          {} ['CREATE_OBJECT_LIBRARY          ', [1, 2]],
          {} ['CREOL                          ', [1, 2]],
          {} ['OCU                            ', [1, 2]],
          {} ['EDIF                           ', [1, 2, 3]],
          {} ['EDIT_FILE                      ', [1, 2, 3]],
          {} ['EDID                           ', [1, 2, 3]],
          {} ['EDIT_DECK                      ', [1, 2, 3]],
          {} ['SCU                            ', [1, 2, 3]],
          {} ['SOUCU                          ', [1, 2, 3]],
          {} ['SOURCE_CODE_UTILITY            ', [1, 2, 3]],
          {} ['ANALYZE_DUMP                   ', [1, 2]],
          {} ['ANAD                           ', [1, 2]],
          {} ['DISPLAY_BINARY_LOG             ', [1, 2]],
          {} ['DISBL                          ', [1, 2]],
          {} ['MEASURE_PROGRAM_EXECUTION      ', [1, 2]],
          {} ['MEAPE                          ', [1, 2]],
          {} ['CREATE_INTERSTATE_CONNECTION   ', [1, 2, 4, 5]],
          {} ['CREIC                          ', [1, 2, 4, 5]],
          {} ['LINK_VIRTUAL_ENVIRONMENT       ', [1, 2]],
          {} ['LINVE                          ', [1, 2]],
          {} ['BUILD_REAL_MEMORY              ', [1, 2]],
          {} ['BUIRM                          ', [1, 2]],
          {} ['BACKUP_PERMANENT_FILE          ', [1, 2]],
          {} ['BACKUP_PERMANENT_FILES         ', [1, 2]],
          {} ['BACPF                          ', [1, 2]],
          {} ['RESTORE_PERMANENT_FILE         ', [1, 2]],
          {} ['RESTORE_PERMANENT_FILES        ', [1, 2]],
          {} ['RESPF                          ', [1, 2]],
          {} ['CREATE_MESSAGE_MODULE          ', [1, 2, 6, 7]],
          {} ['CREMM                          ', [1, 2, 6, 7]],
          {} ['CREATE_APPLICATION_MENU        ', [1, 2, 8, 9]],
          {} ['CREAM                          ', [1, 2, 8, 9]],
          {} ['NETWORK_OPERATOR_UTILITY       ', [1, 2]],
          {} ['NETOU                          ', [1, 2]],
          {} ['MANAGE_NETWORK_APPLICATION     ', [1, 2]],
          {} ['MANAGE_NETWORK_APPLICATIONS    ', [1, 2]],
          {} ['MANNA                          ', [1, 2]],
          {} ['DEFINE_SERVER                  ', [1, 2, 10, 11]],
          {} ['DEFS                           ', [1, 2, 10, 11]],
          {} ['DEFINE_CLIENT                  ', [1, 2, 12, 13]],
          {} ['DEFC                           ', [1, 2, 12, 13]],
          {} ['MAIL                           ', [1, 2, 3, 54, 55]],
          {} ['MAI                            ', [1, 2, 3, 54, 55]],
          {} ['PHYSICAL_CONFIGURATION_UTILITY ', [1, 2, 3]],
          {} ['PHYCU                          ', [1, 2, 3]],
          {} ['PCU                            ', [1, 2, 3]],
          {} ['LOGICAL_CONFIGURATION_UTILITY  ', [1, 2, 3]],
          {} ['LOGCU                          ', [1, 2, 3]],
          {} ['LCU                            ', [1, 2, 3]],
          {} ['EDIT_PHYSICAL_CONFIGURATION    ', [1, 2, 3]],
          {} ['EDIPC                          ', [1, 2, 3]],
          {} ['ADMINISTER_VALIDATIONS         ', [1, 2, 14, 15]],
          {} ['ADMINISTER_VALIDATION          ', [1, 2, 14, 15]],
          {} ['ADMV                           ', [1, 2, 14, 15]],
          {} ['CHANGE_USER                    ', [1, 2, 16, 18]],
          {} ['CHAU                           ', [1, 2, 16, 18]],
          {} ['CREATE_USER                    ', [1, 2, 17, 18]],
          {} ['CREU                           ', [1, 2, 17, 18]],
          {} ['CHANGE_ACCOUNT                 ', [1, 2, 19, 21]],
          {} ['CHAA                           ', [1, 2, 19, 21]],
          {} ['CREATE_ACCOUNT                 ', [1, 2, 20, 21]],
          {} ['CREA                           ', [1, 2, 20, 21]],
          {} ['CHANGE_ACCOUNT_MEMBER          ', [1, 2, 22, 24]],
          {} ['CHAAM                          ', [1, 2, 22, 24]],
          {} ['CREATE_ACCOUNT_MEMBER          ', [1, 2, 23, 24]],
          {} ['CREAM                          ', [1, 2, 23, 24]],
          {} ['CHANGE_PROJECT                 ', [1, 2, 25, 27]],
          {} ['CHAP                           ', [1, 2, 25, 27]],
          {} ['CREATE_PROJECT                 ', [1, 2, 26, 27]],
          {} ['CREP                           ', [1, 2, 26, 27]],
          {} ['CHANGE_PROJECT_MEMBER          ', [1, 2, 28, 30]],
          {} ['CHAPM                          ', [1, 2, 28, 30]],
          {} ['CREATE_PROJECT_MEMBER          ', [1, 2, 29, 30]],
          {} ['CREPM                          ', [1, 2, 29, 30]],
          {} ['MANAGE_USER_FIELDS             ', [1, 2, 31, 32]],
          {} ['MANUF                          ', [1, 2, 31, 32]],
          {} ['MANAGE_ACCOUNT_FIELDS          ', [1, 2, 33, 34]],
          {} ['MANAF                          ', [1, 2, 33, 34]],
          {} ['MANAGE_ACCOUNT_MEMBER_FIELDS   ', [1, 2, 35, 36]],
          {} ['MANAMF                         ', [1, 2, 35, 36]],
          {} ['MANAGE_PROJECT_FIELDS          ', [1, 2, 37, 38]],
          {} ['MANPF                          ', [1, 2, 37, 38]],
          {} ['MANAGE_PROJECT_MEMBER_FIELDS   ', [1, 2, 39, 40]],
          {} ['MANPMF                         ', [1, 2, 39, 40]],
          {} ['MANAGE_ACTIVE_SCHEDULING       ', [1, 2]],
          {} ['MANAS                          ', [1, 2]],
          {} ['ADMINISTER_SCHEDULING          ', [1, 2]],
          {} ['ADMS                           ', [1, 2]],
          {} ['ADMINISTER_JOB_CLASS           ', [1, 2]],
          {} ['ADMJC                          ', [1, 2]],
          {} ['ADMINISTER_CONTROLS            ', [1, 2]],
          {} ['ADMC                           ', [1, 2]],
          {} ['ADMINISTER_APPLICATION         ', [1, 2]],
          {} ['ADMA                           ', [1, 2]],
          {} ['ADMINISTER_SERVICE_CLASS       ', [1, 2]],
          {} ['ADMSC                          ', [1, 2]],
          {} ['ADMINISTER_OUTPUT_CLASS        ', [1, 2]],
          {} ['ADMOC                          ', [1, 2]],
          {} ['MANAGE_JOB                     ', [1, 2]],
          {} ['MANAGE_JOBS                    ', [1, 2]],
          {} ['MANJ                           ', [1, 2]],
          {} ['MANAGE_OUTPUT                  ', [1, 2]],
          {} ['MANO                           ', [1, 2]],
          {} ['MANAGE_FILE_SERVER             ', [1, 2]],
          {} ['MANFS                          ', [1, 2]],
          {} ['SYSTEM_OPERATOR_UTILITY        ', [1, 2, 41, 42]],
          {} ['SYSOU                          ', [1, 2, 41, 42]],
          {} ['SOU                            ', [1, 2, 41, 42]],
          {} ['CREATE_FORM_MODULE             ', [1, 2, 43, 44]],
          {} ['CREFM                          ', [1, 2, 43, 44]],
          {} ['ANALYZE_BINARY_LOG             ', [1, 2]],
          {} ['ANABL                          ', [1, 2]],
          {} ['MANAGE_PERIODIC_STATISTICS     ', [1, 2]],
          {} ['MANPS                          ', [1, 2]],
          {} ['MANAGE_QUEUE_FILE              ', [1, 2, 45, 46, 47]],
          {} ['MANAGE_QUEUE_FILES             ', [1, 2, 45, 46, 47]],
          {} ['MANQF                          ', [1, 2, 45, 46, 47]],
          {} ['ADMINISTER_MAIL                ', [1, 2, 3, 9, 53]],
          {} ['ADMM                           ', [1, 2, 3, 9, 53]],
          {} ['ADMINISTER_SECURITY_AUDIT      ', [1, 2, 48, 49]],
          {} ['ADMSA                          ', [1, 2, 48, 49]],
          {} ['ANALYZE_OBJECT_LIBRARY         ', [1, 2]],
          {} ['ANAOL                          ', [1, 2]],
          {} ['ANALYZE_SYSTEM                 ', [1, 2]],
          {} ['ANAS                           ', [1, 2]],
          {} ['ARCHIVE_PERMANENT_FILE         ', [1, 2]],
          {} ['ARCHIVE_PERMANENT_FILES        ', [1, 2]],
          {} ['ARCPF                          ', [1, 2]],
          {} ['BUILD_DIALOG_PROCESSOR         ', [1, 2]],
          {} ['BUIDP                          ', [1, 2]],
          {} ['CHANGE_DISTRIBUTION_LIST       ', [1, 2, 3, 56, 57]],
          {} ['CHADL                          ', [1, 2, 3, 56, 57]],
          {} ['CHANGE_MAILBOX                 ', [1, 2, 3, 58, 59]],
          {} ['CHAM                           ', [1, 2, 3, 58, 59]],
          {} ['CREATE_BINARY_FORMATTED_FILE   ', [1, 2]],
          {} ['CREBFF                         ', [1, 2]],
          {} ['CREATE_CLIENT_FTP_CONNECTION   ', [1, 2, 50, 52]],
          {} ['CRECFC                         ', [1, 2, 50, 52]],
          {} ['FTP                            ', [1, 2, 50, 52]],
          {} ['CREATE_CLIENT_TFTP_CONNECTION  ', [1, 2, 50]],
          {} ['CRECTC                         ', [1, 2, 50]],
          {} ['TFTP                           ', [1, 2, 50]],
          {} ['CREATE_DISTRIBUTION_LIST       ', [1, 2, 3, 57, 60]],
          {} ['CREDL                          ', [1, 2, 3, 57, 60]],
          {} ['CREATE_MAILBOX                 ', [1, 2, 3, 59, 61]],
          {} ['CREM                           ', [1, 2, 3, 59, 61]],
          {} ['CREATE_SUBPRODUCT_CORRECTION   ', [1, 2]],
          {} ['DISPLAY_STATION                ', [1, 2, 3]],
          {} ['DISS                           ', [1, 2, 3]],
          {} ['EMAIL                          ', [1, 2, 3, 54, 55]],
          {} ['EMA                            ', [1, 2, 3, 54, 55]],
          {} ['ENTER_FILE_MANAGER             ', [1, 2]],
          {} ['ENTFM                          ', [1, 2]],
          {} ['ENTER_FTAM_UTILITY             ', [1, 2, 50, 52]],
          {} ['ENTFU                          ', [1, 2, 50, 52]],
          {} ['FTAM                           ', [1, 2, 50, 52]],
          {} ['EXECUTE_INSTALLER_PROCEDURE    ', [1, 2]],
          {} ['FILE_REPAIR_UTILITY            ', [1, 2]],
          {} ['FILTER_MAIL                    ', [1, 2, 3, 44, 62]],
          {} ['FILM                           ', [1, 2, 3, 44, 62]],
          {} ['FORWARD_LETTER                 ', [1, 2, 3, 63, 64]],
          {} ['FORL                           ', [1, 2, 3, 63, 64]],
          {} ['GENERATE_ADDRESS_UPDATES       ', [1, 2, 3, 71, 72]],
          {} ['GENAU                          ', [1, 2, 3, 71, 72]],
          {} ['GENERATE_ARCHIVE_REPORT        ', [1, 2]],
          {} ['GENAR                          ', [1, 2]],
          {} ['GENERATE_REMOTE_UPDATES        ', [1, 2, 3, 73, 74]],
          {} ['GENRU                          ', [1, 2, 3, 73, 74]],
          {} ['INSTALL_SOFTWARE               ', [1, 2]],
          {} ['MAINTAIN_DEADSTART_SOFTWARE    ', [1, 2]],
          {} ['MAIDS                          ', [1, 2]],
          {} ['MANAGE_ARCHIVE_ACTIVITY        ', [1, 2, 50]],
          {} ['MANAA                          ', [1, 2, 50]],
          {} ['MANAGE_ARCHIVE_IMAGES          ', [1, 2, 50]],
          {} ['MANAI                          ', [1, 2, 50]],
          {} ['MANAGE_CARTRIDGE_STORAGE       ', [1, 2]],
          {} ['MANCS                          ', [1, 2]],
          {} ['MANAGE_DEADSTART_FILES         ', [1, 2]],
          {} ['MANDF                          ', [1, 2]],
          {} ['MANAGE_EXCEPTION_POLICIES      ', [1, 2, 51]],
          {} ['MANEP                          ', [1, 2, 51]],
          {} ['MANAGE_FIELD_CHANGES           ', [1, 2]],
          {} ['MANAGE_FORM                    ', [1, 2]],
          {} ['MANAGE_FORMS                   ', [1, 2]],
          {} ['MANF                           ', [1, 2]],
          {} ['MANAGE_LETTER_PARTS            ', [1, 2, 3, 65, 66]],
          {} ['MANLP                          ', [1, 2, 3, 65, 66]],
          {} ['MANAGE_MAIL_DIRECTORY          ', [1, 2, 3, 75, 76]],
          {} ['MANMD                          ', [1, 2, 3, 75, 76]],
          {} ['MANAGE_MAIL_QUEUES             ', [1, 2, 3, 77, 78]],
          {} ['MANMQ                          ', [1, 2, 3, 77, 78]],
          {} ['MANAGE_MEMORY                  ', [1, 2]],
          {} ['MANM                           ', [1, 2]],
          {} ['MANAGE_REMOTE_OUTPUT           ', [1, 2]],
          {} ['MANRO                          ', [1, 2]],
          {} ['MANAGE_RHFAM_NETWORK           ', [1, 2]],
          {} ['MANRN                          ', [1, 2]],
          {} ['MANAGE_STORE_FORWARD_NETWORK   ', [1]],
          {} ['MANSFN                         ', [1]],
          {} ['NETWORK_PERFORMANCE_ANALYZER   ', [1, 2]],
          {} ['NPA                            ', [1, 2]],
          {} ['OPERATE_STATION                ', [1, 2, 3]],
          {} ['OPES                           ', [1, 2, 3]],
          {} ['PACKAGE_CORRECTIONS            ', [1, 2]],
          {} ['PRODUCT_REFERENCE_UTILITY      ', [1, 2]],
          {} ['PRODUCT_REFERENCES_UTILITY     ', [1, 2]],
          {} ['PRORU                          ', [1, 2]],
          {} ['RELEASE_MASS_STORAGE           ', [1, 2]],
          {} ['RELMS                          ', [1, 2]],
          {} ['SYSTEM_TEST_UTILITY            ', [1, 2]],
          {} ['SYSTU                          ', [1, 2]],
          {} ['UPDATE_DISTRIBUTION_LIST       ', [1, 2, 3, 79, 80]],
          {} ['UPDDL                          ', [1, 2, 3, 79, 80]],
          {} ['UPDATE_MAILBOX                 ', [1, 2, 3, 81, 82]],
          {} ['UPDM                           ', [1, 2, 3, 81, 82]],
          {} ['USE_NTF_UTILITY                ', [1, 2]],
          {} ['USE_NTF_UTILITIES              ', [1, 2]],
          {} ['USENU                          ', [1, 2]],
          {} ['VIRTUAL_ENVIRO_DISPLAY_UTILITY ', [1, 2]],
          {} ['VEDU                           ', [1, 2]],
          {} ['WRITE_LETTER                   ', [1, 2, 3, 67, 68]],
          {} ['WRIL                           ', [1, 2, 3, 67, 68]],
          {} ['WRITE_REPLY                    ', [1, 2, 3, 69, 70]],
          {} ['WRIR                           ', [1, 2, 3, 69, 70]],
          {} REP (clc$max_utility_count - 224) of  *];

  VAR
    end_control_statement: [STATIC, READ] clt$f_control_statement_desc :=
          [FALSE, clc$control_command, ^process_end_utility],
    begin_control_statement: [STATIC, READ] clt$f_control_statement_desc :=
          [FALSE, clc$control_command, ^process_begin_utility];

?? TITLE := 'clp$search_format_utilities', EJECT ??

  PROCEDURE [XDCL] clp$search_format_utilities
    (    name: clt$name;
     VAR control_statement_descriptor: ^clt$f_control_statement_desc);

    FOR clv$current_end_index := 1 TO clv$utility_end_count DO
      IF name.value (1, name.size) = clv$utility_end_names [clv$current_end_index] THEN
        control_statement_descriptor := ^end_control_statement;
        RETURN;
      IFEND;
    FOREND;

    clv$current_end_index := 0;

    FOR clv$current_begin_utility_index := 1 TO clv$utility_begin_count DO
      IF name.value (1, name.size) = clv$utility_begin_names [clv$current_begin_utility_index].name THEN
        control_statement_descriptor := ^begin_control_statement;
        RETURN;
      IFEND;
    FOREND;

    clv$current_begin_utility_index := 0;
    control_statement_descriptor := NIL;

  PROCEND clp$search_format_utilities;
?? TITLE := 'process_begin_utility', EJECT ??

  PROCEDURE process_begin_utility
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

    VAR
      utility_block: ^clt$f_block;

    clp$f_set_command_header_type (clc$utility_begin);

    clp$f_push_block_stack (clc$utility_block, osc$null_name, utility_block);
    utility_block^.kind_name := clv$utility_begin_names [clv$current_begin_utility_index].name;

    clp$f_scan_parameter_list (parameter_list, status);

  PROCEND process_begin_utility;
?? TITLE := 'process_end_utility', EJECT ??

  PROCEDURE process_end_utility
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

    VAR
      begin_index: 1 .. clc$max_utility_count,
      block_count: integer,
      block_exists: boolean,
      temp_block: ^clt$f_block,
      utility_block: ^clt$f_block;

    clp$f_find_current_block (utility_block);
    temp_block := utility_block;
    block_count := 0;
    block_exists := FALSE;

  /find_block/
    WHILE temp_block <> NIL DO
      IF temp_block^.kind = clc$utility_block THEN
        FOR begin_index := 1 TO clv$utility_begin_count DO
          IF temp_block^.kind_name = clv$utility_begin_names [begin_index].name THEN
            IF clv$current_end_index IN clv$utility_begin_names [begin_index].utility_set THEN
              block_exists := TRUE;
              EXIT /find_block/;
            IFEND;
          IFEND;
        FOREND;
      IFEND;
      block_count := block_count + 1;
      temp_block := temp_block^.previous_block;
    WHILEND /find_block/;

    IF block_exists THEN
      IF block_count > 0 THEN
        clp$f_note_unended_block (block_count, utility_block, status);
      IFEND;
    ELSE
      osp$set_status_abnormal ('CL', cle$unexpected_control_statemnt,
            clv$utility_end_names [clv$current_end_index], status);
    IFEND;

    IF NOT status.normal THEN
      RETURN;
    IFEND;

    clp$f_pop_block_stack (utility_block);

    clp$f_set_command_header_type (clc$utility_end);

    IF status.normal THEN
      clp$f_scan_parameter_list (parameter_list, status);
    IFEND;

  PROCEND process_end_utility;
?? TITLE := 'clp$process_utility_def_file', EJECT ??

  PROCEDURE [XDCL] clp$process_utility_def_file
    (    file_name: fst$file_reference;
     VAR status: ost$status);

{ PROCEDURE utility_definition (
{   names, name, n: list of data_name = $required
{   terminators, terminator, t: list of data_name = (quit, qui)
{   )

?? PUSH (LISTEXT := ON) ??

    VAR
      pdt: [STATIC, READ, cls$declaration_section] record
        header: clt$pdt_header,
        names: array [1 .. 6] of clt$pdt_parameter_name,
        parameters: array [1 .. 2] of clt$pdt_parameter,
        type1: record
          header: clt$type_specification_header,
          qualifier: clt$list_type_qualifier,
          element_type_spec: record
            header: clt$type_specification_header,
          recend,
        recend,
        type2: record
          header: clt$type_specification_header,
          qualifier: clt$list_type_qualifier,
          element_type_spec: record
            header: clt$type_specification_header,
          recend,
          default_value: string (11),
        recend,
      recend := [[1, [87, 10, 19, 17, 38, 7, 243], clc$command, 6, 2, 1, 0, 0, 0, 0, 'UTILITY_DEFINITION'],
            [['N                              ', clc$abbreviation_entry, 1],
            ['NAME                           ', clc$alias_entry, 1],
            ['NAMES                          ', clc$nominal_entry, 1],
            ['T                              ', clc$abbreviation_entry, 2],
            ['TERMINATOR                     ', clc$alias_entry, 2],
            ['TERMINATORS                    ', clc$nominal_entry, 2]], [

{ PARAMETER 1

      [3, clc$normal_usage_entry, clc$non_secure_parameter, $clt$parameter_spec_methods
            [clc$specify_by_name, clc$specify_positionally], clc$pass_by_value, clc$immediate_evaluation,
            clc$standard_parameter_checking, 19, clc$required_parameter, 0, 0],

{ PARAMETER 2

      [6, clc$normal_usage_entry, clc$non_secure_parameter, $clt$parameter_spec_methods
            [clc$specify_by_name, clc$specify_positionally], clc$pass_by_value, clc$immediate_evaluation,
            clc$standard_parameter_checking, 19, clc$optional_default_parameter, 0, 11]],

{ PARAMETER 1

      [[1, 0, clc$list_type], [3, 1, clc$max_list_size, FALSE], [[1, 0, clc$data_name_type]]],

{ PARAMETER 2

      [[1, 0, clc$list_type], [3, 1, clc$max_list_size, FALSE], [[1, 0, clc$data_name_type]], '(quit, qui)']];

?? POP ??

    CONST
      p$names = 1,
      p$terminators = 2;

    VAR
      pvt: array [1 .. 2] of clt$parameter_value;

    VAR
      current_node: ^clt$data_value,
      end_name_index: 1 .. clc$max_utility_count,
      file_attachment: array [1 .. 3] of fst$attachment_option,
      file_id: amt$file_identifier,
      file_position: amt$file_position,
      ignore_byte_address: amt$file_byte_address,
      local_status: ost$status,
      line_ptr: ^clt$command_line,
      original_work_area: ^clt$work_area,
      terminator_name: ost$name,
      terminator_index: 0 .. clc$max_utility_count,
      transfer_count: amt$transfer_count,
      utility_begin_entry: utility_begin_record,
      utility_name: ost$name,
      utility_name_index: 1 .. clc$max_utility_count,
      work_area: ^^clt$work_area;


    status.normal := TRUE;

    file_attachment [1].selector := fsc$access_and_share_modes;
    file_attachment [1].access_modes.selector := fsc$specific_access_modes;
    file_attachment [1].access_modes.value := $fst$file_access_options [fsc$read];
    file_attachment [1].share_modes.selector := fsc$specific_share_modes;
    file_attachment [1].share_modes.value := $fst$file_access_options [fsc$read, fsc$execute];
    file_attachment [2].selector := fsc$open_share_modes;
    file_attachment [2].open_share_modes := $fst$file_access_options [fsc$read, fsc$execute];
    file_attachment [3].selector := fsc$create_file;
    file_attachment [3].create_file := FALSE;

    fsp$open_file (file_name, amc$record, ^file_attachment, NIL, NIL, NIL, NIL, file_id, status);
    IF NOT status.normal THEN
      IF status.condition = ame$new_file_requires_append THEN
        osp$set_status_abnormal ('CL', cle$file_never_opened, file_name, status);
        osp$append_status_parameter (osc$status_parameter_delimiter, 'FORMAT_SCL_PROC', status);
      IFEND;
      RETURN;
    IFEND;

    clp$get_work_area (#RING (^work_area), work_area, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    original_work_area := work_area^;

  /read_file/
    WHILE TRUE DO
      NEXT line_ptr: [clc$max_command_line_size] IN work_area^;

      amp$get_next (file_id, line_ptr, clc$max_command_line_size, transfer_count, ignore_byte_address,
            file_position, status);
      IF NOT status.normal THEN
        EXIT /read_file/;
      IFEND;
      IF (file_position <> amc$eor) OR (transfer_count = 0) THEN
        EXIT /read_file/;
      IFEND;

      work_area^ := original_work_area;
      NEXT line_ptr: [transfer_count] IN work_area^;

      clp$evaluate_sub_parameters (line_ptr^ (1, transfer_count), #SEQ (pdt), work_area^, ^pvt, status);
      IF NOT status.normal THEN
        EXIT /read_file/;
      IFEND;

      utility_begin_entry.utility_set := $clt$utility_set [];
      current_node := pvt [p$terminators].value;

    /read_terminator_names/
      WHILE current_node <> NIL DO
        terminator_name := current_node^.element_value^.data_name_value;
        terminator_index := 0;

      /check_end_name/
        FOR end_name_index := 1 TO clv$utility_end_count DO
          IF terminator_name = clv$utility_end_names [end_name_index] THEN
            terminator_index := end_name_index;
            EXIT /check_end_name/
          IFEND;
        FOREND /check_end_name/;

        IF terminator_index = 0 THEN
          IF clv$utility_end_count = clc$max_utility_count THEN
            osp$set_status_abnormal ('CL', cle$too_many_names, 'TERMINATOR', status);
            EXIT /read_file/;
          IFEND;
          clv$utility_end_count := clv$utility_end_count + 1;
          terminator_index := clv$utility_end_count;
          clv$utility_end_names [clv$utility_end_count] := terminator_name;
        IFEND;

        utility_begin_entry.utility_set := utility_begin_entry.utility_set +
              $clt$utility_set [terminator_index];

        current_node := current_node^.link;
      WHILEND /read_terminator_names/;

      current_node := pvt [p$names].value;

    /read_utility_names/
      WHILE current_node <> NIL DO
        utility_name := current_node^.element_value^.data_name_value;

        IF utility_name = 'END' THEN
          EXIT /read_file/;
        IFEND;

        FOR utility_name_index := 1 TO clv$utility_begin_count DO
          IF clv$utility_begin_names [utility_name_index].name = utility_name THEN
            osp$set_status_abnormal ('CL', cle$duplicate_utility_name, utility_name, status);
            EXIT /read_file/;
          IFEND;
        FOREND;

        IF clv$utility_begin_count = clc$max_utility_count THEN
          osp$set_status_abnormal ('CL', cle$too_many_names, 'NAME', status);
          EXIT /read_file/;
        IFEND;

        utility_begin_entry.name := utility_name;
        clv$utility_begin_count := clv$utility_begin_count + 1;

        clv$utility_begin_names [clv$utility_begin_count] := utility_begin_entry;

        current_node := current_node^.link;
      WHILEND /read_utility_names/;

      work_area^ := original_work_area;
    WHILEND /read_file/;

    work_area^ := original_work_area;

    fsp$close_file (file_id, local_status);
    IF (NOT local_status.normal) AND status.normal THEN
      status := local_status;
    IFEND;

    IF status.normal THEN
      FOR utility_name_index := 1 TO clv$utility_begin_count DO
        utility_name := clv$utility_begin_names [utility_name_index].name;
        FOR end_name_index := 1 TO clv$utility_end_count DO
          IF clv$utility_end_names [end_name_index] = utility_name THEN
            osp$set_status_abnormal ('CL', cle$utility_same_as_end, utility_name, status);
            RETURN;
          IFEND;
        FOREND;
      FOREND;
    IFEND;

  PROCEND clp$process_utility_def_file;

MODEND clm$format_utility_handlers;
