PROCEDURE display_active_volumes, disav (
  output, o: file = $output
  relevant_classes, rc: any of
      key
        all
        (site_reserved_classes, src)
        (system_defined_classes, sdc)
      keyend
      list of name 1..1
    anyend = osd$disav_relevant_classes, system_defined_classes
  sets, set, s: any of
      key
        all
      keyend
      list of name
    anyend = all
  volumes, volume, v: any of
      key
        all
        (available_volumes, available_volume, av)
        (unavailable_volumes, unavailable_volume, uv)
      keyend
      list of name 1..6
    anyend = all
  status)

  LOGICAL_CONFIGURATION_UTILITY
    VAR
      classes: list of list of any
      displayed_classes : list of name 1 = ()
      copf_status: status
      ignore_status: status
      line: string 110
      local_rvsn: string 6 = '      '
      out: file = $unique($local)
      relevant_line_displayed: boolean = false
    VAREND

    IF $generic_type(relevant_classes) = key THEN
      IF relevant_classes = all THEN
        class_string = 'abcdefghijklmnopqrstuvwxyz'
      ELSEIF relevant_classes = site_reserved_classes THEN
        class_string = 'uvwxyz'
      ELSEIF relevant_classes = system_defined_classes THEN
        class_string = 'cjklmnpq'
      IFEND
      "Construct list of class names to avoid parameter alias substitution"
      FOR index = $size(class_string) TO 1 BY -1 DO
        displayed_classes = $add($name($substring(class_string, index)), displayed_classes)
      FOREND
    ELSE
      displayed_classes = relevant_classes
    IFEND

" $ADD addes an element to the front of a list - first reverse the list"
    temp_classes = $reverse(displayed_classes)
    classes = $list_of($mass_storage_class_members(temp_classes(1)))
    FOR i = 2 TO $size(displayed_classes) DO
      classes = $add($mass_storage_class_members(temp_classes(i)) classes)
    FOREND

    IF $generic_type(sets) = key THEN
      active_sets = $active_sets
    ELSE
      active_sets = sets
    IFEND

    FOR EACH set IN $sort(active_sets) DO
      displaying_by_set = true
      VAR
        active_volumes: list of any = ()
      VAREND
      IF $generic_type(volumes) = key "ALL" THEN
        IF volumes = all THEN
          active_volumes = $active_set_members(set)
          criterion = 'active '
        ELSEIF volumes = available_volumes THEN
          active_volumes = $select($active_set_members(set), x.volume_available)
          criterion = 'available '
        ELSE "volumes=unavailable_volumes"
          active_volumes = $select($active_set_members(set), (NOT x.volume_available))
          criterion = 'unavailable '
        IFEND
      ELSE
        FOR EACH volume IN volumes DO
          active_volumes = $join($select($active_set_members(set) x.recorded_vsn=volume), active_volumes)
        FOREND
        criterion = 'active '
        displaying_by_set = false
      IFEND

      displayed_volumes = $intersection(active_volumes, $active_set_members(set))
      IF $nil(displayed_volumes) THEN
        IF displaying_by_set THEN
COLLECT_TEXT output=out.$eoi sm='?'

 SET: ?$string(set)? has no ?criterion?volumes.

**
          relevant_line_displayed = true
        IFEND
      ELSE
        IF displaying_by_set THEN
COLLECT_TEXT output=out.$eoi sm='?'

 SET: ?$string(set)? has ?$size(displayed_volumes)? ?criterion?volume(s).

   VSN    Element Name                     Type         Relevant Classes

**
        ELSE
COLLECT_TEXT output=out.$eoi sm='?'

  SET: ?$string(set)? has the following ?criterion?volume(s).

   VSN    Element Name                     Type         Relevant Classes

**
        IFEND
        FOR EACH vsn IN $sort(displayed_volumes, x1.recorded_vsn<=x2.recorded_vsn) DO
          local_rvsn = $string(vsn.recorded_vsn)
          line = '   ' // local_rvsn // ' ' // vsn.element_name
          line = line(1, 42) // $element(vsn.element_name element_identification)
          j = 56
          FOR k =1 TO $size(displayed_classes) DO
            IF NOT $nil($select(classes(k) x.recorded_vsn=vsn.recorded_vsn)) THEN
              line = line(1, j)//displayed_classes(k)
              relevant_line_displayed = true
            IFEND
            j = j+2
          FOREND
          put_line $trim(line, ' ', trailing) o=out.$eoi
        FOREND
      IFEND
      delete_variable (active_volumes, criterion, displayed_volumes, local_rvsn) status=ignore_status
    FOREND
    IF relevant_line_displayed THEN
      copy_file i=out o=output status=copf_status
    IFEND
    delete_file out status=ignore_status
    EXIT procedure WHEN ((NOT relevant_line_displayed) OR (NOT copf_status.normal)) with $status(false, ..
          'US', 999, ..
          ' No volumes match the criteria defined by the RELEVANT_CLASSES, SETS, and VOLUMES parameters.')
  QUIT


PROCEND display_active_volumes
