PROCEDURE (hidden) pup$construct_volume_list (
  vsn_prefix, vp: any of
      name 1..5
      string 1..5
      integer 0..99999
    anyend = $optional
  vsn_count, vc: integer 1..11881376 = 9
  vsn_suffix, vs: any of
      name 1..5
      string 1..5
      integer 0..99998
    anyend = $optional
  increment_scheme, is: key
      (alphabetic, a)
      (decimal, d)
    keyend = decimal
  volume_list, vl: (VAR) list of string 6 = $required
  status)

  "$FORMAT=OFF
  VAR
    base_digit: integer = $ord('A')
    counter: integer 0 .. 11881376 = 0
    decimal_increment: boolean = (increment_scheme=decimal)
    prefix: string 0..6
    prefix_size: integer 0..6
    suffix: string 0..11
    suffix_size: integer 1..6
  VAREND

  "$FORMAT=ON"

  IF $specified(vsn_prefix) THEN
    prefix=$translate(lower_to_upper, $string(vsn_prefix))
    prefix_size=$size(prefix)
  ELSE
    prefix=''
    prefix_size=0
  IFEND

  suffix_size=6 - prefix_size

  IF decimal_increment THEN
    counter = 1
  IFEND

  IF $specified(vsn_suffix) THEN
    value_type=$generic_type(vsn_suffix)
    IF (value_type = 'INTEGER') AND decimal_increment THEN
      counter=vsn_suffix
      max_counter_value=10 ** (suffix_size)
    ELSEIF ((value_type = 'NAME') OR (value_type = 'STRING')) AND (NOT decimal_increment) THEN
      " Determine numeric equivalent of suffix.
      specified_suffix=$translate(lower_to_upper, $string(vsn_suffix))
      specified_suffix_size=$size(specified_suffix)
      power=1
      FOR i = specified_suffix_size TO 1 BY - 1 DO
        counter=counter + (($ord(specified_suffix(i)) - base_digit)* power)
        power=26 * power
      FOREND
      max_counter_value=26 ** (suffix_size)
    ELSE
      EXIT_PROC WITH $status(false, 'PU', 3330, ' INCREMENT_SCHEME of '//is..
//' is incompatible with type of             vsn_suffix.')
    IFEND
  ELSE
    IF decimal_increment THEN
      max_counter_value=10 ** (suffix_size)
    ELSE
      max_counter_value=26 ** (suffix_size)
    IFEND
  IFEND

  IF (counter + vsn_count)> max_counter_value THEN
    EXIT_PROC WITH $status(false, 'PU', 3330, ..
          'VSN_COUNT too large for specified VSN_SUFFIX.')
  IFEND

"$FORMAT=OFF
VAR
   vsn_array: ARRAY counter .. (counter + vsn_count-1) of string 6
VAREND
"$FORMAT=OFF

  IF decimal_increment THEN
    FOR i = counter TO counter+vsn_count-1 DO
       vsn_array(i) = prefix//$justify(''//i,suffix_size,right,'0')
    FOREND
  ELSE
    FOR i = counter TO counter+vsn_count-1 DO
      value = i
      suffix = ''
      FOR j = 1 TO suffix_size DO
        suffix = $char($mod(value, 26)+base_digit) // suffix
        value = value / 26
      FOREND
      vsn_array(i) = prefix // suffix
    FOREND
  IFEND
  volume_list = vsn_array

PROCEND pup$construct_volume_list
