
  PROCEDURE [INLINE] pfi$store_file_media_descriptor
    (    p_fmd: {input^} ^SEQ ( * );
         p_catalog_file: {i^/o^} ^pft$catalog_file;
         p_cycle: {i^/o^} pft$p_cycle;
         replace_existing_rem_media_fmd: boolean;
     VAR status: ost$status);

?? PUSH (LISTEXT := ON) ??
?? RIGHT := 110 ??

    VAR
      new_stored_fmd: boolean,
      p_new_stored_fmd: pft$p_physical_fmd,
      p_old_stored_fmd: pft$p_physical_fmd;

    status.normal := TRUE;

    pfp$build_fmd_pointer (p_cycle^.cycle_entry.fmd_locator, p_catalog_file, p_old_stored_fmd);
    IF (p_old_stored_fmd = NIL) OR (replace_existing_rem_media_fmd AND
          (#SIZE (p_fmd^) <> #SIZE (p_old_stored_fmd^.fmd))) THEN
      ALLOCATE p_new_stored_fmd: [[REP (#SIZE (p_fmd^)) OF cell]] IN p_catalog_file^.catalog_heap;
      IF p_new_stored_fmd = NIL THEN
        new_stored_fmd := FALSE;
        osp$set_status_condition (pfe$catalog_full, status);
      ELSE
        p_new_stored_fmd^.fmd := p_fmd^;
        pfp$compute_checksum (#LOC (p_fmd^), #SIZE (p_fmd^), p_new_stored_fmd^.checksum);
        new_stored_fmd := TRUE;
      IFEND;
    ELSEIF replace_existing_rem_media_fmd THEN
      p_old_stored_fmd^.fmd := p_fmd^;
      pfp$compute_checksum (#LOC (p_fmd^), #SIZE (p_fmd^), p_old_stored_fmd^.checksum);
      new_stored_fmd := FALSE;
    ELSE
      osp$set_status_condition (pfe$duplicate_cycle, status);
    IFEND;

    IF status.normal AND new_stored_fmd THEN
      pfp$build_fmd_locator (p_new_stored_fmd, p_catalog_file, p_cycle^.cycle_entry.fmd_locator);
      pfp$compute_checksum (#LOC (p_cycle^.cycle_entry), #SIZE (pft$cycle_entry), p_cycle^.checksum);
      IF p_old_stored_fmd <> NIL THEN
        FREE p_old_stored_fmd IN p_catalog_file^.catalog_heap;
      IFEND;
    IFEND;

  PROCEND pfi$store_file_media_descriptor;

*copyc pft$catalog_file
*copyc pft$p_cycle
*copyc pft$p_physical_fmd
*copyc pfp$build_fmd_locator
*copyc pfp$build_fmd_pointer
*copyc pfp$compute_checksum
?? POP ??
