?? RIGHT := 110 ??
*copyc osd$default_pragmats
?? NEWTITLE := 'NOS/VE SCL Interpreter : Terminate Tape Assignment Command' ??
MODULE clm$terminate_tape_assignment;

{  PURPOSE:
{    This module contains the processor for the TERMINATE_TAPE_ASSIGNMENT command.
{

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc cle$ecc_file_reference
*copyc jmt$name
*copyc jmt$system_supplied_name
*copyc rmc$condition_code_limits
?? POP ??

*copyc clp$evaluate_parameters
*copyc iop$terminate_tape_assignment
*copyc jmp$validate_name
*copyc osp$set_status_abnormal
*copyc osp$append_status_parameter
*copyc osv$lower_to_upper
*copyc rmp$validate_ansi_string

?? OLDTITLE ??
?? NEWTITLE := 'clp$terminate_tape_assignment', EJECT ??

  PROCEDURE [XDCL, #GATE] clp$terminate_tape_assignment
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (clm$terta) terminate_tape_assignment, terta (
{   external_vsn, evsn, ev: any of
{       string 1..6
{       name 1..6
{     anyend = $required
{   message, m : string 0 .. 80 = $optional
{   job_name, jn : name = $optional
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 8] of clt$pdt_parameter_name,
      parameters: array [1 .. 4] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$union_type_qualifier,
        type_size_1: clt$type_specification_size,
        element_type_spec_1: record
          header: clt$type_specification_header,
          qualifier: clt$string_type_qualifier,
        recend,
        type_size_2: clt$type_specification_size,
        element_type_spec_2: record
          header: clt$type_specification_header,
          qualifier: clt$name_type_qualifier,
        recend,
      recend,
      type2: record
        header: clt$type_specification_header,
        qualifier: clt$string_type_qualifier,
      recend,
      type3: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type4: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [90, 6, 15, 19, 33, 5, 547],
    clc$command, 8, 4, 1, 0, 0, 0, 4, 'CLM$TERTA'], [
    ['EV                             ',clc$abbreviation_entry, 1],
    ['EVSN                           ',clc$alias_entry, 1],
    ['EXTERNAL_VSN                   ',clc$nominal_entry, 1],
    ['JN                             ',clc$abbreviation_entry, 3],
    ['JOB_NAME                       ',clc$nominal_entry, 3],
    ['M                              ',clc$abbreviation_entry, 2],
    ['MESSAGE                        ',clc$nominal_entry, 2],
    ['STATUS                         ',clc$nominal_entry, 4]],
    [
{ 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, 33, clc$required_parameter, 0, 0],
{ PARAMETER 2
    [7, 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, 8, clc$optional_parameter, 0, 0],
{ PARAMETER 3
    [5, 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, 5, clc$optional_parameter, 0, 0],
{ PARAMETER 4
    [8, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation,
  clc$standard_parameter_checking, 3, clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$union_type], [[clc$name_type, clc$string_type],
    TRUE, 2],
    8, [[1, 0, clc$string_type], [1, 6, FALSE]],
    5, [[1, 0, clc$name_type], [1, 6]]
    ],
{ PARAMETER 2
    [[1, 0, clc$string_type], [0, 80, FALSE]],
{ PARAMETER 3
    [[1, 0, clc$name_type], [1, osc$max_name_size]],
{ PARAMETER 4
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$external_vsn = 1,
      p$message = 2,
      p$job_name = 3,
      p$status = 4;

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

    VAR
      candidate_name: jmt$name,
      element_name: ost$name,
      external_vsn: rmt$external_vsn,
      job_name: jmt$system_supplied_name,
      message_size: integer,
      message: string (osc$max_string_size),
      verified_job_name: jmt$name;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), NIL, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    IF pvt [p$external_vsn].value^.kind = clc$string THEN
      external_vsn := pvt [p$external_vsn].value^.string_value^;
    ELSEIF pvt [p$external_vsn].value^.kind = clc$name THEN
      external_vsn := pvt [p$external_vsn].value^.name_value;
    IFEND;
    rmp$validate_ansi_string (external_vsn, external_vsn, status);
    IF NOT status.normal THEN
      osp$set_status_abnormal (rmc$resource_management_id, cle$improper_vsn_value, external_vsn, status);
      osp$append_status_parameter (osc$status_parameter_delimiter, 'EXTERNAL_VSN', status);
      RETURN;
    IFEND;

    IF pvt [p$message].specified THEN
      message := pvt [p$message].value^.string_value^;
    ELSE
      message := 'the specified tape could not be located';
    IFEND;

    IF pvt [p$job_name].specified THEN
      candidate_name.kind := jmc$system_supplied_name;
      candidate_name.system_supplied_name := pvt [p$job_name].value^.name_value;
      jmp$validate_name (candidate_name, verified_job_name, status);
      IF NOT status.normal THEN
        RETURN;
      IFEND;
      job_name := verified_job_name.system_supplied_name;
    ELSE
      job_name := jmc$blank_system_supplied_name;
    IFEND;

    iop$terminate_tape_assignment (external_vsn, message, job_name, status);

  PROCEND clp$terminate_tape_assignment;

MODEND clm$terminate_tape_assignment;
