
  PROCEDURE [INLINE] fmp$locate_pde_via_path_handle (path_handle:
        fmt$path_handle;
    VAR pde: ^fmt$path_description_entry;
    VAR status: ost$status);

    { PURPOSE: This procedure attempts to validate a path_handle and
    {          return a pointer to its path_description_entry.

    IF (path_handle.segment_offset > fmv$highest_pdu_offset)
          OR (path_handle.segment_offset < 0)
          OR (path_handle.assignment_counter > fmv$pde_assignment_counter)
          OR (path_handle.assignment_counter <= 0) THEN
      osp$set_status_condition (fme$invalid_path_handle, status);
      pde := NIL;
      RETURN;
    IFEND;

    pde := #address (#ring(fmv$initial_pdu_pointer),
      #segment(fmv$initial_pdu_pointer),
      path_handle.segment_offset);

    { Validate entry_assignment pointer before dereferencing. }
    IF (pde^.unique_identifier <> fmc$pde_unique_identifier)
       OR (#ring(pde^.entry_assignment) <> #ring(fmv$initial_pdu_pointer))
       OR (#segment(pde^.entry_assignment) <>
       #segment(fmv$initial_pdu_pointer)) THEN
      osp$set_status_condition (fme$invalid_path_handle, status);
      pde := NIL;
      RETURN;
    IFEND;

    IF (pde^.entry_assignment_counter <> path_handle.assignment_counter)
         OR (pde^.entry_assignment^ <> fmc$entry_assigned) THEN
      osp$set_status_condition (fme$obsolete_path_handle, status);
      pde := NIL;
      RETURN;
    IFEND;

  PROCEND fmp$locate_pde_via_path_handle;

?? PUSH (LISTEXT := ON) ??
*copyc fmc$entry_assigned
*copyc fmc$pde_unique_identifier
*copyc fme$file_management_errors
*copyc fmt$path_description_entry
*copyc fmt$path_handle
*copyc osp$set_status_condition
*copyc ost$status
?? POP ??

