PROCEDURE (ram$comlv) compare_labeled_volumes, comlv (
  volume_one, vo: record
      recorded_vsn: any of
        name 1..6
        string 1..6
      anyend
      external_vsn: any of
        name 1..6
        string 1..6
      anyend = $optional
    recend = $required
  volume_two, vt: record
      recorded_vsn: any of
        name 1..6
        string 1..6
      anyend
      external_vsn: any of
        name 1..6
        string 1..6
      anyend = $optional
    recend = $required
  compare_options, compare_option, co: (BY_NAME) list of key
      all
      (compare_data, cd)
      (compare_labels, cl)
    keyend = compare_data
  ending_sequence_number, esn: (BY_NAME) integer 1..9999 = 9999
  error_limit, el: (BY_NAME) integer 0..4398046511103 = 0
  file_accessibility, fa: (BY_NAME, SECURE) any of
      key
        none
      keyend
      name 1..1
      string 1
    anyend = $optional
  owner_identifier, oi: (BY_NAME, SECURE) any of
      key
        none
      keyend
      name 1..14
      string 1..14
    anyend = $optional
  starting_sequence_number, ssn: (BY_NAME) integer 1..9999 = 1
  volume_accessibility, va: (BY_NAME, SECURE) any of
      key
        none
      keyend
      name 1..1
      string 1
    anyend = $optional
  volume_one_density, vod: (BY_NAME) key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = osd$reqmt_default_density, mt9$1600
  volume_two_density, vtd: (BY_NAME) key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = $optional
  status)

  TYPE
    vol_descriptor = record
    recorded_vsn: any of
    name 1..6
    string 1..6
    anyend
    external_vsn: any of
    name 1..6
    string 1..6
    anyend
    recend
  TYPEND


  VAR
    compare_data: boolean = false
    compare_labels: boolean = false
    ignore_status: status
    first_file: file = $unique($local)
    local_status: status
    parameter_names: list of key mt9$800, mt9$1600, mt9$6250, mt18$38000 keyend=
        (mt9$800, mt9$1600, mt9$6250, mt18$38000)
    parameter_values: list of integer 0..2147483647 = (0 0 0 0)
    second_file: file = $unique($local)
    temp: file = $unique($local)
    vol_one: vol_descriptor
    vol_two: vol_descriptor
  VAREND

  WHEN any_fault exit terminate DO
    delete_file first_file status=ignore_status
    delete_file second_file status=ignore_status
    delete_file temp status=ignore_status
    release_resource mt9$800=all mt9$1600=all mt9$6250=all mt18$38000=all ..
          status=ignore_status
    EXIT compare_labeled_volumes WITH osv$status
  WHENEND

  FOR EACH option IN compare_options DO
    IF option = all THEN
      compare_data = true
      compare_labels = true
    ELSEIF option = compare_data THEN
      compare_data = true
    ELSEIF option = compare_labels THEN
      compare_labels = true
    IFEND
  FOREND

  vol_one.recorded_vsn = volume_one.recorded_vsn
  IF $field(volume_one external_vsn specified) THEN
    vol_one.external_vsn = volume_one.external_vsn
  ELSE
    vol_one.external_vsn = vol_one.recorded_vsn
  IFEND

  vol_two.recorded_vsn = volume_two.recorded_vsn
  IF $field(volume_two external_vsn specified) THEN
    vol_two.external_vsn = volume_two.external_vsn
  ELSE
    vol_two.external_vsn = vol_two.recorded_vsn
  IFEND

  request_magnetic_tape first_file density=volume_one_density ..
        recorded_vsn=vol_one.recorded_vsn external_vsn=vol_one.external_vsn ..
        ring=no

  IF $specified(volume_two_density) THEN
    request_magnetic_tape second_file density=volume_two_density ..
          recorded_vsn=vol_two.recorded_vsn ..
          external_vsn=vol_two.external_vsn ring=no
    local_volume_two_density = volume_two_density
  ELSE
    request_magnetic_tape second_file density=volume_one_density ..
          recorded_vsn=vol_two.recorded_vsn ..
          external_vsn=vol_two.external_vsn ring=no
    local_volume_two_density = volume_one_density
  IFEND

  FOR i = 1 TO $size(parameter_names) DO
    IF volume_one_density = parameter_names(i) THEN
      parameter_values(i) = parameter_values(i) + 1
    IFEND
    IF local_volume_two_density = parameter_names(i) THEN
      parameter_values(i) = parameter_values(i) + 1
    IFEND
  FOREND

  reserve_resource mt9$800=parameter_values(1) mt9$1600=parameter_values(2) ..
        mt9$6250=parameter_values(3) mt18$38000=parameter_values(4)

  change_tape_label_attributes first_file file_set_position=next_file ..
        file_accessibility=file_accessibility ..
        owner_identifier=owner_identifier ..
        volume_accessibility=volume_accessibility rewrite_labels=false
  change_tape_label_attributes second_file file_set_position=next_file ..
        file_accessibility=file_accessibility ..
        owner_identifier=owner_identifier ..
        volume_accessibility=volume_accessibility rewrite_labels=false
  rewrite_labels = false
  FOR i = starting_sequence_number TO ending_sequence_number DO
    compare_file file=first_file with=second_file error_limit=error_limit output=temp ..
          status=local_status
    IF NOT compare_data THEN
      IF (NOT local_status.normal) AND ..
            (local_status.condition = cle$compare_errors_detected) THEN
        local_status.normal: = true
      IFEND
    IFEND
    IF local_status.normal THEN
      IF compare_labels THEN
        first_file_labels = $tape_label_attributes(first_file last_accessed ..
              header_labels trailer_labels)
        second_file_labels = $tape_label_attributes(second_file last_accessed ..
              header_labels trailer_labels)
        IF first_file_labels = second_file_labels THEN
          local_status.normal = true
        ELSE
          local_status = $status(false, 'US', 9999, ' Labels do not compare')
        IFEND
        delete_variable (first_file_labels second_file_labels)
      IFEND
    IFEND
    IF NOT local_status.normal THEN
      IF (i > 1) AND (local_status.condition = ame$file_not_in_volume_set) ..
            THEN
        EXIT_PROC
      ELSE
        EXIT_PROC WITH local_status
      IFEND
    IFEND
  FOREND

PROCEND compare_labeled_volumes
