?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE SCL Interpreter : Display Command or Function Info' ??
MODULE clm$edit_parameter_list;

{
{ PURPOSE:
{   This module contains the procedures that support "editing" the parameter
{   list for a command.
{

?? NEWTITLE := 'Global Declarations', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cle$parameters_displayed
*copyc cle$work_area_overflow
*copyc clt$command_line
*copyc clt$data_representation
*copyc clt$string_size
*copyc clt$work_area
*copyc ost$status
?? POP ??
*copyc clp$get_work_area
*copyc clp$identify_lexical_units
*copyc clp$initialize_parse_state
*copyc clp$pop_block_stack
*copyc clp$pop_terminated_blocks
*copyc clp$process_command
*copyc clp$push_edit_parameters_block
*copyc clp$scan_non_space_lexical_unit
*copyc osp$append_status_parameter
*copyc osp$disestablish_cond_handler
*copyc osp$establish_block_exit_hndlr
*copyc osp$set_status_abnormal

?? TITLE := 'clp$edit_command_parameter_list', EJECT ??
*copyc clh$edit_command_parameter_list

  PROCEDURE [XDCL, #GATE] clp$edit_command_parameter_list
    (    command_and_parameters: clt$command_line;
         max_string: clt$string_size;
     VAR work_area {input, output} : ^clt$work_area;
     VAR edited_parameters: ^clt$data_representation;
     VAR status: ost$status);

    VAR
      block: ^clt$block,
      ignore_cause_condition: clt$when_condition,
      lexical_units: ^clt$lexical_units,
      local_status: ost$status,
      local_work_area: ^^clt$work_area,
      original_local_work_area: ^clt$work_area,
      parse: clt$parse_state;

?? NEWTITLE := 'abort_handler', EJECT ??

    PROCEDURE abort_handler
      (    condition: pmt$condition;
           condition_information: ^pmt$condition_information;
           save_area: ^ost$stack_frame_save_area;
       VAR handler_status: ost$status);


      IF original_local_work_area <> NIL THEN
        local_work_area^ := original_local_work_area;
      IFEND;

      IF block <> NIL THEN
        clp$pop_terminated_blocks (block, local_status);
        clp$pop_block_stack (block);
      IFEND;

    PROCEND abort_handler;
?? OLDTITLE, EJECT ??

    status.normal := TRUE;
    edited_parameters := NIL;

    local_status.normal := TRUE;
    block := NIL;
    original_local_work_area := NIL;
    #SPOIL (block, original_local_work_area);

    osp$establish_block_exit_hndlr (^abort_handler);

  /edit_command_parameter_list/
    BEGIN
      clp$get_work_area (#RING (^local_work_area), local_work_area, local_status);
      IF NOT local_status.normal THEN
        EXIT /edit_command_parameter_list/;
      IFEND;
      original_local_work_area := local_work_area^;
      #SPOIL (original_local_work_area);

      clp$identify_lexical_units (^command_and_parameters, local_work_area^, lexical_units, local_status);
      IF NOT local_status.normal THEN
        EXIT /edit_command_parameter_list/;
      IFEND;
      clp$initialize_parse_state (^command_and_parameters, lexical_units, parse);
      clp$scan_non_space_lexical_unit (parse);

      clp$push_edit_parameters_block (max_string, block);

      clp$process_command (block, clc$help_mode, FALSE, FALSE, FALSE, FALSE, parse, ignore_cause_condition,
            local_status);
      IF NOT local_status.normal THEN
        IF local_status.condition <> cle$parameters_displayed THEN
          IF local_status.condition = cle$work_area_overflow THEN
            local_status.text.size := 0;
            osp$append_status_parameter (osc$status_parameter_delimiter, 'clp$edit_command_parameter_list',
                  local_status);
          IFEND;
          EXIT /edit_command_parameter_list/;
        IFEND;
        local_status.normal := TRUE;
      ELSEIF block^.edited_parameters = NIL THEN
        EXIT /edit_command_parameter_list/;
      IFEND;

      local_work_area^ := original_local_work_area;

      NEXT edited_parameters: [[REP #SIZE (block^.edited_parameters^) OF cell]] IN work_area;
      IF edited_parameters = NIL THEN
        osp$set_status_abnormal ('CL', cle$work_area_overflow, 'clp$edit_command_parameter_list',
              local_status);
        EXIT /edit_command_parameter_list/;
      IFEND;

      edited_parameters^ := block^.edited_parameters^;
    END /edit_command_parameter_list/;

    IF (original_local_work_area <> NIL) AND (#SEGMENT (work_area) <> #SEGMENT (local_work_area^)) THEN
      local_work_area^ := original_local_work_area;
    IFEND;

    IF block <> NIL THEN
      clp$pop_terminated_blocks (block, local_status);
      clp$pop_block_stack (block);
    IFEND;

    osp$disestablish_cond_handler;

    IF NOT local_status.normal THEN
      status := local_status;
    IFEND;

  PROCEND clp$edit_command_parameter_list;

MODEND clm$edit_parameter_list;
