?? RIGHT := 110 ??
?? NEWTITLE := 'PACKAGE_SOFTWARE Utility: Module RAM$GET_SIF_POINTERS.' ??
MODULE ram$get_sif_pointers;

{ PURPOSE:
{   This module contains a procedures to get the SIF pointers.
{
{ DESIGN:
{   A SIF is passed into this procedure and a record containing the pointers
{   to the sequence descriptor, info header, attributes, and the element list
{   is passed back to the calling routine.
{
{ NOTES:
{
{

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc amt$segment_pointer
*copyc mmt$attribute_keyword
*copyc ost$status
*copyc rac$subproduct_info_level
*copyc rae$package_software_cc
*copyc rat$subproduct_info_pointers
*copyc rat$sequence_descriptor_types
*copyc rat$subproduct_info_p
*copyc rat$subproduct_info_types
?? POP ??
*copyc amp$get_segment_pointer
*copyc osp$append_status_file
*copyc osp$set_status_abnormal

?? TITLE := 'Global Declarations Declared by This Module', EJECT ??

?? TITLE := 'rap$get_sif_pointers [XDCL]', EJECT ??

{ PURPOSE:
{   This procedure gets the SIF sequence pointers.
{
{ DESIGN:
{   A SIF is passed into this procedure and a record containing the pointers
{   to the sequence descriptor, info header, attributes, and the element list
{   is passed back to the calling routine.
{
{ NOTES:
{
{

  PROCEDURE [XDCL] rap$get_sif_pointers
    (    amt_seg_p: amt$segment_pointer;
         mmt_seg_p: mmt$segment_pointer;
         path_ref_p: ^fst$file_reference;
     VAR subproduct_info_pointers: {output} rat$subproduct_info_pointers;
     VAR status: ost$status);


    IF amt_seg_p.sequence_pointer <> NIL THEN
      subproduct_info_pointers.subproduct_info_seq_p := amt_seg_p.sequence_pointer;
    ELSEIF mmt_seg_p.seq_pointer <> NIL THEN
      subproduct_info_pointers.subproduct_info_seq_p := mmt_seg_p.seq_pointer;
    IFEND;

    RESET subproduct_info_pointers.subproduct_info_seq_p;
    NEXT subproduct_info_pointers.sequence_descriptor_p IN subproduct_info_pointers.subproduct_info_seq_p;

    IF (subproduct_info_pointers.sequence_descriptor_p = NIL) OR
          (subproduct_info_pointers.sequence_descriptor_p^.sequence_type <> rac$subproduct_info_sequence) THEN
      osp$set_status_abnormal ('RA', rae$file_is_not_a_sif, '', status);
      osp$append_status_file (osc$status_parameter_delimiter, path_ref_p^, status);
      RETURN;
    IFEND;

    IF subproduct_info_pointers.sequence_descriptor_p^.sequence_level <> rac$subproduct_info_level THEN
      osp$set_status_abnormal ('RA', rae$sif_version_changed, '', status);
      osp$append_status_file (osc$status_parameter_delimiter, path_ref_p^, status);
      RETURN;
    IFEND;

    NEXT subproduct_info_pointers.info_header_p IN subproduct_info_pointers.subproduct_info_seq_p;
    IF subproduct_info_pointers.info_header_p = NIL THEN
      osp$set_status_abnormal ('RA', rae$accessed_beyond_memory_seg, '', status);
      RETURN;
    IFEND;

    subproduct_info_pointers.element_list_p := #PTR (subproduct_info_pointers.info_header_p^.element_list_p,
          subproduct_info_pointers.subproduct_info_seq_p^);

    subproduct_info_pointers.attributes_p := #PTR (subproduct_info_pointers.info_header_p^.attributes_p,
          subproduct_info_pointers.subproduct_info_seq_p^);

    subproduct_info_pointers.path_container_p := #PTR (subproduct_info_pointers.info_header_p^.
          path_container_p, subproduct_info_pointers.subproduct_info_seq_p^);

    subproduct_info_pointers.psrs_answered_p := #PTR (subproduct_info_pointers.info_header_p^.
          psrs_answered_p, subproduct_info_pointers.subproduct_info_seq_p^);

  PROCEND rap$get_sif_pointers;

MODEND ram$get_sif_pointers;
