
  PROCEDURE dmp$get_stored_fmd_subfile_list
    (    p_fmd: {input} ^dmt$stored_fmd;
         total_allocated_length: amt$file_byte_address;
     VAR p_subfile_list: {input/output} ^pft$subfile_list;
     VAR status: ost$status);

?? PUSH (LISTEXT := ON) ??

    VAR
      i: dmt$subfile_index,
      p_fmd_header: ^dmt$stored_ms_fmd_header,
      p_fmd_version: ^dmt$stored_ms_version_number,
      p_stored_fmd: ^dmt$stored_fmd,
      p_stored_subfile: ^dmt$stored_ms_fmd_subfile;

    status.normal := TRUE;

    p_stored_fmd := p_fmd;
    RESET p_stored_fmd;

    NEXT p_fmd_version IN p_stored_fmd;
    IF p_fmd_version = NIL THEN
      osp$set_status_abnormal (dmc$device_manager_ident, dme$fmd_too_small,
            'FMD too small 1 - dmp$get_stored_fmd_subfile_list.', status);
      RETURN;
    IFEND;

    NEXT p_fmd_header: [dmc$current_fmd_version] IN p_stored_fmd;
    IF p_fmd_header = NIL THEN
      osp$set_status_abnormal (dmc$device_manager_ident, dme$fmd_too_small,
            'FMD too small 2 - dmp$get_stored_fmd_subfile_list.', status);
      RETURN;
    IFEND;

    IF (p_subfile_list = NIL) OR (UPPERBOUND (p_subfile_list^) < p_fmd_header^.version_0_0.number_fmds) THEN
      osp$set_status_abnormal (dmc$device_manager_ident, dme$volume_list_too_small,
            'The supplied subfile list is NIL or' CAT ' too small - dmp$get_stored_fmd_subfile_list.',
            status);
      RETURN;
    IFEND;

    FOR i := 1 TO p_fmd_header^.version_0_0.number_fmds DO
      NEXT p_stored_subfile: [dmc$current_fmd_version] IN p_stored_fmd;
      IF p_stored_subfile = NIL THEN
        osp$set_status_abnormal (dmc$device_manager_ident, dme$fmd_too_small,
              'FMD too small 3 - dmp$get_stored_fmd_subfile_list.', status);
        RETURN;
      IFEND;

      p_subfile_list^ [i].recorded_vsn := p_stored_subfile^.version_0_0.recorded_vsn;
      p_subfile_list^ [i].byte_address := p_stored_subfile^.version_0_0.stored_byte_address *
            dmc$byte_address_converter;
    FOREND;

    IF p_fmd_header^.version_0_0.number_fmds = 1 THEN
      p_subfile_list^ [1].allocated_length := total_allocated_length;
      RETURN;
    IFEND;

    FOR i := 2 TO p_fmd_header^.version_0_0.number_fmds DO
      p_subfile_list^ [i - 1].allocated_length := p_subfile_list^ [i].
            byte_address - p_subfile_list^ [i - 1].byte_address;
    FOREND;
    p_subfile_list^ [p_fmd_header^.version_0_0.number_fmds].allocated_length :=
          total_allocated_length - p_subfile_list^ [p_fmd_header^.version_0_0.number_fmds].byte_address;

  PROCEND dmp$get_stored_fmd_subfile_list;

*copyc dmt$error_condition_codes
*copyc dmt$stored_fmd
*copyc dmt$stored_ms_fmd_header
*copyc dmt$subfile_index
*copyc ost$status
*copyc pft$subfile_list
?? POP ??
